Firebase شروع به پشتیبانی از Terraform کرده است. اگر در تیمی هستید که میخواهد ایجاد پروژههای Firebase را با منابع خاص و فعالسازی خدمات بهطور خودکار و استاندارد کند، استفاده از Terraform با Firebase میتواند برای شما مناسب باشد.
گردش کار اصلی برای استفاده از Terraform با Firebase شامل موارد زیر است:
ایجاد و سفارشی کردن یک فایل پیکربندی Terraform (یک فایل .tf ) که زیرساختی را که می خواهید تهیه کنید (یعنی منابعی که می خواهید تهیه کنید و خدماتی که می خواهید فعال کنید) را مشخص می کند.
با استفاده از دستورات gcloud CLI که با Terraform ارتباط برقرار می کند تا زیرساخت مشخص شده در فایل .tf را فراهم کند.
با Terraform و Firebase چه کاری می توانید انجام دهید؟
نمونه گردش کار تعمیم یافته در این راهنما ایجاد یک پروژه Firebase جدید با یک برنامه Android است. اما شما می توانید کارهای بیشتری را با Terraform انجام دهید، مانند:
زیرساخت های موجود را با استفاده از Terraform حذف و اصلاح کنید.
پیکربندی و وظایف خاص محصول را با استفاده از Terraform مدیریت کنید، مانند:
فعال کردن ارائه دهندگان ورود به Firebase Authentication .
ایجاد سطل های Cloud Storage یا نمونه های پایگاه داده و استقرار Firebase Security Rules برای آنها.
میتوانید از فایلها و دستورات پیکربندی استاندارد Terraform برای انجام تمام این وظایف استفاده کنید. و برای کمک به شما در این زمینه، نمونه فایلهای پیکربندی Terraform را برای چندین مورد معمول ارائه کردهایم.
گردش کار تعمیم یافته برای استفاده از Terraform با Firebase
پیش نیازها
این راهنما مقدمه ای برای استفاده از Terraform با Firebase است، بنابراین مهارت اولیه با Terraform را فرض می کند. مطمئن شوید که پیش نیازهای زیر را قبل از شروع این گردش کار تکمیل کرده اید.
Terraform را نصب کنید و با استفاده از آموزش های رسمی Terraform با Terraform آشنا شوید.
اگر از حساب کاربری استفاده می کنید، باید شرایط خدمات Firebase (ToS Firebase) را پذیرفته باشید. اگر میتوانید پروژه Firebase را در کنسول Firebase مشاهده کنید، شرایط Firebase را پذیرفتهاید
برای اینکه Terraform اقدامات خاصی انجام دهد (مثلاً ایجاد پروژه ها)، موارد زیر باید درست باشد:
حساب کاربری یا سرویس باید دسترسی IAM قابل اجرا برای آن اقدامات را داشته باشد.
اگر حساب کاربری یا سرویس بخشی از یک سازمان Google Cloud است، خطمشیهای سازمان باید به حساب اجازه دهد تا این اقدامات را انجام دهد.
مرحله 1: یک فایل پیکربندی Terraform را ایجاد و سفارشی کنید
یک فایل پیکربندی Terraform به دو بخش اصلی نیاز دارد (که در زیر به تفصیل توضیح داده شده است):
بدون توجه به اینکه کدام محصولات یا خدمات Firebase درگیر هستند، راه اندازی provider مورد نیاز است.
یک فایل پیکربندی Terraform (مانند فایل main.tf ) در فهرست محلی خود ایجاد کنید.
در این راهنما، از این فایل پیکربندی برای تعیین تنظیمات provider و تمام زیرساخت هایی که می خواهید Terraform ایجاد کند، استفاده خواهید کرد. با این حال، توجه داشته باشید که گزینه هایی برای نحوه گنجاندن تنظیمات ارائه دهنده دارید.
گزینه های نحوه گنجاندن راه اندازی provider را مشاهده کنید
شما گزینه های زیر را برای نحوه اضافه کردن یک provider به بقیه پیکربندی Terraform خود دارید:
گزینه 1: آن را در بالای یک فایل پیکربندی Terraform .tf قرار دهید (همانطور که در این راهنما نشان داده شده است).
اگر تازه با Terraform شروع کرده اید یا فقط Terraform را با Firebase امتحان می کنید، از این گزینه استفاده کنید.
گزینه 2: آن را در یک فایل .tf جداگانه (مانند یک فایل provider.tf ) قرار دهید، به غیر از فایل .tf که در آن زیرساختی را برای ایجاد مشخص کرده اید (مانند یک فایل main.tf ).
اگر عضو یک تیم بزرگتر هستید که نیاز به استانداردسازی راه اندازی دارند، از این گزینه استفاده کنید.
هنگام اجرای دستورات Terraform، هم فایل provider.tf و هم فایل main.tf باید در یک دایرکتوری باشند.
تنظیمات provider زیر را در بالای فایل main.tf قرار دهید.
شما باید از ارائه دهنده google-beta استفاده کنید زیرا این نسخه بتا استفاده از Firebase با Terraform است. هنگام استفاده در تولید احتیاط کنید.
# Terraform configuration to set up providers by version.terraform{required_providers{google-beta={source="hashicorp/google-beta"version="~> 6.0"}}}# Configures the provider to use the resource block's specified project for quota checks.provider"google-beta"{user_project_override=true}# Configures the provider to not use the resource block's specified project for quota checks.# This provider should only be used during project creation and initializing services.provider"google-beta"{alias="no_user_project_override"user_project_override=false}
هنگام استفاده از Terraform با Firebase، درباره انواع مختلف ویژگیهای مرتبط با پروژه (از جمله آنچه که این راهنما «پروژه بررسی سهمیه» مینامد) بیشتر بیاموزید.
برای تکمیل فایل کانفیگ خود به بخش بعدی بروید و مشخص کنید چه زیرساختی ایجاد شود.
مشخص کنید چه زیرساختی با استفاده از بلوک های resource ایجاد شود
در فایل پیکربندی Terraform (برای این راهنما، فایل main.tf شما)، باید تمام زیرساخت هایی را که می خواهید Terraform ایجاد کند، مشخص کنید (یعنی تمام منابعی که می خواهید ارائه کنید و همه سرویس هایی که می خواهید فعال کنید). در این راهنما، فهرست کاملی از تمام منابع Firebase را که از Terraform پشتیبانی میکنند ، بیابید.
فایل main.tf خود را باز کنید.
در تنظیمات provider ، پیکربندی زیر را از بلوک های resource وارد کنید.
این مثال اولیه یک پروژه Firebase جدید ایجاد می کند و سپس یک برنامه Android Firebase را در آن پروژه ایجاد می کند.
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{provider=google-beta.no_user_project_overridename="Project Display Name"project_id="project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""default"{provider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""default"{provider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app"package_name="awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
یک نسخه بسیار حاشیه نویسی شده از این نمونه فایل پیکربندی را مشاهده کنید
اگر با زیرساخت پروژه ها و برنامه ها به عنوان منابع آشنا نیستید، اسناد زیر را بررسی کنید:
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{ # Use the provider that enables the setup of quota checks for a new projectprovider=google-beta.no_user_project_overridename="Project Display Name" // learn more about the project nameproject_id="project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled" // learn more about the Firebase-enabled label}}# Enables required APIs.resource"google_project_service""default"{ # Use the provider without quota checks for enabling APISprovider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.# This action essentially "creates a Firebase project" and allows the project to use# Firebase services (like Firebase Authentication) and# Firebase tooling (like the Firebase console).# Learn more about the relationship between Firebase projects and Google Cloud.resource"google_firebase_project""default"{ # Use the provider that performs quota checks from now onprovider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.# Learn more about the relationship between Firebase Apps and Firebase projects.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app" # learn more about an app's display namepackage_name="awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
مرحله 2: دستورات Terraform را برای ایجاد زیرساخت مشخص شده اجرا کنید
برای تهیه منابع و فعال کردن خدمات مشخص شده در فایل main.tf ، دستورات زیر را از همان دایرکتوری فایل main.tf خود اجرا کنید. برای اطلاعات دقیق در مورد این دستورات، به مستندات Terraform مراجعه کنید.
اگر این اولین باری است که دستورات Terraform را در دایرکتوری اجرا می کنید، باید دایرکتوری پیکربندی را مقداردهی اولیه کنید و ارائه دهنده Google Terraform را نصب کنید. این کار را با اجرای دستور زیر انجام دهید:
terraform init
زیرساخت مشخص شده در فایل main.tf خود را با اجرای دستور زیر ایجاد کنید:
terraform apply
تأیید کنید که همه چیز مطابق انتظار ارائه یا فعال شده است:
گزینه 1: پیکربندی چاپ شده در ترمینال خود را با اجرای دستور زیر مشاهده کنید:
terraform show
گزینه 2: پروژه Firebase خود را در کنسول Firebase مشاهده کنید.
منابع Firebase با پشتیبانی Terraform
منابع Firebase و Google زیر دارای پشتیبانی Terraform هستند. و ما همیشه منابع بیشتری را اضافه می کنیم! بنابراین اگر منبعی را که میخواهید با Terraform مدیریت کنید نمیبینید، به زودی دوباره بررسی کنید تا ببینید آیا در دسترس است یا با ثبت مشکل در مخزن GitHub آن را درخواست کنید.
google_identity_platform_config — Google Cloud Identity Platform (GCIP) را فعال کنید (که پشتیبان Firebase Authentication است) و تنظیمات احراز هویت در سطح پروژه را ارائه دهید
پروژهای که در آن Terraform Firebase Authentication فعال میکند باید در طرح قیمتگذاری Blaze باشد (یعنی پروژه باید یک حساب Cloud Billing مرتبط داشته باشد). می توانید این کار را به صورت برنامه نویسی با تنظیم ویژگی billing_account در منبع google_project انجام دهید.
این منبع همچنین پیکربندیهای بیشتری را فعال میکند، مانند روشهای ورود به سیستم محلی، مانند تأیید هویت ناشناس، ایمیل/رمز عبور، و احراز هویت تلفن، و همچنین مسدود کردن توابع و دامنههای مجاز.
استقرار Firebase Realtime Database Security Rules از طریق Terraform (با نحوه استقرار این Rules با استفاده از ابزارهای دیگر، از جمله گزینه های برنامه نویسی آشنا شوید)
نمونه فایل های پیکربندی Terraform برای موارد استفاده رایج
Firebase Authentication با GCIP تنظیم کنید
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، پروژه را با یک حساب Cloud Billing مرتبط میکند (طرح قیمتگذاری Blaze برای Firebase Authentication با GCIP مورد نیاز است)، خدمات Firebase را برای پروژه فعال میکند، Firebase Authentication با GCIP تنظیم میکند و سه نوع برنامه مختلف را در پروژه ثبت میکند.
توجه داشته باشید که فعال کردن GCIP برای راهاندازی Firebase Authentication از طریق Terraform لازم است.
# Creates a new Google Cloud project.resource"google_project""auth"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""auth"{provider=google-beta.no_user_project_overrideproject=google_project.auth.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","identitytoolkit.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""auth"{provider=google-betaproject=google_project.auth.project_iddepends_on=[google_project_service.auth,]}# Creates an Identity Platform config.# Also enables Firebase Authentication with Identity Platform in the project if not.resource"google_identity_platform_config""auth"{provider=google-betaproject=google_firebase_project.auth.project # Auto-deletes anonymous usersautodelete_anonymous_users=true # Configures local sign-in methods, like anonymous, email/password, and phone authentication.sign_in{allow_duplicate_emails=trueanonymous{enabled=true}email{enabled=truepassword_required=false}phone_number{enabled=truetest_phone_numbers={"+11231231234"="000000"}}} # Sets an SMS region policy.sms_region_config{allowlist_only{allowed_regions=["US","CA",]}} # Configures blocking functions.blocking_functions{triggers{event_type="beforeSignIn"function_uri="https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in"}forward_inbound_credentials{refresh_token=trueaccess_token=trueid_token=true}} # Configures a temporary quota for new signups for anonymous, email/password, and phone number.quota{sign_up_quota_config{quota=1000start_time=""quota_duration="7200s"}} # Configures authorized domains.authorized_domains=["localhost","${google_project.auth.project_id}.firebaseapp.com","${google_project.auth.project_id}.web.app",]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Web app"}
ارائه سرویس Firebase Data Connect
این پیکربندی یک پروژه جدید Google Cloud ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند و یک سرویس Data Connect ارائه میکند.
# Creates a new Google Cloud project.resource"google_project""dataconnect"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Data Connect).billing_account="000000-000000-000000" # Required for the project to display in a list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.dataconnect.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedataconnect.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""dataconnect"{provider=google-betaproject=google_project.dataconnect.project_iddepends_on=[google_project_service.services]}# Create a Firebase Data Connect serviceresource"google_firebase_data_connect_service""dataconnect-default"{project=google_firebase_project.dataconnect.projectlocation="name-of-region-for-service"service_id="${google_firebase_project.dataconnect.project}-default-fdc"deletion_policy="DEFAULT"}
نمونه پیش فرض Firebase Realtime Database را ارائه کنید
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند، نمونه پیشفرض Realtime Database پروژه را ارائه میکند و سه نوع برنامه مختلف را در پروژه ثبت میکند.
# Creates a new Google Cloud project.resource"google_project""rtdb"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""rtdb"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb"{provider=google-betaproject=google_project.rtdb.project_iddepends_on=[google_project_service.rtdb]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Web app"}
ارائه چندین نمونه Firebase Realtime Database
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، پروژه را با یک حساب Cloud Billing مرتبط میکند (طرح قیمتگذاری Blaze برای چندین نمونه Realtime Database مورد نیاز است)، خدمات Firebase را برای پروژه فعال میکند، چندین نمونه Realtime Database (شامل نمونه Realtime Database پروژه پیشفرض) را ارائه میکند و سه نوع پروژه مختلف برنامه را با پروژه ثبت میکند.
# Creates a new Google Cloud project.resource"google_project""rtdb-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""rtdb-multi"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb-multi"{provider=google-betaproject=google_project.rtdb-multi.project_iddepends_on=[google_project_service.rtdb-multi]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb-multi.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Provisions an additional Realtime Database instance.resource"google_firebase_database_instance""database-additional"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance.region="name-of-region" # This value will become the first segment of the database's URL.instance_id="name-of-additional-database-instance"type="USER_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Web app"}
نمونه پیشفرض Cloud Firestore را ارائه کنید
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند، نمونه پیشفرض Cloud Firestore پروژه را ارائه میکند و سه نوع برنامه مختلف را در پروژه ثبت میکند.
همچنین Firebase Security Rules برای نمونه پیشفرض Cloud Firestore ارائه میکند، یک فهرست Cloud Firestore ایجاد میکند و یک سند Cloud Firestore با دادههای اولیه اضافه میکند.
# Creates a new Google Cloud project.resource"google_project""firestore"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""firestore"{provider=google-beta.no_user_project_overrideproject=google_project.firestore.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firestore.googleapis.com","firebaserules.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""firestore"{provider=google-betaproject=google_project.firestore.project_iddepends_on=[google_project_service.firestore]}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectname="(default)" # See available locations: https://firebase.google.com/docs/firestore/locationslocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a ruleset of Firestore Security Rules from a local file.resource"google_firebaserules_ruleset""firestore"{provider=google-betaproject=google_firestore_database.firestore.projectsource{files{name="firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-startedcontent=file("firestore.rules")}}}# Releases the ruleset for the Firestore instance.resource"google_firebaserules_release""firestore"{provider=google-betaname="cloud.firestore" # must be cloud.firestoreruleset_name=google_firebaserules_ruleset.firestore.nameproject=google_firestore_database.firestore.project}# Adds a new Firestore index.resource"google_firestore_index""indexes"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"query_scope="COLLECTION"fields{field_path="question"order="ASCENDING"}fields{field_path="answer"order="ASCENDING"}}# Adds a new Firestore document with seed data.# Don't use real end-user or production data in this seed document.resource"google_firestore_document""doc"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"document_id="question-1"fields="{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Web app"}
این مجموعه قوانین Cloud Firestore Security Rules است که باید در یک فایل محلی به نام firestore.rules باشد.
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، پروژه را با یک حساب Cloud Billing مرتبط میکند (طرح قیمتگذاری Blaze برای سطلهای اضافی مورد نیاز است)، خدمات Firebase را برای پروژه فعال میکند، سطلهای اضافی و غیر پیشفرض Cloud Storage ارائه میکند و سه نوع برنامه مختلف را در پروژه ثبت میکند.
همچنین Firebase Security Rules برای هر سطل Cloud Storage ارائه میکند و یک فایل را در یکی از سطلهای Cloud Storage آپلود میکند.
# Creates a new Google Cloud project.resource"google_project""storage-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""storage-multi"{provider=google-beta.no_user_project_overrideproject=google_project.storage-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebaserules.googleapis.com","firebasestorage.googleapis.com","storage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_iddepends_on=[google_project_service.storage-multi]}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locationslocation="name-of-region-for-bucket"}# Provisions an additional Cloud Storage bucket.resource"google_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the existing Storage bucket.location="name-of-region-for-additional-bucket"}# Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-1.name}# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-2.name}# Creates a ruleset of Firebase Security Rules from a local file.resource"google_firebaserules_ruleset""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectsource{files{ # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-startedname="storage.rules"content=file("storage.rules")}}}# Releases the ruleset to the first Storage bucket.resource"google_firebaserules_release""bucket-1"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-1.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Releases the ruleset to the additional Storage bucket.resource"google_firebaserules_release""bucket-2"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-2.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Uploads a new file to the first Storage bucket.# Do not use real end-user or production data in this file.resource"google_storage_bucket_object""cat-picture-multi"{provider=google-betaname="cat.png"source="path/to/cat.png"bucket=google_storage_bucket.bucket-1.name}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Web app"}
این مجموعه Cloud Storage Security Rules است که باید در یک فایل محلی به نام storage.rules باشد.
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند، و Firebase App Check را برای Cloud Firestore تنظیم و فعال میکند تا فقط از برنامه Android شما قابل دسترسی باشد.
# Creates a new Google Cloud project.resource"google_project""appcheck"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.appcheck.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseappcheck.googleapis.com","firestore.googleapis.com","serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""appcheck"{provider=google-betaproject=google_project.appcheck.project_iddepends_on=[google_project_service.services]}# Provisions the Firestore database instance.resource"google_firestore_database""database"{provider=google-betaproject=google_firebase_project.appcheck.projectname="(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-locationlocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectdisplay_name="Play Integrity app"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Register the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectapp_id=google_firebase_android_app.appcheck.app_iddepends_on=[google_firestore_database.database]lifecycle{precondition{condition=length(google_firebase_android_app.appcheck.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}}# Enable enforcement of App Check for Firestoreresource"google_firebase_app_check_service_config""firestore"{provider=google-betaproject=google_firebase_project.appcheck.projectservice_id="firestore.googleapis.com"depends_on=[google_project_service.services]}
یک نمونه از Firebase Extension را نصب کنید
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند و نمونه جدیدی از یک Firebase Extension را در پروژه نصب میکند. اگر نمونه از قبل وجود داشته باشد، پارامترهای آن بر اساس مقادیر ارائه شده در پیکربندی به روز می شوند.
# Creates a new Google Cloud project.resource"google_project""extensions"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""extensions"{provider=google-beta.no_user_project_overrideproject=google_project.extensions.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firebase.googleapis.com","firebaseextensions.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""extensions"{provider=google-betaproject=google_project.extensions.project_iddepends_on=[google_project_service.extensions,]}# Installs an instance of the "Translate Text in Firestore" extension.# Or updates the extension if the specified instance already exists.resource"google_firebase_extensions_instance""translation"{provider=google-betaproject=google_firebase_project.extensions.projectinstance_id="translate-text-in-firestore"config{extension_ref="firebase/firestore-translate-text"params={COLLECTION_PATH="posts/comments/translations"DO_BACKFILL=trueLANGUAGES="ar,en,es,de,fr"INPUT_FIELD_NAME="input"LANGUAGES_FIELD_NAME="languages"OUTPUT_FIELD_NAME="translated"}system_params={"firebaseextensions.v1beta.function/location"="us-central1""firebaseextensions.v1beta.function/memory"="256""firebaseextensions.v1beta.function/minInstances"="0""firebaseextensions.v1beta.function/vpcConnectorEgressSettings"="VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"}}}
Vertex AI را در Firebase فعال و محافظت کنید
این پیکربندی یک پروژه جدید Google Cloud ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند، از جمله Vertex AI در Firebase، و اجرای Firebase App Check برای Vertex AI را در Firebase تنظیم و فعال میکند تا فقط از برنامههای شما قابل دسترسی باشد.
# Creates a new Google Cloud project.resource"google_project""vertex"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for Vertex AI in Firebase).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.vertex.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase"aiplatform.googleapis.com","firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse"firebaseappcheck.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""vertex"{provider=google-betaproject=google_project.vertex.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Web App"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Android App"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Creates a Firebase Apple App in the new project created earlier.resource"google_firebase_apple_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Apple App"bundle_id="bundle.id"team_id="1234567890"}### Protects Vertex AI in Firebase with App Check.# Turns on enforcement for Vertex AI in Firebaseresource"google_firebase_app_check_service_config""vertex"{provider=google-betaproject=google_firebase_project.vertex.projectservice_id="firebaseml.googleapis.com"enforcement_mode="ENFORCED"}# Enables the reCAPTCHA Enterprise APIresource"google_project_service""recaptcha_enterprise"{provider=google-betaproject=google_firebase_project.vertex.projectservice="recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables the Play Integrity APIresource"google_project_service""play_integrity"{provider=google-betaproject=google_firebase_project.vertex.projectservice="playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Allows the web app to use reCAPTCHA Enterprise with App Checkresource"google_firebase_app_check_recaptcha_enterprise_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_web_app.app.app_idsite_key="your site key"token_ttl="7200s" # Optionaldepends_on=[google_project_service.recaptcha_enterprise]}# Registers the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_android_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=length(google_firebase_android_app.app.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}depends_on=[google_project_service.play_integrity]}# Registers the Apple app with the AppAttest providerresource"google_firebase_app_check_app_attest_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_apple_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=google_firebase_apple_app.app.team_id!=""error_message="Provide a Team ID on the Apple App to use App Check"}}}
عیب یابی و سوالات متداول
میخواهید درباره همه ویژگیهای مختلف مرتبط با پروژه (مانند project و user_project_override ) اطلاعات بیشتری کسب کنید.
این راهنما هنگام کار با "پروژه ها" از ویژگی های Terraform زیر استفاده می کند.
project در یک بلوک resource
توصیه می شود: در صورت امکان، ویژگی project را در هر بلوک resource قرار دهید
Terraform با گنجاندن ویژگی پروژه، زیرساخت مشخص شده در بلوک منبع را در پروژه مشخص شده ایجاد می کند. این راهنما و فایلهای پیکربندی نمونه ما همگی از این روش استفاده میکنند.
برای تهیه بیشتر منابع، باید از user_project_override = true استفاده کنید، که به معنای بررسی سهمیه در برابر پروژه Firebase خودتان است. با این حال، برای تنظیم پروژه جدید خود به گونهای که بتواند بررسی سهمیه را بپذیرد، ابتدا باید از user_project_override = false استفاده کنید.
شما این خطا را دریافت می کنید: generic::permission_denied: Firebase Tos Not Accepted .
اطمینان حاصل کنید که حساب کاربری که برای اجرای دستورات gcloud CLI استفاده میکنید، شرایط سرویس Firebase (Firebase ToS) را پذیرفته است.
میتوانید این بررسی را با استفاده از مرورگری که به حساب کاربری وارد شدهاید و تلاش برای مشاهده پروژه Firebase موجود در کنسول Firebase انجام دهید. اگر می توانید یک پروژه Firebase موجود را مشاهده کنید، پس حساب کاربری شرایط Firebase را پذیرفته است.
اگر نمیتوانید پروژه Firebase موجود را مشاهده کنید، احتمالاً حساب کاربری Firebase ToS را نپذیرفته است. برای رفع این مشکل، یک پروژه Firebase جدید از طریق کنسول Firebase ایجاد کنید و Firebase ToS را به عنوان بخشی از ایجاد پروژه بپذیرید. شما می توانید بلافاصله این پروژه را از طریق تنظیمات پروژه در کنسول حذف کنید.
پس از اجرای terraform apply ، با این خطا مواجه می شوید: generic::permission_denied: IAM authority does not have the permission .
چند دقیقه صبر کنید، و سپس اجرای terraform apply دوباره امتحان کنید.
ایجاد یک منبع ناموفق بود، اما وقتی terraform apply دوباره اجرا میکنید، میگوید ALREADY_EXISTS .
این می تواند به دلیل تاخیر در انتشار در سیستم های مختلف باشد. سعی کنید این مشکل را با وارد کردن منبع به حالت Terraform با اجرای terraform import حل کنید. سپس دوباره اجرای terraform apply امتحان کنید.
هنگام کار با Cloud Firestore ، این خطا را دریافت می کنید: Error creating Index: googleapi: Error 409;...Concurrent access -- try again
همانطور که خطا نشان می دهد، Terraform ممکن است در تلاش برای ارائه چندین شاخص و/یا ایجاد یک سند به طور همزمان باشد و با یک خطای همزمانی مواجه شود. دوباره اجرای terraform apply امتحان کنید.
شما این خطا را دریافت می کنید: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and billing purposes"
این خطا به این معنی است که Terraform نمیداند کدام پروژه باید سهمیه را بررسی کند. برای عیب یابی، موارد زیر را در بلوک resource بررسی کنید:
مطمئن شوید که مقداری برای ویژگی project مشخص کرده اید.
مطمئن شوید که از ارائه دهنده با user_project_override = true (بدون نام مستعار) استفاده می کنید که در نمونه های Firebase google-beta است.
هنگام ایجاد یک پروژه جدید Google Cloud ، با این خطا مواجه می شوید که شناسه پروژه مشخص شده برای پروژه جدید از قبل وجود دارد.
در اینجا دلایل احتمالی ممکن است ID پروژه وجود داشته باشد:
پروژه مرتبط با آن شناسه متعلق به شخص دیگری است.
برای حل: شناسه پروژه دیگری را انتخاب کنید.
پروژه مرتبط با آن شناسه اخیراً حذف شده است (در حالت حذف نرم).
برای حل: اگر فکر می کنید که پروژه مرتبط با ID متعلق به شماست، با استفاده از projects.get REST API وضعیت پروژه را بررسی کنید.
پروژه مرتبط با آن شناسه به درستی تحت کاربر فعلی وجود دارد. یک دلیل احتمالی برای خطا میتواند این باشد که یک terraform apply قطع شده است.
برای حل: دستورات زیر را اجرا کنید: terraform import google_project.default PROJECT_ID و سپس terraform import google_firebase_project.default PROJECT_ID
چرا باید نمونه پیشفرض Cloud Firestore را قبل از سطل پیشفرض Cloud Storage تهیه کنید؟
اگر قبل از اینکه بخواهید نمونه پیشفرض Cloud Cloud Firestore خود را تهیه کنید، سطل Cloud Storage ابری پیشفرض خود را (از طریق google_app_engine_application ) تهیه کردهاید، خواهید دید که نمونه پیشفرض Cloud Firestore شما قبلاً ارائه شده است. توجه داشته باشید که نمونه پایگاه داده ارائه شده در حالت Datastore است، به این معنی که برای Firebase SDK، احراز هویت یا Firebase Security Rules قابل دسترسی نیست . اگر میخواهید از Cloud Firestore با این سرویسهای Firebase استفاده کنید، باید پایگاه داده را خالی کنید و سپس نوع پایگاه داده آن را در کنسول Google Cloud تغییر دهید.
وقتی سعی میکنید Cloud Storage (از طریق google_app_engine_application ) و سپس نمونه پیشفرض Cloud Firestore خود را فراهم کنید، با این خطا مواجه میشوید: Error: Error creating Database: googleapi: Error 409: Database already exists. Please use another database_id .
وقتی سطل Cloud Storage پیشفرض پروژه (از طریق google_app_engine_application ) را ارائه میکنید و پروژه هنوز نمونه پیشفرض Cloud Firestore خود را ندارد، google_app_engine_application بهطور خودکار نمونه پیشفرض Cloud Firestore پروژه را ارائه میکند.
بنابراین، از آنجایی که نمونه پیشفرض Cloud Firestore پروژه شما قبلاً ارائه شده است، اگر بخواهید دوباره آن نمونه پیشفرض را به صراحت ارائه کنید، google_firestore_database با خطا مواجه میشود.
هنگامی که نمونه پیشفرض Cloud Firestore پروژه فراهم شد، نمیتوانید آن را مجدداً تهیه کنید یا مکان آن را تغییر دهید. توجه داشته باشید که نمونه پایگاه داده ارائه شده در حالت Datastore است، به این معنی که برای Firebase SDK، احراز هویت یا Firebase Security Rules قابل دسترسی نیست . اگر میخواهید از Cloud Firestore با این سرویسهای Firebase استفاده کنید، باید پایگاه داده را خالی کنید و سپس نوع پایگاه داده آن را در کنسول Google Cloud تغییر دهید.