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 آشنا شوید.
Google Cloud CLI ( gcloud CLI ) را نصب کنید. با استفاده از یک حساب کاربری یا یک حساب سرویس وارد شوید.
- اگر از حساب کاربری استفاده می کنید، باید شرایط خدمات Firebase (ToS Firebase) را پذیرفته باشید. اگر میتوانید پروژه Firebase را در کنسول Firebase مشاهده کنید، شرایط Firebase را پذیرفتهاید
- برای اینکه Terraform اقدامات خاصی انجام دهد (مثلاً ایجاد پروژه ها)، موارد زیر باید درست باشد:
- حساب کاربری یا سرویس باید دسترسی IAM قابل اجرا برای آن اقدامات را داشته باشد.
- اگر حساب کاربری یا سرویس بخشی از یک سازمان Google Cloud است، خطمشیهای سازمان باید به حساب اجازه دهد تا این اقدامات را انجام دهد.
مرحله 1: یک فایل پیکربندی Terraform را ایجاد و سفارشی کنید
یک فایل پیکربندی Terraform به دو بخش اصلی نیاز دارد (که در زیر به تفصیل توضیح داده شده است):
- بخش راه اندازی
provider
که دیکته می کند به کدام منابع Terraform می توان دسترسی داشت - بخشی از بلوک های
resource
فردی که مشخص می کند چه زیرساختی ایجاد شود
provider
خود را تنظیم کنید
بدون توجه به اینکه کدام محصولات یا خدمات Firebase درگیر هستند، راه اندازی provider
مورد نیاز است.
یک فایل پیکربندی Terraform (مانند فایل
main.tf
) در فهرست محلی خود ایجاد کنید.در این راهنما، از این فایل پیکربندی برای تعیین تنظیمات
provider
و تمام زیرساخت هایی که می خواهید Terraform ایجاد کند، استفاده خواهید کرد. با این حال، توجه داشته باشید که گزینه هایی برای نحوه گنجاندن تنظیمات ارائه دهنده دارید.شما گزینه های زیر را برای نحوه اضافه کردن یک
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 = "~> 5.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_override name = "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_override project = google_project.default.project_id for_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-beta project = 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-beta project = google_project.default.project_id display_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, ] }
اگر با زیرساخت پروژه ها و برنامه ها به عنوان منابع آشنا نیستید، اسناد زیر را بررسی کنید:
- پروژه های Firebase را درک کنید
- مستندات مرجع برای مدیریت پروژه 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" { # Use the provider that enables the setup of quota checks for a new project provider = google-beta.no_user_project_override name = "Project Display Name" // learn more about the project name project_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 APIS provider = google-beta.no_user_project_override project = google_project.default.project_id for_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 on provider = google-beta project = 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-beta project = google_project.default.project_id display_name = "My Awesome Android app" # learn more about an app's display name package_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 آن را درخواست کنید.
مدیریت پروژه و برنامه Firebase
google_firebase_project
— خدمات Firebase را در یک پروژه Google Cloud موجود فعال کنیدبرنامه های Firebase
-
google_firebase_apple_app
— ایجاد یا مدیریت یک برنامه پلتفرم Apple Firebase -
google_firebase_android_app
— ایجاد یا مدیریت یک برنامه Android Firebase -
google_firebase_web_app
— ایجاد یا مدیریت یک برنامه وب Firebase
-
Firebase Authentication
google_identity_platform_config
— Google Cloud Identity Platform (GCIP) را فعال کنید (که پشتیبان Firebase Authentication است) و تنظیمات احراز هویت در سطح پروژه را ارائه دهیدپیکربندی Firebase Authentication از طریق Terraform نیاز به فعال کردن GCIP دارد. مطمئن شوید که فایل نمونه
.tf
را برای نحوه تنظیم احراز Firebase Authentication مرور کنید.پروژهای که در آن Terraform Firebase Authentication فعال میکند باید در طرح قیمتگذاری Blaze باشد (یعنی پروژه باید یک حساب Cloud Billing مرتبط داشته باشد). می توانید این کار را به صورت برنامه نویسی با تنظیم ویژگی
billing_account
در منبعgoogle_project
انجام دهید.این منبع همچنین پیکربندیهای بیشتری را فعال میکند، مانند روشهای ورود به سیستم محلی، مانند تأیید هویت ناشناس، ایمیل/رمز عبور، و احراز هویت تلفن، و همچنین مسدود کردن توابع و دامنههای مجاز.
google_identity_platform_default_supported_idp_config
— پیکربندی ارائه دهندگان هویت مشترک فدرال، مانند Google، Facebook، یا Appleidentity_platform_oauth_idp_config
— پیکربندی منابع اختیاری OAuth Identity Provider (IdP)google_identity_platform_inbound_saml_config
— پیکربندی ادغام های SAML
هنوز پشتیبانی نشده است:
- پیکربندی احراز هویت چند عاملی (MFA) از طریق Terraform
Firebase Realtime Database
-
google_firebase_database_instance
— یک نمونه Realtime Database ایجاد کنید
هنوز پشتیبانی نشده است:
- استقرار Firebase Realtime Database Security Rules از طریق Terraform (با نحوه استقرار این Rules با استفاده از ابزارهای دیگر، از جمله گزینه های برنامه نویسی آشنا شوید)
Cloud Firestore
google_firestore_database
- یک نمونه Cloud Firestore ایجاد کنیدgoogle_firestore_index
- پرس و جوهای کارآمد را برای Cloud Firestore فعال کنیدgoogle_firestore_document
- یک نمونه Cloud Firestore با یک سند خاص در یک مجموعه نشان دهیدمهم: از داده های کاربر نهایی یا تولید در این سند اولیه استفاده نکنید.
Cloud Storage for Firebase
google_firebase_storage_bucket
— یک سطل Cloud Storage موجود را برای SDK های Firebase، احراز هویت و Firebase Security Rules قابل دسترس کنیدgoogle_storage_bucket_object
— یک شی را به یک سطل Cloud Storage اضافه کنیدمهم: از داده های کاربر نهایی یا تولید در این فایل استفاده نکنید.
Firebase Security Rules (برای Cloud Firestore و Cloud Storage )
توجه داشته باشید که Firebase Realtime Database از سیستم تدارکات متفاوتی برای Firebase Security Rules خود استفاده می کند.
google_firebaserules_ruleset
— Firebase Security Rules تعریف کنید که برای یک نمونه Cloud Firestore یا یک سطل Cloud Storage اعمال می شودgoogle_firebaserules_release
— استقرار مجموعه قوانین خاص در یک نمونه Cloud Firestore یا یک سطل Cloud Storage
Firebase App Check
-
google_firebase_app_check_service_config
— فعال کردن اجرای App Check برای یک سرویس -
google_firebase_app_check_app_attest_config
— یک برنامه پلتفرم Apple را با ارائه دهنده App Attest ثبت کنید -
google_firebase_app_check_device_check_config
— ثبت یک برنامه پلتفرم Apple با ارائه دهنده DeviceCheck -
google_firebase_app_check_play_integrity_config
— یک برنامه Android را با ارائه دهنده Play Integrity ثبت کنید -
google_firebase_app_check_recaptcha_enterprise_config
— ثبت یک برنامه وب با ارائه دهنده reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
— ثبت یک برنامه وب با ارائه دهنده reCAPTCHA v3 -
google_firebase_app_check_debug_token
- از نشانههای اشکالزدایی برای آزمایش استفاده کنید
Firebase Extensions
-
google_firebase_extensions_instance
— نصب یا بهروزرسانی نمونهای از Firebase Extension
نمونه فایل های پیکربندی Terraform برای موارد استفاده رایج
این پیکربندی یک پروژه 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_override folder_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" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_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-beta project = google_project.auth.project_id depends_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-beta project = google_project.auth.project_id # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_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 = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] }
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند، نمونه پیشفرض Realtime Database پروژه را ارائه میکند و سه نوع برنامه مختلف را در پروژه ثبت میکند.
# Creates a new Google Cloud project. resource "google_project" "rtdb" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb" { provider = google-beta.no_user_project_override project = google_project.rtdb.project_id for_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-beta project = google_project.rtdb.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_project.rtdb.project_id # See available locations: https://firebase.google.com/docs/database/locations region = "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" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] }
این پیکربندی یک پروژه 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_override folder_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" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb-multi" { provider = google-beta.no_user_project_override project = google_project.rtdb-multi.project_id for_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-beta project = google_project.rtdb-multi.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/database/locations region = "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" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_project.rtdb-multi.project_id # 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" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] }
این پیکربندی یک پروژه 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "firestore" { provider = google-beta.no_user_project_override project = google_project.firestore.project_id for_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-beta project = google_project.firestore.project_id } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_project.firestore.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/firestore/locations location_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" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.firestore, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_project.firestore.project_id source { files { name = "firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore, ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore.name project = google_project.firestore.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } # Wait for Firestore to be provisioned before adding this index. depends_on = [ google_firestore_database.firestore, ] } # 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-beta project = google_project.firestore.project_id collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" # Wait for Firestore to be provisioned before adding this document. depends_on = [ google_firestore_database.firestore, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] }
این مجموعه قوانین Cloud Firestore Security Rules است که باید در یک فایل محلی به نام firestore.rules
باشد.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
این پیکربندی یک پروژه 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_override folder_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" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage-multi" { provider = google-beta.no_user_project_override project = google_project.storage-multi.project_id for_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-beta project = google_project.storage-multi.project_id } # Provisions a Cloud Storage bucket. resource "google_storage_bucket" "bucket-1" { provider = google-beta project = google_project.storage-multi.project_id name = "name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations location = "name-of-region-for-bucket" } # Provisions an additional Cloud Storage bucket. resource "google_storage_bucket" "bucket-2" { provider = google-beta project = google_project.storage-multi.project_id name = "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-beta project = google_project.storage-multi.project_id bucket_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-beta project = google_project.storage-multi.project_id bucket_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-beta project = google_project.storage-multi.project_id source { files { # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Storage buckets to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage-multi, ] } # Releases the ruleset to the first Storage bucket. resource "google_firebaserules_release" "bucket-1" { provider = google-beta name = "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_project.storage-multi.project_id } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-2" { provider = google-beta name = "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_project.storage-multi.project_id } # 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-beta name = "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-beta project = google_project.storage-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Web app" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] }
این مجموعه قواعد Cloud Storage Security Rules است که باید در یک فایل محلی به نام storage.rules
باشد.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
این پیکربندی یک پروژه 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # 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_override project = google_project.appcheck.project_id for_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-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_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" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.appcheck, ] } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project display_name = "Play Integrity app" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # It takes a while for App Check to recognize the new app # If your app already exists, you don't have to wait 30 seconds. resource "time_sleep" "wait_30s" { depends_on = [google_firebase_android_app.appcheck] create_duration = "30s" } # Register the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [time_sleep.wait_30s, google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
این پیکربندی یک پروژه Google Cloud جدید ایجاد میکند، خدمات Firebase را برای پروژه فعال میکند و نمونه جدیدی از یک Firebase Extension در پروژه نصب میکند. اگر نمونه از قبل وجود داشته باشد، پارامترهای آن بر اساس مقادیر ارائه شده در پیکربندی به روز می شوند.
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_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" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_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-beta project = google_project.extensions.project_id depends_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-beta project = google_project.extensions.project_id instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "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" } } }
عیب یابی و سوالات متداول
این راهنما هنگام کار با "پروژه ها" از ویژگی های Terraform زیر استفاده می کند.
-
project
در یک بلوکresource
توصیه می شود: در صورت امکان، ویژگی
project
را در هر بلوکresource
قرار دهیدTerraform با گنجاندن یک ویژگی پروژه، زیرساخت مشخص شده در بلوک منبع را در پروژه مشخص شده ایجاد می کند. این راهنما و فایلهای پیکربندی نمونه ما همگی از این روش استفاده میکنند.
مستندات رسمی Terraform در مورد
project
را ببینید.-
user_project_override
در بلوکprovider
برای تهیه بیشتر منابع، باید از
user_project_override = true
استفاده کنید، که به معنای بررسی سهمیه در برابر پروژه Firebase خودتان است. با این حال، برای تنظیم پروژه جدید خود به گونهای که بتواند بررسی سهمیه را بپذیرد، ابتدا باید ازuser_project_override = false
استفاده کنید.به مستندات رسمی Terraform درباره
user_project_override
مراجعه کنید.
مطمئن شوید که حساب کاربری که برای اجرای دستورات gcloud CLI استفاده میکنید، شرایط سرویس Firebase (ToS Firebase) را پذیرفته است.
میتوانید این بررسی را با استفاده از یک مرورگر وارد شده به حساب کاربری و تلاش برای مشاهده پروژه Firebase موجود در کنسول Firebase انجام دهید. اگر می توانید یک پروژه Firebase موجود را مشاهده کنید، پس حساب کاربری شرایط Firebase را پذیرفته است.
اگر نمیتوانید پروژه Firebase موجود را مشاهده کنید، احتمالاً حساب کاربری Firebase ToS را نپذیرفته است. برای رفع این مشکل، یک پروژه Firebase جدید از طریق کنسول Firebase ایجاد کنید و Firebase ToS را به عنوان بخشی از ایجاد پروژه بپذیرید. شما می توانید بلافاصله این پروژه را از طریق تنظیمات پروژه در کنسول حذف کنید.
چند دقیقه صبر کنید، و سپس اجرای terraform apply
را دوباره امتحان کنید.
این می تواند به دلیل تاخیر انتشار در سیستم های مختلف باشد. سعی کنید این مشکل را با وارد کردن منبع به حالت Terraform با اجرای terraform import
حل کنید. سپس دوباره اجرای terraform apply
را امتحان کنید.
میتوانید نحوه وارد کردن هر منبع را در بخش «واردات» مستندات Terraform آن (مثلاً اسناد «وارد کردن» برای Cloud Firestore ) بیاموزید.
همانطور که خطا نشان می دهد، Terraform ممکن است در تلاش برای ارائه چندین شاخص و/یا ایجاد یک سند به طور همزمان باشد و با یک خطای همزمانی مواجه شود. دوباره اجرای terraform apply
امتحان کنید.
این خطا به این معنی است که Terraform نمیداند کدام پروژه باید سهمیه را بررسی کند. برای عیب یابی، موارد زیر را در بلوک resource
بررسی کنید:
- مطمئن شوید که مقداری برای ویژگی
project
مشخص کرده اید. - مطمئن شوید که از ارائه دهنده با
user_project_override = true
(بدون نام مستعار) استفاده می کنید که در نمونه های Firebasegoogle-beta
است.
در اینجا دلایل احتمالی ممکن است ID پروژه وجود داشته باشد:
پروژه مرتبط با آن شناسه متعلق به شخص دیگری است.
- برای حل: شناسه پروژه دیگری را انتخاب کنید.
پروژه مرتبط با آن شناسه اخیراً حذف شده است (در حالت حذف نرم).
- برای حل: اگر فکر میکنید پروژه مرتبط با ID متعلق به شماست، با استفاده از
projects.get
REST API وضعیت پروژه را بررسی کنید.
- برای حل: اگر فکر میکنید پروژه مرتبط با ID متعلق به شماست، با استفاده از
پروژه مرتبط با آن شناسه به درستی تحت کاربر فعلی وجود دارد. یک دلیل احتمالی برای خطا میتواند این باشد که یک
terraform apply
قطع شده است.- برای حل: دستورات زیر را اجرا کنید:
terraform import google_project.default PROJECT_ID
و سپس
terraform import google_firebase_project.default PROJECT_ID
- برای حل: دستورات زیر را اجرا کنید:
اگر قبل از اینکه بخواهید نمونه پیشفرض 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 خود را ندارد، google_app_engine_application
بهطور خودکار نمونه پیشفرض Cloud Firestore پروژه را ارائه میکند.
بنابراین، از آنجایی که نمونه پیشفرض Cloud Firestore پروژه شما قبلاً ارائه شده است، اگر بخواهید دوباره آن نمونه پیشفرض را به صراحت ارائه کنید، google_firestore_database
با خطا مواجه میشود.
هنگامی که نمونه پیشفرض Cloud Firestore پروژه فراهم شد، نمیتوانید آن را مجدداً تهیه کنید یا مکان آن را تغییر دهید. توجه داشته باشید که نمونه پایگاه داده ارائه شده در حالت Datastore است، به این معنی که برای Firebase SDK، احراز هویت یا Firebase Security Rules قابل دسترسی نیست . اگر میخواهید از Cloud Firestore با این سرویسهای Firebase استفاده کنید، باید پایگاه داده را خالی کنید و سپس نوع پایگاه داده آن را در کنسول Google Cloud تغییر دهید.