Firebase đang bắt đầu hỗ trợ Terraform . Nếu bạn thuộc nhóm muốn tự động hóa và tiêu chuẩn hóa việc tạo dự án Firebase với các tài nguyên cụ thể được cung cấp và 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:
Tạo và tùy chỉnh tệp cấu hình Terraform (tệp
.tf
) chỉ định cơ sở hạ tầng bạn muốn cung cấp (nghĩa là các tài nguyên bạn muốn cung cấp và các dịch vụ bạn muốn kích hoạt).Sử dụng các lệnh gCloud CLI có giao diện với Terraform để cung cấp cơ sở hạ tầng được chỉ định trong tệp
.tf
.
Bạn có thể làm gì với Terraform và Firebase?
Ví dụ về quy trình làm việc tổng quát trong hướng dẫn này là tạo dự án Firebase mới bằng ứng dụng Android. Nhưng bạn có thể làm được nhiều hơn thế với Terraform, chẳng hạn như:
Xóa và sửa đổi cơ sở hạ tầng hiện có bằng Terraform.
Quản lý cấu hình và tác vụ dành riêng cho sản phẩm bằng Terraform, như:
- Kích hoạt nhà cung cấp đăng nhập Xác thực Firebase.
- Tạo nhóm Lưu trữ đám mây hoặc phiên bản cơ sở dữ liệu và triển khai Quy tắc bảo mật Firebase cho chúng.
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. Và để giúp bạn thực hiện điều 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 làm việc tổng quát để sử dụng Terraform với Firebase
Điều kiện tiên quyết
Hướng dẫn này là phần giới thiệu về cách sử dụng Terraform với Firebase, do đó, hướng dẫn này đòi hỏi trình độ cơ bản về Terraform. Đảm bảo rằng bạn đã hoàn thành các điều kiện tiên quyết sau đây trước khi bắt đầu dòng công việc này.
Cài đặt Terraform và làm quen với Terraform bằng các hướng dẫn chính thức của họ.
Cài đặt Google Cloud CLI (gCloud CLI). Đăng nhập bằng tài khoản người dùng hoặc 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ụ Firebase nếu bạn có thể xem dự án Firebase trong bảng điều khiển Firebase
- Để Terraform thực hiện một số hành động nhất định (ví dụ: tạo dự án), những điều sau đây phải đúng:
- Tài khoản người dùng hoặc dịch vụ phải có quyền truy cập IAM hiện hành cho những hành động đó.
- Nếu tài khoản người dùng hoặc dịch vụ là thành viên của tổ chức Google Cloud thì chính sách 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à tùy chỉnh tệp cấu hình Terraform
Tệp cấu hình Terraform cần hai phần chính (được mô tả chi tiết bên dưới):
- Phần thiết lập
provider
chỉ ra những tài nguyên Terraform nào có thể được truy cập - Một phần của các khối
resource
riêng lẻ chỉ định cơ sở hạ tầng nào cần tạo
Thiết lập provider
của bạn
Cần phải thiết lập provider
bất kể sản phẩm hoặc dịch vụ Firebase nào có liên quan.
Tạo tệp cấu hình Terraform (như tệp
main.tf
) trong thư mục cục bộ của bạn.Trong hướng dẫn này, bạn sẽ sử dụng tệp cấu hình này để chỉ định cả thiết lập của
provider
và tất cả cơ sở hạ tầng mà bạn muốn Terraform tạo. Tuy nhiên, xin lưu ý rằng bạn có các tùy chọn về cách bao gồm thiết lập nhà cung cấp.Bạn có các tùy chọn sau về cách đưa thiết lập
provider
vào phần còn lại của cấu hình Terraform của mình:Tùy chọn 1: Đưa nó vào đầu một tệp cấu hình Terraform
.tf
(như được hiển thị trong hướng dẫn này).- Sử dụng tùy chọn này nếu bạn mới bắt đầu với Terraform hoặc mới dùng thử Terraform với Firebase.
Tùy chọn 2: Bao gồm nó trong một tệp
.tf
riêng biệt (như tệpprovider.tf
), ngoài tệp.tf
nơi bạn chỉ định cơ sở hạ tầng để tạo (như tệpmain.tf
).- Sử dụng tùy 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 hóa việc thiết lập.
- Khi chạy các lệnh Terraform, cả tệp
provider.tf
và tệpmain.tf
phải nằm trong cùng một thư mục.
Bao gồm thiết lập
provider
sau ở đầu tệpmain.tf
Bạn phải sử dụng nhà cung cấp
google-beta
vì đây là bản phát hành beta sử dụng Firebase với Terraform. Thận trọng khi sử dụng trong sản xuất.# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 4.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 khác nhau liên quan đến dự án (bao gồm cả thuộc tính mà hướng dẫn này gọi là "dự án kiểm tra hạn ngạch") khi sử dụng Terraform với Firebase.
Tiếp tục đến phần tiếp theo để hoàn thành tệp cấu hình của bạn và chỉ định cơ sở hạ tầng nào sẽ tạo.
Chỉ định cơ sở hạ tầng nào sẽ tạo bằng cách sử dụng các khối resource
Trong tệp cấu hình Terraform của bạn (đố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 (nghĩa là tất cả các tài nguyên bạn muốn cung cấp và tất cả các dịch vụ bạn muốn kích hoạt). Trong hướng dẫn này, hãy tìm danh sách đầy đủ tất cả tài nguyên Firebase hỗ trợ Terraform .
Mở tệp
main.tf
của bạn.Trong phần thiết lập
provider
, hãy bao gồm cấu hình sau của các khốiresource
.Ví dụ cơ bản này tạo một dự án Firebase mới và sau đó tạo Ứng dụng Android Firebase 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_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, ] }
Nếu bạn không quen với 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 lại tài liệu sau:
- Tìm hiểu các dự án Firebase
- Tài liệu tham khảo về quản lý dự án 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, ] }
Bước 2: Chạy lệnh Terraform để tạo cơ sở hạ tầng được chỉ định
Để cung cấp tài nguyên và kích hoạt các dịch vụ được chỉ định trong tệp main.tf
của bạn, hãy chạy các lệnh sau từ cùng thư mục với tệp main.tf
của bạn. Để biết thông tin chi tiết về các lệnh này, hãy xem tài liệu Terraform .
Nếu đây là lần đầu tiên bạn chạy các lệnh Terraform trong thư mục, bạn cần khởi tạo thư mục cấu hình và cài đặt nhà cung cấp Google Terraform. 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
của bạn 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 kích hoạt như mong đợi:
Tùy chọn 1: Xem cấu hình được in trong thiết bị đầu cuối của bạn bằng cách chạy lệnh sau:
terraform show
Tùy chọn 2: Xem dự án Firebase của bạn trong bảng điều khiển Firebase .
Tài nguyên Firebase có hỗ trợ Terraform
Các tài nguyên Firebase và Google sau đây có hỗ trợ Terraform. Và chúng tôi đang bổ sung thêm nhiều tài nguyên hơn! Vì vậy, nếu bạn không thấy tài nguyên mà mình muốn quản lý bằng Terraform, hãy kiểm tra lại sớm để 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 .
Quản lý ứng dụng và dự án Firebase
google_firebase_project
- bật dịch vụ Firebase trên dự án Google Cloud hiện cógoogle_firebase_project_location
- đặt vị trí cho tài nguyên Google Cloud mặc định của dự ánỨng dụng Firebase
-
google_firebase_apple_app
— tạo hoặc quản lý Ứng dụng nền tảng Firebase của Apple -
google_firebase_android_app
- tạo hoặc quản lý Ứng dụng Android Firebase -
google_firebase_web_app
- tạo hoặc quản lý Ứng dụng web Firebase
-
Xác thực Firebase
google_identity_platform_config
- bật Google Cloud Identity Platform (GCIP) (là phần phụ trợ cho Xác thực Firebase) và cung cấp cài đặt xác thực cấp dự ánĐịnh cấu hình Xác thực Firebase qua Terraform yêu cầu bật GCIP. Đảm bảo xem lại tệp
.tf
mẫu để biết cách thiết lập Xác thực Firebase .Dự án mà Terraform sẽ kích hoạt Xác thực GCIP và/hoặc Firebase phải nằm trong gói định giá Blaze (nghĩa là dự án phải có tài khoản Thanh toán trên nền tảng đám mây được liên kết). Bạn có thể thực hiện việc này theo chương trình bằng cách đặt thuộc tính
billing_account
trong tài nguyêngoogle_project
.Tài nguyên này cũng cho phép nhiều cấu hình hơn, như các phương thức đăng nhập cục bộ, chẳng hạn như ẩn danh, email/mật khẩu và xác thực điện thoại, cũng như các chức năng chặn và miền được ủy quyền.
google_identity_platform_default_supported_idp_config
- định cấu hình Nhà cung cấp nhận dạng liên kết phổ biến, như Google, Facebook hoặc Appleidentity_platform_oauth_idp_config
- định cấu hình các nguồn Nhà cung cấp nhận dạng OAuth (IdP) tùy ýgoogle_identity_platform_inbound_saml_config
- định cấu hình tích hợp SAML
Chưa được hỗ trợ:
- Định cấu hình xác thực đa yếu tố (MFA) qua Terraform
Cơ sở dữ liệu thời gian thực của Firebase
-
google_firebase_database_instance
- tạo phiên bản Cơ sở dữ liệu thời gian thực
Chưa được hỗ trợ:
- Triển khai Quy tắc bảo mật cơ sở dữ liệu thời gian thực Firebase thông qua Terraform (tìm hiểu cách triển khai các Quy tắc này bằng công cụ khác, bao gồm các tùy chọn có lập trình)
Cửa hàng đám mây
google_firestore_database
- tạo phiên bản Cloud Firestoregoogle_firestore_index
— kích hoạt các truy vấn hiệu quả cho Cloud Firestoregoogle_firestore_document
- tạo phiên bản Cloud Firestore với một tài liệu cụ thể trong bộ sưu tậpQuan trọng: Không sử dụng dữ liệu sản xuất hoặc dữ liệu người dùng cuối thực sự trong tài liệu gốc này.
Bộ nhớ đám mây cho Firebase
google_firebase_storage_bucket
- làm cho nhóm Lưu trữ đám mây hiện có có thể truy cập được đối với SDK Firebase, xác thực và Quy tắc bảo mật Firebase- Việc thiết lập nhóm Cloud Storage mặc định cho dự án Firebase yêu cầu cấp phép
google_app_engine_application
trước tiên. Đảm bảo xem lại tệp.tf
mẫu để biết cách cung cấp bộ chứa Cloud Storage .
- Việc thiết lập nhóm Cloud Storage mặc định cho dự án Firebase yêu cầu cấp phép
google_storage_bucket_object
- thêm một đối tượng vào nhóm Lưu trữ đám mâyQuan trọng: Không sử dụng dữ liệu sản xuất hoặc người dùng cuối thực sự trong tệp này.
Quy tắc bảo mật Firebase (dành cho Cloud Firestore và Cloud Storage)
Lưu ý rằng Cơ sở dữ liệu thời gian thực Firebase sử dụng hệ thống cấp phép khác cho Quy tắc bảo mật Firebase.
google_firebaserules_ruleset
- xác định Quy tắc bảo mật Firebase áp dụng cho phiên bản Cloud Firestore hoặc nhóm Cloud Storagegoogle_firebaserules_release
- triển khai các bộ quy tắc cụ thể cho phiên bản Cloud Firestore hoặc nhóm Cloud Storage
Kiểm tra ứng dụng Firebase
-
google_firebase_app_check_service_config
- bật thực thi Kiểm tra ứng dụng cho một dịch vụ -
google_firebase_app_check_app_attest_config
- đăng ký ứng dụng nền tảng Apple với nhà cung cấp Chứng thực ứng dụng -
google_firebase_app_check_device_check_config
- đăng ký ứng dụng nền tảng Apple với nhà cung cấp DeviceCheck -
google_firebase_app_check_play_integrity_config
— đăng ký ứng dụng Android với nhà cung cấp Tính toàn vẹn của Play -
google_firebase_app_check_recaptcha_enterprise_config
- đăng ký ứng dụng web với nhà cung cấp reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
- đăng ký ứng dụng web với nhà cung cấp reCAPTCHA v3 -
google_firebase_app_check_debug_token
- sử dụng mã thông báo gỡ lỗi để thử nghiệm
Tiện ích mở rộng Firebase
-
google_firebase_extensions_instance
- cài đặt hoặc cập nhật phiên bản của Tiện ích mở rộng Firebase
Tệp cấu hình Terraform mẫu cho các trường hợp sử dụng phổ biến
Cấu hình này tạo dự án Google Cloud mới, liên kết dự án với tài khoản Thanh toán trên đám mây (bắt buộc phải có gói giá Blaze cho Xác thực Firebase với GCIP), bật dịch vụ Firebase cho dự án, thiết lập Xác thực Firebase với GCIP và đăng ký ba ứng dụng khác nhau các loại với dự án.
Lưu ý rằng cần phải bật GCIP để thiết lập Xác thực Firebase qua Terraform.
# Creates a new Google Cloud project. resource "google_project" "auth" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "identitytoolkit.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "auth" { provider = google-beta project = google_project.auth.project_id depends_on = [ google_project_service.auth, ] } # Creates an Identity Platform config. # Also enables Firebase Authentication with Identity Platform in the project if not. resource "google_identity_platform_config" "auth" { provider = google-beta project = google_project.auth.project_id # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_phone_numbers = { "+11231231234" = "000000" } } } # Sets an SMS region policy. sms_region_config { allowlist_only { allowed_regions = [ "US", "CA", ] } } # Configures blocking functions. blocking_functions { triggers { event_type = "beforeSignIn" function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in" } forward_inbound_credentials { refresh_token = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] }
Cấu hình này tạo một dự án Google Cloud mới, kích hoạt các dịch vụ Firebase cho dự án, cung cấp phiên bản Cơ sở dữ liệu thời gian thực mặc định của dự án và đăng ký ba 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb" { provider = google-beta.no_user_project_override project = google_project.rtdb.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb" { provider = google-beta project = google_project.rtdb.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_project.rtdb.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] }
Cấu hình này tạo dự án Google Cloud mới, liên kết dự án với tài khoản Thanh toán trên đám mây (bắt buộc phải có gói giá Blaze cho nhiều phiên bản Cơ sở dữ liệu thời gian thực), bật dịch vụ Firebase cho dự án, cung cấp nhiều phiên bản Cơ sở dữ liệu thời gian thực (bao gồm cả Cơ sở dữ liệu thời gian thực mặc định của dự án instance) và đăng ký ba 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb-multi" { provider = google-beta.no_user_project_override project = google_project.rtdb-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb-multi.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance. region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "name-of-additional-database-instance" type = "USER_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] }
Cấu hình này tạo một dự án Google Cloud mới, kích hoạt các dịch vụ Firebase cho dự án, cung cấp phiên bản Cloud Firestore của dự án và đăng ký ba loại ứng dụng khác nhau với dự án.
Nó cũng cung cấp Quy tắc bảo mật Firebase cho phiên bản Cloud Firestore, tạo chỉ mục Cloud Firestore và thêm tài liệu Cloud Firestore với dữ liệu gốc.
# Creates a new Google Cloud project. resource "google_project" "firestore" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "firestore" { provider = google-beta.no_user_project_override project = google_project.firestore.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firestore.googleapis.com", "firebaserules.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "firestore" { provider = google-beta project = google_project.firestore.project_id } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_project.firestore.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.firestore, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_project.firestore.project_id source { files { name = "firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore, ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore.name project = google_project.firestore.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } # Wait for Firestore to be provisioned before adding this index. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore document with seed data. # Don't use real end-user or production data in this seed document. resource "google_firestore_document" "doc" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" # Wait for Firestore to be provisioned before adding this document. depends_on = [ google_firestore_database.firestore, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] }
Đây là bộ quy tắc của Quy tắc bảo mật Cloud Firestore phải có trong tệp cục bộ có tên firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Cấu hình này tạo một dự án Google Cloud mới, bật các dịch vụ Firebase cho dự án, cung cấp nhóm Cloud Storage mặc định của dự án và đăng ký ba loại ứng dụng khác nhau với dự án.
Nó cũng cung cấp Quy tắc bảo mật Firebase cho nhóm Lưu trữ đám mây và tải tệp lên nhóm.
# Creates a new Google Cloud project. resource "google_project" "storage" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage" { provider = google-beta.no_user_project_override project = google_project.storage.project_id for_each = toset([ "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" { provider = google-beta project = google_project.storage.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default" { provider = google-beta project = google_project.storage.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket" { provider = google-beta project = google_project.storage.project_id bucket_id = google_app_engine_application.default.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "storage" { provider = google-beta project = google_project.storage.project_id source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the default Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default.default_bucket}" ruleset_name = "projects/${google_project.storage.project_id}/rulesets/${google_firebaserules_ruleset.storage.name}" project = google_project.storage.project_id } # Uploads a new file to the default Storage bucket. # Don't use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] }
Đây là bộ quy tắc của Quy tắc bảo mật lưu trữ đám mây phải có trong tệp cục bộ có tên storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Cấu hình này tạo một dự án Google Cloud mới, liên kết dự án với tài khoản Cloud Billing (bắt buộc phải có gói giá Blaze cho nhiều nhóm), bật dịch vụ Firebase cho dự án, cung cấp nhiều nhóm Cloud Storage (bao gồm cả nhóm Cloud Storage mặc định của dự án) và đăng ký ba loại ứng dụng khác nhau với dự án.
Nó cũng cung cấp Quy tắc bảo mật Firebase cho nhóm Lưu trữ đám mây và tải tệp lên nhóm Lưu trữ đám mây mặc định.
# Creates a new Google Cloud project. resource "google_project" "storage-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage-multi" { provider = google-beta.no_user_project_override project = google_project.storage-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-multi" { provider = google-beta project = google_project.storage-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Provisions an additional Cloud Storage bucket. # Additional Cloud Storage buckets are not provisioned via App Engine. resource "google_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id name = "name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the default Storage bucket. location = "name-of-region-for-additional-bucket" } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_app_engine_application.default-multi.default_bucket } # Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_storage_bucket.bucket-multi.name } # Creates a ruleset of Firebase Security Rules from a local file. resource "google_firebaserules_ruleset" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id source { files { # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Storage buckets to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage-multi, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-multi" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-multi.default_bucket}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-multi" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-multi.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Uploads a new file to the default 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_app_engine_application.default-multi.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] }
Đây là bộ quy tắc của Quy tắc bảo mật lưu trữ đám mây phải có trong tệp cục bộ có tên storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Cấu hình này tạo một dự án Google Cloud mới, kích hoạt các dịch vụ Firebase cho dự án, cung cấp phiên bản Cloud Firestore, sau đó cung cấp nhóm Cloud Storage mặc định.
Nó cũng cung cấp Quy tắc bảo mật Firebase cho phiên bản Cloud Firestore và nhóm Cloud Storage mặc định.
# Creates a new Google Cloud project. resource "google_project" "fs" { # fs = Firestore + Storage provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "fs" { provider = google-beta.no_user_project_override project = google_project.fs.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", "firestore.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" "fs" { provider = google-beta project = google_project.fs.project_id } #### Set up Firestore before default Cloud Storage bucket #### # Provisions the Firestore database instance. resource "google_firestore_database" "firestore-fs" { provider = google-beta project = google_project.fs.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.fs, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started name = "firestore.rules" content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore-fs ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore-fs" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore-fs.name project = google_project.fs.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore-fs, ] } #### Set up default Cloud Storage default bucket after Firestore #### # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location # This will set the location for the default Storage bucket and the App Engine App. location_id = "name-of-region" # Must be in the same location as Firestore (above) # Wait for Firestore to be provisioned first. # Otherwise, the Firestore instance will be provisioned in Datastore mode (unusable by Firebase). depends_on = [ google_firestore_database.firestore-fs, ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id bucket_id = google_app_engine_application.default-bucket-fs.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the Cloud Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.fs, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-fs" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-bucket-fs.default_bucket}" ruleset_name = "projects/${google_project.fs.project_id}/rulesets/${google_firebaserules_ruleset.default-bucket-fs.name}" project = google_project.fs.project_id }
Đây là bộ quy tắc của Quy tắc bảo mật Cloud Firestore phải có trong tệp cục bộ có tên firestore.rules
.
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
Đây là bộ quy tắc của Quy tắc bảo mật lưu trữ đám mây phải có trong tệp cục bộ có tên storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
Cấu hình này tạo một dự án Google Cloud mới, kích hoạt các dịch vụ Firebase cho dự án, đồng thời thiết lập và cho phép thực thi Kiểm tra ứng dụng Firebase cho Cloud Firestore để chỉ có thể truy cập 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.appcheck.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseappcheck.googleapis.com", "firestore.googleapis.com", "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "appcheck" { provider = google-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.appcheck, ] } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project display_name = "Play Integrity app" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # It takes a while for App Check to recognize the new app # If your app already exists, you don't have to wait 30 seconds. resource "time_sleep" "wait_30s" { depends_on = [google_firebase_android_app.appcheck] create_duration = "30s" } # Register the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [time_sleep.wait_30s, google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
Cấu hình này tạo dự án Google Cloud mới, bật dịch vụ Firebase cho dự án và cài đặt phiên bản mới của Tiện ích mở rộng Firebase trong dự án. Nếu phiên bản đã tồn tại, các tham số của 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_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firebase.googleapis.com", "firebaseextensions.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "extensions" { provider = google-beta project = google_project.extensions.project_id depends_on = [ google_project_service.extensions, ] } # Installs an instance of the "Translate Text in Firestore" extension. # Or updates the extension if the specified instance already exists. resource "google_firebase_extensions_instance" "translation" { provider = google-beta project = google_project.extensions.project_id instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "ar,en,es,de,fr" INPUT_FIELD_NAME = "input" LANGUAGES_FIELD_NAME = "languages" OUTPUT_FIELD_NAME = "translated" } system_params = { "firebaseextensions.v1beta.function/location" = "us-central1" "firebaseextensions.v1beta.function/memory" = "256" "firebaseextensions.v1beta.function/minInstances" = "0" "firebaseextensions.v1beta.function/vpcConnectorEgressSettings" = "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED" } } }
Khắc phục sự cố và Câu hỏi thường gặp
Hướng dẫn này sử dụng các thuộc tính Terraform sau khi làm việc với "dự án".
-
project
trong một khốiresource
Khuyến nghị: bất cứ khi nào có thể, hãy bao gồm thuộc tính
project
trong mỗi khốiresource
Bằng cách bao gồm 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 được 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.
Xem tài liệu chính thức của Terraform về
project
.-
user_project_override
trong khốiprovider
Để cung cấp hầu hết các tài nguyên, bạn nên sử dụng
user_project_override = true
, nghĩa là kiểm tra hạn ngạch đối với dự án Firebase của riêng bạn. Tuy nhiên, để thiết lập dự án mới của bạn để dự án có thể chấp nhận kiểm tra hạn ngạch, trước tiên bạn cần sử dụnguser_project_override = false
.Xem tài liệu chính thức của Terraform về
user_project_override
.
Đảm bảo rằng tài khoản người dùng bạn đang sử dụng để chạy 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 việc kiểm tra này bằng cách sử dụng trình duyệt đã đăng nhập vào tài khoản người dùng và cố gắng xem dự án Firebase hiện có trong bảng điều khiển Firebase . Nếu bạn có thể xem dự án Firebase hiện có thì tài khoản người dùng đã chấp nhận Điều khoản dịch vụ Firebase.
Nếu bạn không thể xem bất kỳ dự án Firebase hiện có nào thì tài khoản người dùng có thể chưa chấp nhận Điều khoản dịch vụ Firebase. Để khắc phục điều này, hãy tạo dự án Firebase mới thông qua bảng điều khiển Firebase và chấp nhận Firebase ToS như một phần của quá trình tạo dự án. Bạn có thể xóa ngay dự án này thông qua Cài đặt dự án trong bảng điều khiển.
Đợi vài phút rồi thử chạy lại terraform apply
.
Điều này có thể là do độ trễ lan truyền trong các hệ thống khác nhau. Cố gắng 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 đó 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 ).
Như lỗi gợi ý, Terraform có thể đang cố gắng cung cấp nhiều chỉ mục và/hoặc tạo tài liệu cùng một lúc và gặp phải lỗi đồng thời. Hãy thử chạy lại terraform apply
.
Lỗi này có nghĩa là Terraform không biết nên kiểm tra hạn ngạch theo dự án nào. Để khắc phục sự cố, hãy kiểm tra phần sau trong khối resource
:
- Đảm bảo rằng bạn đã chỉ định 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 mẫu Firebase làgoogle-beta
.
Dưới đây là những lý do có thể khiến ID dự án có thể tồn tại:
Dự án được liên kết với ID đó thuộc về người khác.
- Để giải quyết: Chọn một ID dự án khác.
Dự án được liên kết với ID đó gần đây đã bị xóa (ở trạng thái xóa mềm).
- Để giải quyết: Nếu bạn cho rằng dự án được liên kết với ID thuộc về bạn thì hãy kiểm tra trạng thái của dự án bằng cách sử dụng
projects.get
REST API .
- Để giải quyết: Nếu bạn cho rằng dự án được liên kết với ID thuộc về bạn thì hãy kiểm tra trạng thái của dự án bằng cách sử dụng
Dự án được liên kết với ID đó tồn tại chính xác với người dùng hiện tại. Nguyên nhân có thể gây ra lỗi có thể là do
terraform apply
trước đó đã bị gián đoạn.- Để giải quyết: Chạy các lệnh sau:
terraform import google_project.default PROJECT_ID
và sau đó
terraform import google_firebase_project.default PROJECT_ID
- Để giải quyết: Chạy các lệnh sau:
Ứng dụng App Engine yêu cầu phiên bản Cloud Firestore nhưng bạn chỉ có thể có một phiên bản Cloud Firestore cho mỗi dự án. Vì vậy, như thông báo lỗi gợi ý, nếu bạn đã cung cấp phiên bản Cloud Firestore của dự án ở một vị trí, App Engine sẽ báo lỗi nếu bạn cố gắng cung cấp phiên bản Cloud Firestore ở một vị trí khác. App Engine cho rằng bạn đang cố gắng "cung cấp lại" phiên bản Cloud Firestore hiện có.
Để giải quyết lỗi này, hãy sử dụng cùng một vị trí cho cả Cloud Firestore và ứng dụng App Engine. Nếu bạn cần nhóm Cloud Storage ở một vị trí khác với Cloud Firestore, bạn có thể cung cấp các nhóm bổ sung (xem cấu hình mẫu để tạo nhiều nhóm Cloud Storage ).
Khi bạn cung cấp nhóm Cloud Storage mặc định của dự án (thông qua google_app_engine_application
) và dự án chưa có phiên bản Cloud Firestore thì google_app_engine_application
sẽ tự động cung cấp phiên bản Cloud Firestore của dự án.
Vì vậy, nếu phiên bản Cloud Firestore 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 phiên bản Cloud Firestore một cách rõ ràng.
Sau khi phiên bản Cloud Firestore của dự án được cung cấp, bạn không thể "cung cấp lại" hoặc thay đổi vị trí của nó. Để ngăn lỗi xảy ra, hãy xóa khối tài nguyên google_firestore_database
khỏi tệp cấu hình của bạn. Tuy nhiên, xin lưu ý rằng chúng tôi khuyên bạn nên cung cấp Cloud Firestore trước nhóm Lưu trữ đám mây mặc định của dự án (xem phần bên dưới để biết lý do).