Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Firebase đang bắt đầu hỗ trợ Terraform.
Nếu bạn đang làm việc trong một nhóm muốn tự động hoá và chuẩn hoá việc tạo dự án Firebase với các tài nguyên cụ thể được cung cấp và các dịch vụ được bật, thì việc sử dụng Terraform với Firebase có thể phù hợp với bạn.
Quy trình làm việc cơ bản để sử dụng Terraform với Firebase bao gồm những bước sau:
Tạo và tuỳ chỉnh tệp cấu hình Terraform (tệp .tf) chỉ định cơ sở hạ tầng mà bạn muốn cung cấp (tức là tài nguyên bạn muốn cung cấp và các dịch vụ bạn muốn bật).
Sử dụng các lệnh gcloud CLI giao tiếp với Terraform để cung cấp cơ sở hạ tầng được chỉ định trong tệp .tf.
Xoá và sửa đổi cơ sở hạ tầng hiện có bằng Terraform.
Quản lý cấu hình và các tác vụ dành riêng cho sản phẩm bằng Terraform, chẳng hạn như:
Bật trình cung cấp dịch vụ đăng nhập Firebase Authentication.
Tạo các vùng chứa Cloud Storage hoặc phiên bản cơ sở dữ liệu và triển khai Firebase Security Rules cho các vùng chứa hoặc phiên bản đó.
Tạo các phần phụ trợ Firebase App Hosting, bản dựng và các tài nguyên liên quan khác.
Bạn có thể sử dụng các tệp và lệnh cấu hình Terraform tiêu chuẩn để hoàn thành tất cả các tác vụ này. Để giúp bạn thực hiện việc này, chúng tôi đã cung cấp các tệp cấu hình Terraform mẫu cho một số trường hợp sử dụng phổ biến.
Quy trình chung để sử dụng Terraform với Firebase
Điều kiện tiên quyết
Hướng dẫn này giới thiệu cách sử dụng Terraform với Firebase, vì vậy, bạn cần có kiến thức cơ bản về Terraform. Đảm bảo bạn đã hoàn tất các điều kiện tiên quyết sau đây trước khi bắt đầu quy trình này.
Cài đặt Terraform và tìm hiểu về Terraform thông qua các hướng dẫn chính thức của họ.
Xem các yêu cầu đối với tài khoản người dùng và tài khoản dịch vụ
Nếu sử dụng tài khoản người dùng, bạn phải chấp nhận Điều khoản dịch vụ của Firebase (Firebase ToS). Bạn đã chấp nhận Điều khoản dịch vụ của Firebase nếu có thể xem một dự án Firebase trong Firebase bảng điều khiển
Để Terraform thực hiện một số thao tác (ví dụ: tạo dự án), bạn phải đáp ứng những điều kiện sau:
Người dùng hoặc tài khoản dịch vụ phải có quyền truy cập IAM phù hợp cho những hành động đó.
Nếu người dùng hoặc tài khoản dịch vụ là thành viên của một tổ chức Google Cloud, thì các chính sách của tổ chức phải cho phép tài khoản thực hiện những hành động đó.
Bước 1: Tạo và tuỳ chỉnh tệp cấu hình Terraform
Tệp cấu hình Terraform cần có 2 phần chính (được mô tả chi tiết bên dưới):
Bạn phải thiết lập provider bất kể sản phẩm hoặc dịch vụ nào của Firebase có liên quan.
Tạo một tệp cấu hình Terraform (chẳng hạn như tệp main.tf) trong thư mục cục bộ.
Trong hướng dẫn này, bạn sẽ sử dụng tệp cấu hình này để chỉ định cả chế độ thiết lập provider và tất cả cơ sở hạ tầng mà bạn muốn Terraform tạo. Tuy nhiên, lưu ý rằng bạn có các lựa chọn về cách thêm chế độ thiết lập nhà cung cấp.
Xem các lựa chọn về cách thêm chế độ thiết lập provider
Bạn có các lựa chọn sau đây về cách thêm chế độ thiết lập provider vào phần còn lại của cấu hình Terraform:
Lựa chọn 1: Đưa tệp này vào đầu một tệp cấu hình .tf Terraform duy nhất (như minh hoạ trong hướng dẫn này).
Hãy sử dụng lựa chọn này nếu bạn mới bắt đầu sử dụng Terraform hoặc chỉ đang dùng thử Terraform với Firebase.
Cách 2: Thêm tệp này vào một tệp .tf riêng biệt (chẳng hạn như tệp provider.tf), ngoài tệp .tf mà bạn chỉ định cơ sở hạ tầng để tạo (chẳng hạn như tệp main.tf).
Hãy sử dụng lựa chọn này nếu bạn là thành viên của một nhóm lớn hơn cần chuẩn hoá chế độ thiết lập.
Khi chạy các lệnh Terraform, cả tệp provider.tf và tệp main.tf đều phải nằm trong cùng một thư mục.
Thêm chế độ thiết lập provider sau đây vào đầu tệp main.tf.
Bạn phải sử dụng nhà cung cấp google-beta vì đây là bản phát hành beta của việc sử dụng Firebase với Terraform. Hãy thận trọng khi sử dụng trong quá trình phát hành chính thức.
# 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}
Tìm hiểu thêm về các loại thuộc tính liên quan đến dự án (bao gồm cả những gì hướng dẫn này gọi là "dự án kiểm tra hạn mức") khi sử dụng Terraform với Firebase.
Tiếp tục chuyển sang phần tiếp theo để hoàn tất tệp cấu hình và chỉ định cơ sở hạ tầng cần tạo.
Chỉ định cơ sở hạ tầng cần tạo bằng cách sử dụng các khối resource
Trong tệp cấu hình Terraform (đối với hướng dẫn này, tệp main.tf của bạn), bạn cần chỉ định tất cả cơ sở hạ tầng mà bạn muốn Terraform tạo (tức là tất cả tài nguyên bạn muốn cung cấp và tất cả dịch vụ bạn muốn bật). Trong hướng dẫn này, hãy xem danh sách đầy đủ tất cả các tài nguyên Firebase hỗ trợ Terraform.
Mở tệp main.tf.
Trong chế độ thiết lập provider, hãy thêm cấu hình sau của các khối resource.
Ví dụ cơ bản này tạo một dự án Firebase mới, sau đó tạo một Ứng dụng Firebase cho Android trong dự án đó.
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{provider=google-beta.no_user_project_overridename="Project Display Name"project_id="project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""default"{provider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""default"{provider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app"package_name="awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
Xem phiên bản được chú thích kỹ của tệp cấu hình ví dụ này
Nếu bạn chưa hiểu rõ về cơ sở hạ tầng của các dự án và ứng dụng dưới dạng tài nguyên, hãy xem tài liệu sau:
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{ # Use the provider that enables the setup of quota checks for a new projectprovider=google-beta.no_user_project_overridename="Project Display Name" // learn more about the project nameproject_id="project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled" // learn more about the Firebase-enabled label}}# Enables required APIs.resource"google_project_service""default"{ # Use the provider without quota checks for enabling APISprovider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.# This action essentially "creates a Firebase project" and allows the project to use# Firebase services (like Firebase Authentication) and# Firebase tooling (like the Firebase console).# Learn more about the relationship between Firebase projects and Google Cloud.resource"google_firebase_project""default"{ # Use the provider that performs quota checks from now onprovider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.# Learn more about the relationship between Firebase Apps and Firebase projects.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app" # learn more about an app's display namepackage_name="awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
Bước 2: Chạy các lệnh Terraform để tạo cơ sở hạ tầng được chỉ định
Để cung cấp tài nguyên và bật các dịch vụ được chỉ định trong tệp main.tf, hãy chạy các lệnh sau trong cùng thư mục với tệp main.tf.
Để biết thông tin chi tiết về các lệnh này, hãy xem tài liệu về Terraform.
Nếu đây là lần đầu tiên chạy các lệnh Terraform trong thư mục, bạn cần khởi động thư mục cấu hình và cài đặt trình cung cấp Google Terraform. Hãy thực hiện việc này bằng cách chạy lệnh sau:
terraform init
Tạo cơ sở hạ tầng được chỉ định trong tệp main.tf bằng cách chạy lệnh sau:
terraform apply
Xác nhận rằng mọi thứ đã được cung cấp hoặc bật như mong đợi:
Cách 1: Xem cấu hình được in trong cửa sổ dòng lệnh bằng cách chạy lệnh sau:
Các tài nguyên sau đây của Firebase và Google có hỗ trợ Terraform. Chúng tôi liên tục bổ sung thêm các tài nguyên mới! Vì vậy, nếu bạn không thấy tài nguyên mà bạn muốn quản lý bằng Terraform, hãy kiểm tra lại sau để xem tài nguyên đó có sẵn hay không hoặc yêu cầu tài nguyên đó bằng cách gửi vấn đề trong kho lưu trữ GitHub.
google_identity_platform_config – bật Google Cloud Identity Platform (GCIP) (là phần phụ trợ cho Firebase Authentication) và cung cấp chế độ cài đặt xác thực ở cấp dự án
Dự án mà Terraform sẽ bật GCIP và/hoặc Firebase Authentication phải thuộc gói giá Blaze (tức là dự án phải có tài khoản Cloud Billing được liên kết). Bạn có thể thực hiện việc này theo phương thức lập trình bằng cách đặt thuộc tính billing_account trong tài nguyên google_project.
Tài nguyên này cũng cho phép bạn thiết lập thêm nhiều cấu hình, chẳng hạn như các phương thức đăng nhập cục bộ (như xác thực ẩn danh, email/mật khẩu và điện thoại), cũng như các chức năng chặn và miền được uỷ quyền.
Định cấu hình tính năng xác thực đa yếu tố (MFA) thông qua Terraform
Firebase App Hosting
google_firebase_app_hosting_backend – tạo và quản lý một phần phụ trợ Firebase App Hosting, bao gồm cả kết nối kho lưu trữ GitHub và nhánh trực tiếp để triển khai liên tục.
Triển khai Firebase Realtime Database Security Rules thông qua Terraform (tìm hiểu cách triển khai Rules này bằng các công cụ khác, bao gồm cả các lựa chọn có thể lập trình)
Tệp cấu hình Terraform mẫu cho các trường hợp sử dụng phổ biến
Thiết lập Firebase Authentication bằng GCIP
Cấu hình này sẽ tạo một dự án Google Cloud mới, liên kết dự án đó với một tài khoản Cloud Billing (bạn phải sử dụng gói giá Blaze cho Firebase Authentication có GCIP), bật các dịch vụ Firebase cho dự án, thiết lập Firebase Authentication có GCIP và đăng ký 3 loại ứng dụng khác nhau cho dự án.
Xin lưu ý rằng bạn phải bật GCIP để thiết lập Firebase Authentication thông qua Terraform.
# Creates a new Google Cloud project.resource"google_project""auth"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""auth"{provider=google-beta.no_user_project_overrideproject=google_project.auth.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","identitytoolkit.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""auth"{provider=google-betaproject=google_project.auth.project_iddepends_on=[google_project_service.auth,]}# Creates an Identity Platform config.# Also enables Firebase Authentication with Identity Platform in the project if not.resource"google_identity_platform_config""auth"{provider=google-betaproject=google_firebase_project.auth.project # Auto-deletes anonymous usersautodelete_anonymous_users=true # Configures local sign-in methods, like anonymous, email/password, and phone authentication.sign_in{allow_duplicate_emails=trueanonymous{enabled=true}email{enabled=truepassword_required=false}phone_number{enabled=truetest_phone_numbers={"+11231231234"="000000"}}} # Sets an SMS region policy.sms_region_config{allowlist_only{allowed_regions=["US","CA",]}} # Configures blocking functions.blocking_functions{triggers{event_type="beforeSignIn"function_uri="https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in"}forward_inbound_credentials{refresh_token=trueaccess_token=trueid_token=true}} # Configures a temporary quota for new signups for anonymous, email/password, and phone number.quota{sign_up_quota_config{quota=1000start_time=""quota_duration="7200s"}} # Configures authorized domains.authorized_domains=["localhost","${google_project.auth.project_id}.firebaseapp.com","${google_project.auth.project_id}.web.app",]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Web app"}
Cung cấp dịch vụ Firebase Data Connect
Cấu hình này sẽ tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án và cung cấp một dịch vụ Data Connect.
# Creates a new Google Cloud project.resource"google_project""dataconnect"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Data Connect).billing_account="000000-000000-000000" # Required for the project to display in a list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.dataconnect.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedataconnect.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""dataconnect"{provider=google-betaproject=google_project.dataconnect.project_iddepends_on=[google_project_service.services]}# Create a Firebase Data Connect serviceresource"google_firebase_data_connect_service""dataconnect-default"{project=google_firebase_project.dataconnect.projectlocation="name-of-region-for-service"service_id="${google_firebase_project.dataconnect.project}-default-fdc"deletion_policy="DEFAULT"}
Cung cấp phiên bản Firebase Realtime Database mặc định
Cấu hình này sẽ tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án, cung cấp phiên bản Realtime Database mặc định của dự án và đăng ký 3 loại ứng dụng khác nhau với dự án.
# Creates a new Google Cloud project.resource"google_project""rtdb"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""rtdb"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb"{provider=google-betaproject=google_project.rtdb.project_iddepends_on=[google_project_service.rtdb]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Web app"}
Cung cấp nhiều phiên bản Firebase Realtime Database
Cấu hình này tạo một dự án Google Cloud mới, liên kết dự án với một tài khoản Cloud Billing (bạn phải sử dụng gói giá Blaze cho nhiều phiên bản Realtime Database), bật các dịch vụ Firebase cho dự án, cung cấp nhiều phiên bản Realtime Database (bao gồm cả phiên bản Realtime Database mặc định của dự án) và đăng ký 3 loại ứng dụng khác nhau với dự án.
# Creates a new Google Cloud project.resource"google_project""rtdb-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""rtdb-multi"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb-multi"{provider=google-betaproject=google_project.rtdb-multi.project_iddepends_on=[google_project_service.rtdb-multi]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb-multi.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Provisions an additional Realtime Database instance.resource"google_firebase_database_instance""database-additional"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance.region="name-of-region" # This value will become the first segment of the database's URL.instance_id="name-of-additional-database-instance"type="USER_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Web app"}
Cung cấp phiên bản Cloud Firestore mặc định
Cấu hình này sẽ tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án, cung cấp phiên bản Cloud Firestore mặc định của dự án và đăng ký 3 loại ứng dụng khác nhau với dự án.
Thao tác này cũng cung cấp Firebase Security Rules cho phiên bản Cloud Firestore mặc định, tạo chỉ mục Cloud Firestore và thêm tài liệu Cloud Firestore có dữ liệu ban đầu.
# Creates a new Google Cloud project.resource"google_project""firestore"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""firestore"{provider=google-beta.no_user_project_overrideproject=google_project.firestore.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firestore.googleapis.com","firebaserules.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""firestore"{provider=google-betaproject=google_project.firestore.project_iddepends_on=[google_project_service.firestore]}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectname="(default)" # See available locations: https://firebase.google.com/docs/firestore/locationslocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a ruleset of Firestore Security Rules from a local file.resource"google_firebaserules_ruleset""firestore"{provider=google-betaproject=google_firestore_database.firestore.projectsource{files{name="firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-startedcontent=file("firestore.rules")}}}# Releases the ruleset for the Firestore instance.resource"google_firebaserules_release""firestore"{provider=google-betaname="cloud.firestore" # must be cloud.firestoreruleset_name=google_firebaserules_ruleset.firestore.nameproject=google_firestore_database.firestore.project}# Adds a new Firestore index.resource"google_firestore_index""indexes"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"query_scope="COLLECTION"fields{field_path="question"order="ASCENDING"}fields{field_path="answer"order="ASCENDING"}}# Adds a new Firestore document with seed data.# Don't use real end-user or production data in this seed document.resource"google_firestore_document""doc"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"document_id="question-1"fields="{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Web app"}
Đây là bộ quy tắc của Cloud Firestore Security Rules. Bộ quy tắc này phải nằm trong một tệp cục bộ có tên là firestore.rules.
Cấu hình này sẽ tạo một dự án Google Cloud mới, liên kết dự án đó với một tài khoản Cloud Billing (bạn phải sử dụng gói giá Linh hoạt để có thêm các vùng chứa), bật các dịch vụ Firebase cho dự án, cung cấp thêm các vùng chứa Cloud Storage không phải là vùng chứa mặc định và đăng ký 3 loại ứng dụng khác nhau với dự án.
Thao tác này cũng cung cấp Firebase Security Rules cho mỗi bộ chứa Cloud Storage và tải một tệp lên một trong các bộ chứa Cloud Storage.
# Creates a new Google Cloud project.resource"google_project""storage-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""storage-multi"{provider=google-beta.no_user_project_overrideproject=google_project.storage-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebaserules.googleapis.com","firebasestorage.googleapis.com","storage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_iddepends_on=[google_project_service.storage-multi]}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locationslocation="name-of-region-for-bucket"}# Provisions an additional Cloud Storage bucket.resource"google_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the existing Storage bucket.location="name-of-region-for-additional-bucket"}# Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-1.name}# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-2.name}# Creates a ruleset of Firebase Security Rules from a local file.resource"google_firebaserules_ruleset""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectsource{files{ # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-startedname="storage.rules"content=file("storage.rules")}}}# Releases the ruleset to the first Storage bucket.resource"google_firebaserules_release""bucket-1"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-1.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Releases the ruleset to the additional Storage bucket.resource"google_firebaserules_release""bucket-2"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-2.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Uploads a new file to the first Storage bucket.# Do not use real end-user or production data in this file.resource"google_storage_bucket_object""cat-picture-multi"{provider=google-betaname="cat.png"source="path/to/cat.png"bucket=google_storage_bucket.bucket-1.name}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Web app"}
Đây là bộ quy tắc của Cloud Storage Security Rules. Bộ quy tắc này phải nằm trong một tệp cục bộ có tên là storage.rules.
Cấu hình này sẽ tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án, đồng thời thiết lập và bật chế độ thực thi Firebase App Check cho Cloud Firestore để chỉ có thể truy cập vào dự án từ ứng dụng Android của bạn.
# Creates a new Google Cloud project.resource"google_project""appcheck"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.appcheck.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseappcheck.googleapis.com","firestore.googleapis.com","serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""appcheck"{provider=google-betaproject=google_project.appcheck.project_iddepends_on=[google_project_service.services]}# Provisions the Firestore database instance.resource"google_firestore_database""database"{provider=google-betaproject=google_firebase_project.appcheck.projectname="(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-locationlocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectdisplay_name="Play Integrity app"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Register the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectapp_id=google_firebase_android_app.appcheck.app_iddepends_on=[google_firestore_database.database]lifecycle{precondition{condition=length(google_firebase_android_app.appcheck.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}}# Enable enforcement of App Check for Firestoreresource"google_firebase_app_check_service_config""firestore"{provider=google-betaproject=google_firebase_project.appcheck.projectservice_id="firestore.googleapis.com"depends_on=[google_project_service.services]}
Cài đặt một phiên bản của Firebase Extension
Cấu hình này sẽ tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án và cài đặt một phiên bản Firebase Extension mới trong dự án. Nếu phiên bản đã tồn tại, các tham số của phiên bản đó sẽ được cập nhật dựa trên các giá trị được cung cấp trong cấu hình.
# Creates a new Google Cloud project.resource"google_project""extensions"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""extensions"{provider=google-beta.no_user_project_overrideproject=google_project.extensions.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firebase.googleapis.com","firebaseextensions.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""extensions"{provider=google-betaproject=google_project.extensions.project_iddepends_on=[google_project_service.extensions,]}# Installs an instance of the "Translate Text in Firestore" extension.# Or updates the extension if the specified instance already exists.resource"google_firebase_extensions_instance""translation"{provider=google-betaproject=google_firebase_project.extensions.projectinstance_id="translate-text-in-firestore"config{extension_ref="firebase/firestore-translate-text"params={COLLECTION_PATH="posts/comments/translations"DO_BACKFILL=trueLANGUAGES="ar,en,es,de,fr"INPUT_FIELD_NAME="input"LANGUAGES_FIELD_NAME="languages"OUTPUT_FIELD_NAME="translated"}system_params={"firebaseextensions.v1beta.function/location"="us-central1""firebaseextensions.v1beta.function/memory"="256""firebaseextensions.v1beta.function/minInstances"="0""firebaseextensions.v1beta.function/vpcConnectorEgressSettings"="VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"}}}
Bật và bảo vệ Firebase AI Logic
Cấu hình này sẽ tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án, bao gồm cả Firebase AI Logic, đồng thời thiết lập và bật chế độ thực thi Firebase App Check cho Firebase AI Logic để chỉ có thể truy cập vào dự án này từ các ứng dụng của bạn.
# Creates a new Google Cloud project.resource"google_project""vertex"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for Vertex AI in Firebase).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.vertex.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase"aiplatform.googleapis.com","firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse"firebaseappcheck.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""vertex"{provider=google-betaproject=google_project.vertex.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Web App"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Android App"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Creates a Firebase Apple App in the new project created earlier.resource"google_firebase_apple_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Apple App"bundle_id="bundle.id"team_id="1234567890"}### Protects Vertex AI in Firebase with App Check.# Turns on enforcement for Vertex AI in Firebaseresource"google_firebase_app_check_service_config""vertex"{provider=google-betaproject=google_firebase_project.vertex.projectservice_id="firebaseml.googleapis.com"enforcement_mode="ENFORCED"}# Enables the reCAPTCHA Enterprise APIresource"google_project_service""recaptcha_enterprise"{provider=google-betaproject=google_firebase_project.vertex.projectservice="recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables the Play Integrity APIresource"google_project_service""play_integrity"{provider=google-betaproject=google_firebase_project.vertex.projectservice="playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Allows the web app to use reCAPTCHA Enterprise with App Checkresource"google_firebase_app_check_recaptcha_enterprise_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_web_app.app.app_idsite_key="your site key"token_ttl="7200s" # Optionaldepends_on=[google_project_service.recaptcha_enterprise]}# Registers the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_android_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=length(google_firebase_android_app.app.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}depends_on=[google_project_service.play_integrity]}# Registers the Apple app with the AppAttest providerresource"google_firebase_app_check_app_attest_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_apple_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=google_firebase_apple_app.app.team_id!=""error_message="Provide a Team ID on the Apple App to use App Check"}}}
Cấp phép thủ công một phần phụ trợ App Hosting
Cấu hình này minh hoạ cách cung cấp thủ công một phần phụ trợ App Hosting bằng Terraform. Phương pháp này giúp bạn kiểm soát chi tiết các tài nguyên đã tạo, nhưng yêu cầu bạn phải xác định từng tài nguyên riêng lẻ. Điều này hữu ích khi bạn cần tuỳ chỉnh phần phụ trợ ngoài các lựa chọn mặc định.
# Creates a new Google Cloud project.resource"google_project""apphosting"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase App Hosting).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.apphosting.project_idfor_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-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}# Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS" # or "REGIONAL_STRICT"service_account=google_service_account.service_account.email}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Creates a Buildresource"google_firebase_app_hosting_build""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idbuild_id="my-build"source{container{ # TODO: use your own imageimage="us-docker.pkg.dev/cloudrun/container/hello"}}}# Rolls out the Buildresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idtarget{splits{build=google_firebase_app_hosting_build.example.namepercent=100}}}
Cung cấp một phần phụ trợ App Hosting bằng GitHub
Cấu hình này minh hoạ cách cung cấp một phần phụ trợ App Hosting bằng mã ứng dụng được lưu trữ trong một kho lưu trữ GitHub. Phương pháp này cho phép bạn quản lý và cập nhật cơ sở hạ tầng thông qua các yêu cầu kéo GitHub và quy trình CI/CD theo mô hình điển hình cho việc triển khai App Hosting.
# Creates a new Google Cloud project.resource"google_project""apphosting"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase App Hosting).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.apphosting.project_idfor_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-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}### Setting up Firebase App Hosting #### Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS" # or "REGIONAL_STRICT"service_account=google_service_account.service_account.emailcodebase{repository=google_developer_connect_git_repository_link.my-repository.nameroot_directory="/"}}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/developerconnect.readTokenAccessor","roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Configures auto rollout from GitHubresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idrollout_policy{codebase_branch="main" # Or another branch}}###### Setting up a connection to GitHub #### Provisions Service Agent for Developer Connectresource"google_project_service_identity""devconnect-p4sa"{provider=google-betaproject=google_firebase_project.apphosting.projectservice="developerconnect.googleapis.com"}# Adds permission to Developer Connect Service Agent to manager GitHub tokensresource"google_project_iam_member""devconnect-secret"{provider=google-betaproject=google_firebase_project.apphosting.projectrole="roles/secretmanager.admin"member=google_project_service_identity.devconnect-p4sa.member}# Connects to a GitHub accountresource"google_developer_connect_connection""my-connection"{provider=google-betaproject=google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's locationlocation="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 outputoutput"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 projectresource"google_developer_connect_git_repository_link""my-repository"{provider=google-betaproject=google_firebase_project.apphosting.projectlocation=google_developer_connect_connection.my-connection.locationgit_repository_link_id="my-repo-id"parent_connection=google_developer_connect_connection.my-connection.connection_idclone_uri="https://github.com/myuser/myrepo.git"}###
Khắc phục sự cố và câu hỏi thường gặp
Bạn muốn tìm hiểu thêm về tất cả các thuộc tính liên quan đến dự án (chẳng hạn như project và user_project_override)
Hướng dẫn này sử dụng các thuộc tính Terraform sau đây khi làm việc với "projects".
project trong khối resource
Nên dùng: bất cứ khi nào có thể, hãy thêm thuộc tính project vào mỗi khối resource
Bằng cách thêm một thuộc tính dự án, Terraform sẽ tạo cơ sở hạ tầng được chỉ định trong khối tài nguyên trong dự án đã chỉ định. Hướng dẫn này và các tệp cấu hình mẫu của chúng tôi đều sử dụng phương pháp này.
Để cung cấp hầu hết các tài nguyên, bạn nên sử dụng user_project_override = true, tức là kiểm tra hạn mức đối với dự án Firebase của riêng bạn. Tuy nhiên, để thiết lập dự án mới sao cho dự án đó có thể chấp nhận các lượt kiểm tra hạn mức, trước tiên, bạn cần sử dụng user_project_override = false.
Bạn gặp phải lỗi này:
generic::permission_denied: Firebase Tos Not Accepted.
Đảm bảo rằng tài khoản người dùng mà bạn đang dùng để chạy các lệnh gcloud CLIđã chấp nhận Điều khoản dịch vụ của Firebase (Firebase ToS).
Bạn có thể thực hiện bước kiểm tra này bằng cách sử dụng một trình duyệt đã đăng nhập vào tài khoản người dùng và cố gắng xem một dự án Firebase hiện có trong bảng điều khiển Firebase. Nếu bạn có thể xem một dự án Firebase hiện có, thì tức là tài khoản người dùng đã chấp nhận Điều khoản dịch vụ của Firebase.
Nếu bạn không xem được dự án Firebase nào hiện có, thì có thể tài khoản người dùng chưa chấp nhận Điều khoản dịch vụ của Firebase. Để khắc phục vấn đề này, hãy tạo một dự án Firebase mới thông qua bảng điều khiển Firebase và chấp nhận Điều khoản dịch vụ của Firebase trong quá trình tạo dự án. Bạn có thể xoá ngay dự án này thông qua Cài đặt dự án trong bảng điều khiển.
Sau khi chạy terraform apply, bạn sẽ gặp lỗi sau: generic::permission_denied: IAM authority does not have the
permission.
Đợi vài phút rồi thử chạy lại terraform apply.
Không tạo được tài nguyên, nhưng khi bạn chạy lại terraform apply, hệ thống sẽ báo ALREADY_EXISTS.
Điều này có thể là do độ trễ truyền tải trong nhiều hệ thống. Hãy thử giải quyết vấn đề này bằng cách nhập tài nguyên vào trạng thái Terraform bằng cách chạy terraform import. Sau đó, hãy thử chạy lại terraform apply.
Bạn có thể tìm hiểu cách nhập từng tài nguyên trong phần "Nhập" của tài liệu Terraform (ví dụ: tài liệu "Nhập" cho Cloud Firestore).
Khi làm việc với Cloud Firestore, bạn sẽ gặp lỗi này: Error creating Index: googleapi:
Error 409;...Concurrent access -- try again
Như lỗi này cho thấy, Terraform có thể đang cố gắng cung cấp nhiều chỉ mục và/hoặc tạo một tài liệu cùng lúc và gặp phải lỗi về tính đồng thời.
Hãy thử chạy lại terraform apply.
Bạn gặp phải lỗi này: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes".
Lỗi này có nghĩa là Terraform không biết nên kiểm tra hạn mức của dự án nào. Để khắc phục sự cố, hãy kiểm tra những nội dung sau trong khối resource:
Đảm bảo rằng bạn đã chỉ định một giá trị cho thuộc tính project.
Đảm bảo rằng bạn đang sử dụng nhà cung cấp có user_project_override = true (không có bí danh), trong các mẫu Firebase là google-beta.
Khi tạo một dự án Google Cloud mới, bạn gặp lỗi rằng mã dự án được chỉ định cho dự án mới đã tồn tại.
Sau đây là những lý do có thể khiến mã dự án đã tồn tại:
Dự án được liên kết với mã nhận dạng đó thuộc về người khác.
Cách khắc phục: Chọn một mã dự án khác.
Gần đây, dự án được liên kết với mã nhận dạng đó đã bị xoá (ở trạng thái xoá mềm).
Cách giải quyết: Nếu bạn cho rằng dự án được liên kết với mã nhận dạng này thuộc về bạn, hãy kiểm tra trạng thái của dự án bằng projects.get REST API.
Dự án được liên kết với mã nhận dạng đó tồn tại chính xác trong người dùng hiện tại. Một nguyên nhân có thể gây ra lỗi này là do một terraform apply trước đó bị gián đoạn.
Cách giải quyết: Chạy các lệnh sau: terraform import google_project.default PROJECT_ID
rồi chạy lệnh terraform import google_firebase_project.default PROJECT_ID
Tại sao bạn cần cung cấp phiên bản Cloud Firestore mặc định trước vùng chứa Cloud Storage mặc định?
Nếu bạn đã cung cấp vùng chứa Cloud Storage mặc định (thông qua google_app_engine_application) trước khi cố gắng cung cấp phiên bản Cloud Firestore mặc định, thì bạn sẽ thấy phiên bản Cloud Firestore mặc định đã được cung cấp. Xin lưu ý rằng phiên bản cơ sở dữ liệu được cung cấp ở chế độ Datastore, tức là không thể truy cập vào SDK Firebase, tính năng xác thực hoặc Firebase Security Rules. Nếu muốn sử dụng Cloud Firestore với các dịch vụ Firebase này, bạn cần xoá hết dữ liệu trong cơ sở dữ liệu rồi thay đổi loại cơ sở dữ liệu trong bảng điều khiển Google Cloud.
Khi cố gắng cung cấp Cloud Storage (thông qua google_app_engine_application) rồi đến phiên bản Cloud Firestore mặc định, bạn sẽ gặp lỗi này: Error: Error creating Database: googleapi: Error 409: Database already
exists. Please use another database_id.
Khi bạn cung cấp vùng chứa Cloud Storage mặc định của một dự án (thông qua google_app_engine_application) và dự án đó chưa có phiên bản Cloud Firestore mặc định, thì google_app_engine_application sẽ tự động cung cấp phiên bản Cloud Firestore mặc định của dự án.
Vì vậy, vì phiên bản Cloud Firestore mặc định của dự án của bạn đã được cung cấp, google_firestore_database sẽ báo lỗi nếu bạn cố gắng cung cấp lại phiên bản mặc định đó một cách rõ ràng.
Sau khi cấp phép phiên bản Cloud Firestore mặc định của dự án, bạn không thể "cấp phép lại" hoặc thay đổi vị trí của phiên bản đó. Xin lưu ý rằng phiên bản cơ sở dữ liệu được cung cấp ở chế độ Datastore, tức là không thể truy cập vào SDK Firebase, tính năng xác thực hoặc Firebase Security Rules. Nếu muốn sử dụng Cloud Firestore với các dịch vụ Firebase này, bạn cần xoá dữ liệu trong cơ sở dữ liệu rồi thay đổi loại cơ sở dữ liệu trong bảng điều khiển Google Cloud.