فایربیس (Firebase) شروع به پشتیبانی از Terraform کرده است. اگر در تیمی هستید که میخواهید ایجاد پروژههای فایربیس را با منابع مشخص و سرویسهای فعال، خودکار و استانداردسازی کنید، استفاده از Terraform با فایربیس میتواند برای شما مناسب باشد.
گردش کار اساسی برای استفاده از Terraform با Firebase شامل موارد زیر است:
ایجاد و سفارشیسازی یک فایل پیکربندی Terraform (یک فایل
.tf) که زیرساختی را که میخواهید فراهم کنید (یعنی منابعی که میخواهید فراهم کنید و سرویسهایی که میخواهید فعال کنید) مشخص میکند.استفاده از دستورات gcloud CLI که با Terraform برای تأمین زیرساخت مشخص شده در فایل
.tfرابط کاربری دارند.
با Terraform و Firebase چه کارهایی میتوان انجام داد؟
نمونه گردش کار عمومی در این راهنما ، ایجاد یک پروژه جدید Firebase با یک برنامه اندروید است. اما میتوانید کارهای بیشتری با Terraform انجام دهید، مانند:
حذف و اصلاح زیرساختهای موجود با استفاده از Terraform
مدیریت پیکربندی و وظایف خاص محصول با استفاده از Terraform، مانند:
- فعال کردن ارائه دهندگان ورود به سیستم Firebase Authentication .
- ایجاد سطلهای Cloud Storage یا نمونههای پایگاه داده و استقرار Firebase Security Rules برای آنها.
- ایجاد بکاندها، بیلدها و سایر منابع مرتبط Firebase App Hosting .
شما میتوانید از فایلها و دستورات پیکربندی استاندارد Terraform برای انجام همه این وظایف استفاده کنید. و برای کمک به شما در این زمینه، ما نمونههایی از فایلهای پیکربندی Terraform را برای چندین مورد استفاده رایج ارائه کردهایم.
گردش کار عمومی برای استفاده از Terraform با Firebase
پیشنیازها
این راهنما مقدمهای بر استفاده از Terraform با Firebase است، بنابراین فرض بر این است که شما مهارت اولیه با Terraform را دارید. قبل از شروع این گردش کار، مطمئن شوید که پیشنیازهای زیر را تکمیل کردهاید.
Terraform را نصب کنید و با استفاده از آموزشهای رسمی آنها، با Terraform آشنا شوید.
Google Cloud CLI ( gcloud CLI ) را نصب کنید. با استفاده از یک حساب کاربری یا یک حساب سرویس وارد شوید.
- اگر از حساب کاربری استفاده میکنید، باید شرایط خدمات فایربیس (Firebase ToS) را پذیرفته باشید. اگر بتوانید یک پروژه فایربیس را در کنسول Firebase مشاهده کنید، شرایط خدمات فایربیس را پذیرفتهاید.
- برای اینکه Terraform اقدامات خاصی را انجام دهد (مثلاً ایجاد پروژهها)، موارد زیر باید صحیح باشند:
- حساب کاربری یا سرویس باید دسترسی IAM مربوطه را برای آن اقدامات داشته باشد.
- اگر حساب کاربری یا سرویس بخشی از یک سازمان Google Cloud باشد، سیاستهای سازمان باید به آن حساب اجازه انجام آن اقدامات را بدهد.
مرحله ۱: ایجاد و سفارشیسازی یک فایل پیکربندی Terraform
یک فایل پیکربندی Terraform به دو بخش اصلی نیاز دارد (که در زیر به تفصیل شرح داده شدهاند):
- یک بخش تنظیم
providerکه تعیین میکند به کدام منابع Terraform میتوان دسترسی داشت - بخشی از بلوکهای
resourceمنفرد که مشخص میکند چه زیرساختی باید ایجاد شود
provider خود را تنظیم کنید
صرف نظر از اینکه از کدام محصولات یا سرویسهای Firebase استفاده میکنید، راهاندازی یک provider ضروری است.
یک فایل پیکربندی Terraform (مانند فایل
main.tf) در دایرکتوری محلی خود ایجاد کنید.در این راهنما، از این فایل پیکربندی برای مشخص کردن تنظیمات
providerو تمام زیرساختی که میخواهید Terraform ایجاد کند، استفاده خواهید کرد. البته توجه داشته باشید که گزینههایی برای نحوهی گنجاندن تنظیمات ارائهدهنده دارید.شما گزینههای زیر را برای نحوهی افزودن تنظیمات
providerبه بقیهی پیکربندی Terraform خود دارید:گزینه ۱: آن را در بالای یک فایل پیکربندی Terraform
.tfقرار دهید (مطابق آنچه در این راهنما نشان داده شده است).- اگر تازه کار با Terraform را شروع کردهاید یا میخواهید Terraform را با Firebase امتحان کنید، از این گزینه استفاده کنید.
گزینه ۲: آن را در یک فایل
.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 جدید ایجاد میکند و سپس یک برنامه اندروید 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
# 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, ] }
مرحله ۲: اجرای دستورات Terraform برای ایجاد زیرساخت مشخص شده
برای تأمین منابع و فعال کردن سرویسهای مشخص شده در فایل main.tf خود، دستورات زیر را از همان دایرکتوری فایل main.tf خود اجرا کنید. برای اطلاعات دقیق در مورد این دستورات، به مستندات Terraform مراجعه کنید.
اگر این اولین بار است که دستورات Terraform را در دایرکتوری اجرا میکنید، باید دایرکتوری پیکربندی را مقداردهی اولیه کرده و ارائهدهنده Google Terraform را نصب کنید. این کار را با اجرای دستور زیر انجام دهید:
terraform init
با اجرای دستور زیر، زیرساخت مشخص شده در فایل
main.tfخود را ایجاد کنید:terraform apply
تأیید کنید که همه چیز طبق انتظار ارائه یا فعال شده است:
گزینه ۱: با اجرای دستور زیر، پیکربندی چاپ شده در ترمینال خود را مشاهده کنید:
terraform show
گزینه ۲: پروژه Firebase خود را در کنسول Firebase مشاهده کنید.
منابع فایربیس با پشتیبانی از Terraform
منابع فایربیس و گوگل زیر از Terraform پشتیبانی میکنند. و ما دائماً در حال اضافه کردن منابع بیشتر هستیم! بنابراین اگر منبعی را که میخواهید با Terraform مدیریت کنید، نمیبینید، در اسرع وقت دوباره بررسی کنید تا ببینید آیا در دسترس است یا خیر، یا با ثبت مشکل در مخزن گیتهاب، درخواست آن را بدهید.
مدیریت پروژه و برنامه فایربیس
google_firebase_project— سرویسهای Firebase را روی یک پروژه Google Cloud موجود فعال میکنداپلیکیشنهای فایربیس
-
google_firebase_apple_app— ایجاد یا مدیریت یک اپلیکیشن پلتفرمهای اپل فایربیس -
google_firebase_android_app— ایجاد یا مدیریت یک برنامه اندروید Firebase -
google_firebase_web_app— ایجاد یا مدیریت یک برنامه وب Firebase
-
Firebase Authentication
google_identity_platform_config— فعال کردن Google Cloud Identity Platform (GCIP) (که بکاند Firebase Authentication است) و ارائه تنظیمات احراز هویت در سطح پروژهپیکربندی Firebase Authentication از طریق Terraform نیاز به فعال کردن GCIP دارد. برای نحوه تنظیم Firebase Authentication حتماً فایل
.tfنمونه را بررسی کنید.پروژهای که Terraform در آن GCIP و/یا Firebase Authentication فعال میکند، باید در طرح قیمتگذاری Blaze باشد (یعنی، پروژه باید یک حساب Cloud Billing مرتبط داشته باشد). میتوانید این کار را به صورت برنامهنویسی با تنظیم ویژگی
billing_accountدر منبعgoogle_projectانجام دهید.این منبع همچنین پیکربندیهای بیشتری را فعال میکند، مانند روشهای ورود محلی، مانند احراز هویت ناشناس، ایمیل/رمز عبور و تلفن، و همچنین توابع مسدود کردن و دامنههای مجاز.
google_identity_platform_default_supported_idp_config— ارائه دهندگان هویت فدرال مشترک، مانند گوگل، فیسبوک یا اپل را پیکربندی میکندidentity_platform_oauth_idp_config— منابع ارائه دهنده هویت OAuth (IdP) دلخواه را پیکربندی میکندgoogle_identity_platform_inbound_saml_config— پیکربندی ادغامهای SAML
هنوز پشتیبانی نمیشود:
- پیکربندی احراز هویت چند عاملی (MFA) از طریق Terraform
Firebase App Hosting
google_firebase_app_hosting_backend— ایجاد و مدیریت یک backend Firebase App Hosting ، شامل اتصال به مخزن GitHub و شاخه زنده آن برای استقرار مداوم.google_firebase_app_hosting_build— در یک نقطه خاص از کدبیس، تگ مرجع و نقطه زمانی، یک نسخه برای بکاند ایجاد میکند.google_firebase_app_hosting_traffic— راهاندازی یا پیکربندی استقرار مداوم GitHub.
Firebase Data Connect
-
google_firebase_data_connect_service— یک سرویس Data Connect ایجاد میکند
Firebase Realtime Database
-
google_firebase_database_instance— یک نمونه Realtime Database ایجاد میکند
هنوز پشتیبانی نمیشود:
- استقرار Firebase Realtime Database Security Rules از طریق Terraform (یاد بگیرید که چگونه این Security Rules با استفاده از ابزارهای دیگر، از جمله گزینههای برنامهنویسی، مستقر کنید )
Cloud Firestore
google_firestore_database— یک نمونه از Cloud Firestore ایجاد کنیدgoogle_firestore_index— فعال کردن کوئریهای کارآمد برای Cloud Firestoregoogle_firestore_document- یک نمونه Cloud Firestore را با یک سند خاص در یک مجموعه، Seed میکند.مهم: از دادههای واقعی کاربر نهایی یا دادههای مربوط به محصول در این سند اولیه استفاده نکنید.
Cloud Storage for Firebase
google_firebase_storage_bucket- یک مخزن Cloud Storage موجود را برای SDKهای فایربیس، احراز هویت و 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— یک برنامه پلتفرم اپل را با ارائهدهنده App Attest ثبت میکند -
google_firebase_app_check_device_check_config— یک برنامه پلتفرم اپل را با ارائهدهنده DeviceCheck ثبت میکند -
google_firebase_app_check_play_integrity_config— یک برنامه اندروید را با ارائه دهنده Play Integrity ثبت کنید -
google_firebase_app_check_recaptcha_enterprise_config— یک برنامه وب را با ارائه دهنده reCAPTCHA Enterprise ثبت کنید -
google_firebase_app_check_recaptcha_v3_config— یک برنامه وب را با ارائه دهنده reCAPTCHA نسخه ۳ ثبت کنید -
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" } # 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_firebase_project.auth.project # 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", ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_firebase_project.auth.project display_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-beta project = google_firebase_project.auth.project display_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-beta project = google_firebase_project.auth.project display_name = "My Web app" }
این پیکربندی یک پروژه جدید Google Cloud ایجاد میکند، سرویسهای Firebase را برای پروژه فعال میکند و یک سرویس Data Connect را فراهم میکند.
# Creates a new Google Cloud project. resource "google_project" "dataconnect" { 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 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_override project = google_project.dataconnect.project_id for_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-beta project = google_project.dataconnect.project_id depends_on = [google_project_service.services] } # Create a Firebase Data Connect service resource "google_firebase_data_connect_service" "dataconnect-default" { project = google_firebase_project.dataconnect.project location = "name-of-region-for-service" service_id = "${google_firebase_project.dataconnect.project}-default-fdc" deletion_policy = "DEFAULT" }
این پیکربندی یک پروژه جدید 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" } # 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 depends_on = [google_project_service.rtdb] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_firebase_project.rtdb.project # 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" } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_firebase_project.rtdb.project display_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-beta project = google_firebase_project.rtdb.project display_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-beta project = google_firebase_project.rtdb.project display_name = "My Web app" }
این پیکربندی یک پروژه جدید 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" } # 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 depends_on = [google_project_service.rtdb-multi] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_firebase_project.rtdb-multi.project # 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" } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = 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-beta project = google_firebase_project.rtdb-multi.project display_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-beta project = google_firebase_project.rtdb-multi.project display_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-beta project = google_firebase_project.rtdb-multi.project display_name = "My Web app" }
این پیکربندی یک پروژه جدید 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" } # 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 depends_on = [google_project_service.firestore] } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_firebase_project.firestore.project 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" } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_firestore_database.firestore.project 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") } } } # 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_firestore_database.firestore.project } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_firestore_database.firestore.project collection = "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-beta project = google_firestore_database.firestore.project collection = "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-beta project = google_firebase_project.firestore.project display_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-beta project = google_firebase_project.firestore.project display_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-beta project = google_firebase_project.firestore.project display_name = "My Web app" }
این مجموعه قوانین مربوط به Cloud Firestore Security Rules است که باید در یک فایل محلی به نام firestore.rules باشد.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, create, 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" } # 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 depends_on = [google_project_service.storage-multi] } # Provisions a Cloud Storage bucket. resource "google_storage_bucket" "bucket-1" { provider = google-beta project = google_firebase_project.storage-multi.project 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_firebase_project.storage-multi.project 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_firebase_project.storage-multi.project 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_firebase_project.storage-multi.project 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_firebase_project.storage-multi.project 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") } } } # 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_firebase_project.storage-multi.project } # 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_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-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_firebase_project.storage-multi.project display_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-beta project = google_firebase_project.storage-multi.project display_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-beta project = google_firebase_project.storage-multi.project display_name = "My Web app" }
این مجموعه قوانین مربوط به Cloud Storage Security Rules است که باید در یک فایل محلی به نام storage.rules باشد.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /some_folder/{fileName} { allow read, write: if request.auth != null; } } }
این پیکربندی یک پروژه جدید Google Cloud ایجاد میکند، سرویسهای Firebase را برای پروژه فعال میکند و Firebase App Check for Cloud Firestore را راهاندازی و فعال میکند تا فقط از طریق برنامه اندروید شما قابل دسترسی باشد.
# 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" } # 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" } # 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 ] } # 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 = [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" } # 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_firebase_project.extensions.project 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" } } }
این پیکربندی یک پروژه جدید Google Cloud ایجاد میکند، سرویسهای Firebase، از جمله Firebase AI Logic ، را برای پروژه فعال میکند و Firebase App Check را برای Firebase AI Logic تنظیم و فعال میکند تا فقط از برنامههای شما قابل دسترسی باشد.
# Creates a new Google Cloud project. resource "google_project" "vertex" { 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 Vertex AI in Firebase). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.vertex.project_id for_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-beta project = google_project.vertex.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Web App" } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_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-beta project = google_firebase_project.vertex.project display_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 Firebase resource "google_firebase_app_check_service_config" "vertex" { provider = google-beta project = google_firebase_project.vertex.project service_id = "firebaseml.googleapis.com" enforcement_mode = "ENFORCED" } # Enables the reCAPTCHA Enterprise API resource "google_project_service" "recaptcha_enterprise" { provider = google-beta project = google_firebase_project.vertex.project service = "recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables the Play Integrity API resource "google_project_service" "play_integrity" { provider = google-beta project = google_firebase_project.vertex.project service = "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 Check resource "google_firebase_app_check_recaptcha_enterprise_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_web_app.app.app_id site_key = "your site key" token_ttl = "7200s" # Optional depends_on = [google_project_service.recaptcha_enterprise] } # Registers the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_android_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = length(google_firebase_android_app.app.sha256_hashes) > 0 error_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 provider resource "google_firebase_app_check_app_attest_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_apple_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = google_firebase_apple_app.app.team_id != "" error_message = "Provide a Team ID on the Apple App to use App Check" } } }
این پیکربندی نحوهی تأمین دستی یک بکاند App Hosting با استفاده از Terraform را نشان میدهد. این رویکرد به شما کنترل دقیقی بر منابع ایجاد شده میدهد، اما مستلزم آن است که هر منبع را به صورت جداگانه تعریف کنید. این قابلیت زمانی مفید است که نیاز به سفارشیسازی بکاند فراتر از گزینههای پیشفرض داشته باشید.
# Creates a new Google Cloud project. resource "google_project" "apphosting" { 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 App Hosting). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.apphosting.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseapphosting.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" "apphosting" { provider = google-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" service_account = google_service_account.service_account.email } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Creates a Build resource "google_firebase_app_hosting_build" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id build_id = "my-build" source { container { # TODO: use your own image image = "us-docker.pkg.dev/cloudrun/container/hello" } } } # Rolls out the Build resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id target { splits { build = google_firebase_app_hosting_build.example.name percent = 100 } } }
این پیکربندی نحوهی آمادهسازی یک بکاند App Hosting را با استفاده از کد برنامهی ذخیرهشده در مخزن GitHub نشان میدهد. این رویکرد به شما امکان میدهد زیرساخت خود را از طریق درخواستهای pull در GitHub و خطوط لولهی CI/CD مطابق با مدل معمول استقرار App Hosting مدیریت و بهروزرسانی کنید.
# Creates a new Google Cloud project. resource "google_project" "apphosting" { 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 App Hosting). billing_account = "000000-000000-000000" } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.apphosting.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseapphosting.googleapis.com", "serviceusage.googleapis.com", "developerconnect.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" "apphosting" { provider = google-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } ### Setting up Firebase App Hosting ### # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" service_account = google_service_account.service_account.email codebase { repository = google_developer_connect_git_repository_link.my-repository.name root_directory = "/" } } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/developerconnect.readTokenAccessor", "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Configures auto rollout from GitHub resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id rollout_policy { codebase_branch = "main" # Or another branch } } ### ### Setting up a connection to GitHub ### # Provisions Service Agent for Developer Connect resource "google_project_service_identity" "devconnect-p4sa" { provider = google-beta project = google_firebase_project.apphosting.project service = "developerconnect.googleapis.com" } # Adds permission to Developer Connect Service Agent to manager GitHub tokens resource "google_project_iam_member" "devconnect-secret" { provider = google-beta project = google_firebase_project.apphosting.project role = "roles/secretmanager.admin" member = google_project_service_identity.devconnect-p4sa.member } # Connects to a GitHub account resource "google_developer_connect_connection" "my-connection" { provider = google-beta project = google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's location location = "name-of-region-for-service" # Must be `firebase-app-hosting-github-oauth` connection_id = "firebase-app-hosting-github-oauth" github_config { github_app = "FIREBASE" } depends_on = [google_project_iam_member.devconnect-secret] } # Follow the next steps to set up the GitHub connection # Tip: Run terraform refresh to obtain the output output "next_steps" { description = "Follow the action_uri if present to continue setup" value = google_developer_connect_connection.my-connection.installation_state } # Links a GitHub repo to the project resource "google_developer_connect_git_repository_link" "my-repository" { provider = google-beta project = google_firebase_project.apphosting.project location = google_developer_connect_connection.my-connection.location git_repository_link_id = "my-repo-id" parent_connection = google_developer_connect_connection.my-connection.connection_id clone_uri = "https://github.com/myuser/myrepo.git" } ###
عیبیابی و سوالات متداول
این راهنما هنگام کار با «پروژهها» از ویژگیهای Terraform زیر استفاده میکند.
-
projectدرون یک بلوکresource توصیه میشود: در صورت امکان، ویژگی
projectرا در هر بلوکresourceقرار دهیدبا گنجاندن یک ویژگی پروژه، Terraform زیرساخت مشخص شده در بلوک منبع را در پروژه مشخص شده ایجاد میکند. این راهنما و فایلهای پیکربندی نمونه ما همگی از این روش استفاده میکنند.
به مستندات رسمی Terraform در مورد
projectمراجعه کنید.-
user_project_overrideدرون بلوکprovider برای تأمین اکثر منابع، باید
user_project_override = trueاستفاده کنید، که به معنی بررسی سهمیه در برابر پروژه Firebase خودتان است. با این حال، برای تنظیم پروژه جدید خود به طوری که بتواند بررسی سهمیه را بپذیرد، ابتدا بایدuser_project_override = falseاستفاده کنید.برای اطلاعات بیشتر در مورد
user_project_overrideبه مستندات رسمی Terraform مراجعه کنید.
مطمئن شوید که حساب کاربری که برای اجرای دستورات gcloud CLI استفاده میکنید، شرایط خدمات Firebase (Firebase ToS) را پذیرفته باشد.
شما میتوانید این بررسی را با استفاده از مرورگری که به حساب کاربری وارد شده است و تلاش برای مشاهده یک پروژه Firebase موجود در کنسول Firebase انجام دهید. اگر میتوانید یک پروژه Firebase موجود را مشاهده کنید، پس حساب کاربری شرایط خدمات Firebase را پذیرفته است.
اگر نمیتوانید هیچ پروژه Firebase موجود را مشاهده کنید، احتمالاً حساب کاربری، شرایط خدمات Firebase را نپذیرفته است. برای رفع این مشکل، یک پروژه Firebase جدید از طریق کنسول Firebase ایجاد کنید و شرایط خدمات Firebase را به عنوان بخشی از ایجاد پروژه بپذیرید. میتوانید بلافاصله این پروژه را از طریق تنظیمات پروژه در کنسول حذف کنید.
چند دقیقه صبر کنید و سپس دوباره terraform apply اجرا کنید.
این میتواند به دلیل تأخیر انتشار در سیستمهای مختلف باشد. سعی کنید با وارد کردن منبع به حالت Terraform با اجرای terraform import این مشکل را حل کنید. سپس دوباره terraform apply اجرا کنید.
شما میتوانید نحوهی وارد کردن هر منبع را در بخش «وارد کردن» مستندات Terraform آن بیاموزید (برای مثال، مستندات «وارد کردن» برای Cloud Firestore ).
همانطور که از خطا پیداست، ممکن است Terraform در حال تلاش برای ارائه چندین شاخص و/یا ایجاد یک سند به طور همزمان بوده و با خطای همزمانی مواجه شده است. دوباره terraform apply اجرا کنید.
این خطا به این معنی است که Terraform نمیداند سهمیه را در کدام پروژه بررسی کند. برای عیبیابی، موارد زیر را در بلوک resource بررسی کنید:
- مطمئن شوید که برای ویژگی
projectمقداری تعیین کردهاید. - مطمئن شوید که از ارائهدهندهای با
user_project_override = true(بدون نام مستعار) استفاده میکنید، که در نمونههای Firebase،google-betaاست.
دلایل احتمالی وجود شناسه پروژه در حال حاضر عبارتند از:
پروژه مرتبط با آن شناسه متعلق به شخص دیگری است.
- برای حل مشکل: شناسه پروژه دیگری انتخاب کنید.
پروژه مرتبط با آن شناسه اخیراً حذف شده است (در حالت حذف موقت).
- برای حل مشکل: اگر فکر میکنید پروژه مرتبط با این شناسه متعلق به شماست، وضعیت پروژه را با استفاده از
projects.getREST API بررسی کنید.
- برای حل مشکل: اگر فکر میکنید پروژه مرتبط با این شناسه متعلق به شماست، وضعیت پروژه را با استفاده از
پروژه مرتبط با آن شناسه به درستی تحت کاربر فعلی وجود دارد. دلیل احتمالی این خطا میتواند این باشد که
terraform applyقبلی مختل شده است.- برای حل: دستورات زیر را اجرا کنید:
terraform import google_project.default PROJECT_IDو سپس
terraform import google_firebase_project.default PROJECT_ID
- برای حل: دستورات زیر را اجرا کنید:
اگر قبل از تلاش برای تأمین نمونه پیشفرض Cloud Cloud Firestore خود، مخزن Cloud Storage ابری پیشفرض خود را (از طریق google_app_engine_application ) تأمین کردهاید، متوجه خواهید شد که نمونه پیشفرض Cloud Firestore شما قبلاً تأمین شده است. توجه داشته باشید که نمونه پایگاه داده تأمینشده در حالت Datastore است، به این معنی که SDKهای Firebase، احراز هویت یا 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 است، به این معنی که SDKهای Firebase، احراز هویت یا Firebase Security Rules به آن دسترسی ندارند . اگر میخواهید از Cloud Firestore با این سرویسهای Firebase استفاده کنید، باید پایگاه داده را خالی کرده و سپس نوع پایگاه داده آن را در کنسول Google Cloud تغییر دهید.