Firebase bắt đầu hỗ trợ
Địa hình.
Nếu bạn thuộc một nhóm muốn tự động hoá và chuẩn hoá quy trình tạo Firebase
dự án có tài nguyên cụ thể được cung cấp và dịch vụ được kích hoạt, sau đó sử dụng
Terraform với Firebase có thể là lựa chọn phù hợp với bạn.
Sau đây là quy trình cơ bản để sử dụng Terraform với Firebase:
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à các tài nguyên mà bạn
muốn cung cấp và những dịch vụ bạn muốn bật).
Dùng các lệnh CLI của gcloud 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ụ theo sản phẩm cụ thể bằng Terraform, chẳng hạn như:
Bật nhà cung cấp dịch vụ đăng nhập để Xác thực Firebase.
Tạo bộ chứa hoặc thực thể cơ sở dữ liệu trong Cloud Storage và triển khai
Firebase bảo mật áp dụng cho chúng.
Bạn có thể dùng các lệnh và tệp cấu hình Terraform tiêu chuẩn để hoàn thành tất cả những việc này
công việc. Để giúp bạn giải quyết vấn đề này, chúng tôi đã cung cấp
tệp cấu hình Terraform mẫu cho một số trường hợp sử dụng phổ biến
trường hợp.
Quy trình công việc chung để 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, vì vậy, hướng dẫn này giả định
thành thạo cơ bản với Terraform. Đảm bảo rằng bạn đã hoàn thành các bước sau
những điều kiện tiên quyết trước khi bắt đầu quy trình này.
Cài đặt Terraform
và làm quen với Terraform 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 của Firebase
Dịch vụ (Điều khoản dịch vụ của Firebase). 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
Bảng điều khiển của Firebase
Để Terraform thực hiện một số hành động nhất định (ví dụ: tạo dự án),
các điều sau phải đúng:
Tài khoản người dùng hoặc tài khoản dịch vụ phải có quyền truy cập IAM hiện hành đối với
những hành động đó.
Nếu tài khoản người dùng hoặc tài khoản dịch vụ thuộc một tổ chức trên 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à tuỳ chỉnh tệp cấu hình Terraform
Tệp cấu hình Terraform cần có hai 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ụ của Firebase là gì
liên quan.
Tạo một tệp cấu hình Terraform (chẳng hạn như tệp main.tf) trong cục bộ của bạn
thư mục.
Trong hướng dẫn này, bạn sẽ sử dụng tệp cấu hình này để chỉ định cả provider
và tất cả cơ sở hạ tầng mà bạn muốn Terraform tạo. Xin lưu ý rằng
Tuy nhiên, 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ực hiện
để bao gồm bước thiết lập provider
Bạn có những lựa chọn sau đây để biết cách thiết lập provider để
phần còn lại của cấu hình Terraform:
Cách 1: Đưa mã này vào đầu một cấu hình Terraform .tf
(như được trình bày trong hướng dẫn nà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ỉ
dùng thử Terraform bằng Firebase.
Cách 2: Đưa nội dung vào một tệp .tf riêng biệt (chẳng hạn như provider.tf
), ngoài tệp .tf mà bạn chỉ định cơ sở hạ tầng
tạo (như tệp main.tf).
Hãy sử dụng lựa chọn này nếu bạn thuộc về một nhóm lớn hơn cần
chuẩn hoá quy trình thiết lập.
Khi chạy các lệnh Terraform, cả tệp provider.tf và
Tệp main.tf phải trong cùng thư mục.
Thêm phần thiết lập provider sau đây ở đầu tệp main.tf.
Bạn phải sử dụng trình cung cấp google-beta vì đây là bản phát hành beta của
thông qua Firebase với Terraform. Hãy thận trọng khi sử dụng phiên bản chính thức.
# 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ề chính sách
nhiều loại thuộc tính liên quan đến dự án
(bao gồm định dạng mà 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 đến phần tiếp theo để hoàn tất tệp cấu hình và chỉ định
cơ sở hạ tầng để tạo.
Chỉ định cơ sở hạ tầng cần tạo bằng khối resource
Trong tệp cấu hình Terraform (đối với hướng dẫn này là tệp main.tf), bạn cần
chỉ định tất cả cơ sở hạ tầng mà bạn muốn Terraform tạo ra (nghĩa là tất cả
tài nguyên bạn muốn cung cấp cũng như tất cả dịch vụ bạn muốn bật). Ngang bằng
hướng dẫn này, tìm danh sách đầy đủ tất cả
Cá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 thêm cấu hình sau của resource
chặn.
Ví dụ cơ bản này sẽ tạo một dự án Firebase mới, sau đó tạo một
Ứng dụng Android của 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,
]
}
Xem
phiên bản có chú thích của tệp cấu hình mẫu này
Nếu bạn không quen thuộc với cơ sở hạ tầng của các dự án và ứng dụng như
hãy xem lại 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 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 các lệnh Terraform để tạo cơ sở hạ tầng đã chỉ định
Để cung cấp tài nguyên và bật các dịch vụ được chỉ định trong 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.
Để biết thông tin chi tiết về các lệnh này, hãy xem
Tài liệu về địa hình.
Nếu đây là lần đầu tiên bạn chạy các lệnh Terraform trong
, bạn cần khởi chạy thư mục cấu hình và cài đặt
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 đây:
terraform apply
Xác nhận rằng mọi thứ đã được cấp phép hoặc bật như mong đợi:
Cách 1: Xem cấu hình được in trong dòng lệnh của bạn bằng cách chạy lệnh
sau đây:
Các tài nguyên Firebase có tính năng hỗ trợ Terraform
Firebase và các tài nguyên sau của Google có hỗ trợ Terraform. Và chúng tôi
luôn bổ sung tài nguyên! Vì vậy, nếu không thấy tài nguyên mà bạn
muốn quản lý bằng Terraform, sau đó hãy kiểm tra lại sớm để xem đã có dịch vụ này hay chưa
yêu cầu bằng cách
báo cáo sự cố trong kho lưu trữ GitHub.
google_identity_platform_config —
bật Google Cloud Identity Platform (GCIP) (nền tảng phụ trợ cho tính năng Xác thực Firebase)
và cung cấp chế độ cài đặt xác thực cấp dự án
Dự án trong đó Terraform sẽ bật tính năng Xác thực GCIP và/hoặc Firebase
phải có trong Gói giá linh hoạt (tức là dự án phải có
tài khoản thanh toán Cloud). Bạn có thể thực hiện việc này theo phương thức lập trình bằng
thiết lập
billing_account
trong tài nguyên google_project.
Tài nguyên này cũng hỗ trợ nhiều cấu hình hơn, chẳng hạn như phương thức đăng nhập cục bộ,
như xác thực ẩn danh, xác thực 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.
Triển khai Quy tắc bảo mật cơ sở dữ liệu theo thời gian thực của 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ả tuỳ chọn có 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 tính năng Xác thực Firebase bằng
Giao diện dòng lệnh (GCIP)
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
liên kết dự án với một tài khoản thanh toán Cloud (Gói giá linh hoạt)
là bắt buộc cho tính năng Xác thực Firebase bằng GCIP),
bật các dịch vụ Firebase cho dự án,
thiết lập phương thức xác thực Firebase bằng GCIP,
và đăng ký 3 loại ứng dụng khác nhau trong dự án.
Lưu ý rằng bạn phải bật GCIP để thiết lập tính năng 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,
]
}
Cung cấp
bản sao Cơ sở dữ liệu theo thời gian thực mặc định của Firebase
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
bậ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ý 3 loại ứng dụng khác nhau trong 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ấp phép nhiều
Các phiên bản Cơ sở dữ liệu theo thời gian thực của Firebase
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
liên kết dự án với một tài khoản thanh toán Cloud (Gói giá linh hoạt)
là bắt buộc cho nhiều phiên bản Cơ sở dữ liệu thời gian thực),
bật các dịch vụ Firebase cho dự án,
cung cấp nhiều phiên bản Cơ sở dữ liệu theo thời gian thực
(bao gồm cả phiên bản Cơ sở dữ liệu theo thời gian thực mặc định của dự án),
và đăng ký 3 loại ứng dụng khác nhau trong 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,
]
}
Cung cấp
Phiên bản Cloud Firestore
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
bậ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ý 3 loại ứng dụng khác nhau trong dự án.
Chính sách này cũng cung cấp Quy tắc bảo mật của Firebase cho phiên bản Cloud Firestore,
tạo một chỉ mục trên Cloud Firestore,
và thêm tài liệu trên Cloud Firestore có 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 các Quy tắc bảo mật Cloud Firestore phải nằm trong một tệp cục bộ
có tên là 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;
}
}
Cung cấp
bộ chứa mặc định của Cloud Storage
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
bật các dịch vụ Firebase cho dự án,
cung cấp bộ chứa Cloud Storage mặc định của dự án,
và đăng ký 3 loại ứng dụng khác nhau trong dự án.
Hướng dẫn này cũng cung cấp các Quy tắc bảo mật của Firebase cho bộ chứa Cloud Storage,
và tải một tệp lên bộ chứa.
# 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 các Quy tắc bảo mật của Cloud Storage cần có trong một tệp cục bộ
có tên là storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Cấp vốn
nhiều bộ chứa Cloud Storage
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
liên kết dự án với một tài khoản thanh toán Cloud (Gói giá linh hoạt)
là bắt buộc cho nhiều bộ chứa),
bật các dịch vụ Firebase cho dự án,
cấp phép cho nhiều bộ chứa Cloud Storage
(bao gồm bộ chứa Cloud Storage mặc định của dự án),
và đăng ký 3 loại ứng dụng khác nhau trong dự án.
Hướng dẫn này cũng cung cấp các Quy tắc bảo mật của Firebase cho các bộ chứa Cloud Storage,
và tải một tệp lên bộ chứa mặc định của Cloud Storage.
# Creates a new Google Cloud project.
resource "google_project" "storage-multi" {
provider = google-beta.no_user_project_override
folder_id = "folder-id-for-new-project"
name = "Project Display Name"
project_id = "project-id-for-new-project"
# Associates the project with a Cloud Billing account
# (required for multiple Cloud Storage buckets).
billing_account = "000000-000000-000000"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# Enables required APIs.
resource "google_project_service" "storage-multi" {
provider = google-beta.no_user_project_override
project = google_project.storage-multi.project_id
for_each = toset([
"cloudbilling.googleapis.com",
"serviceusage.googleapis.com",
"cloudresourcemanager.googleapis.com",
"firebaserules.googleapis.com",
"firebasestorage.googleapis.com",
"storage.googleapis.com",
])
service = each.key
# Don't disable the service if the resource block is removed by accident.
disable_on_destroy = false
}
# Enables Firebase services for the new project created above.
resource "google_firebase_project" "storage-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
}
# Provisions 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 các Quy tắc bảo mật của Cloud Storage cần có trong một tệp cục bộ
có tên là storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Cung cấp
Phiên bản Cloud Firestore và bộ chứa mặc định của Cloud Storage
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
bật các dịch vụ Firebase cho dự án,
cung cấp thực thể Cloud Firestore, và
sau đó cung cấp bộ chứa Cloud Storage mặc định.
Chính sách này cũng cung cấp các Quy tắc bảo mật của Firebase cho phiên bản Cloud Firestore và quy tắc mặc định
Bộ chứa Cloud Storage.
# 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 các Quy tắc bảo mật Cloud Firestore phải nằm trong một tệp cục bộ
có tên là 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 các Quy tắc bảo mật của Cloud Storage cần có trong một tệp cục bộ
có tên là storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Bảo vệ tài nguyên API
bằng tính năng Kiểm tra ứng dụng Firebase
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
bật các dịch vụ Firebase cho dự án, và
thiết lập và bật tính năng thực thi tính năng Kiểm tra ứng dụng Firebase cho Cloud Firestore
để bạn chỉ có thể truy cập vào tệp đó từ ứng dụng Android của mình.
# 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ài đặt
bản sao của một tiện ích Firebase
Cấu hình này sẽ tạo một dự án mới trên Google Cloud
bật các dịch vụ Firebase cho dự án, và
cài đặt một phiên bản mới của Tiện ích Firebase
trong dự án. Nếu đối tượng này đã tồn tại,
tham số của nó được cập nhật dựa trên 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
Bạn muốn
để tìm hiểu thêm về tất cả các thuộc tính khác nhau liên quan đến dự á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 "dự án".
project trong khối resource
Đề xuất: bất cứ khi nào có thể, hãy thêm thuộc tính project trong mỗi
Khối resource
Bằng cách thêm thuộc tính của 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à
tất cả 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.
Để cấp phé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 mức của chính bạn
Dự án Firebase. Tuy nhiên, bạn cần thiết lập dự án mới để dự án có thể chấp nhận
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 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 gcloud CLI
Các lệnh đã 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 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 của 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 xem được 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ụ của Firebase. Để khắc phục vấn đề này, hãy tạo một
Dự án Firebase thông qua
bảng điều khiển của 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á dữ liệu này ngay lập tức
dự án thông qua phần 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.
Hãy đợi vài phút rồi thử chạy lại terraform apply.
Chiến lược phát hành đĩa đơn
tạo tài nguyên không thành công, nhưng khi bạn chạy terraform apply
một lần nữa, thông báo hiển thị là 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.
Khi làm việc với
Cloud Firestore, bạn gặp lỗi này: Error creating Index: googleapi:
Error 409;...Concurrent access -- try again
Như đã xảy ra lỗi, 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 một lúc nhưng lại gặp lỗi đồng thời.
Hãy thử chạy lại terraform apply.
Bạn nhận được
lỗi này:
"you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes".
Lỗi này khiến Terraform không biết cần kiểm tra hạn mức
chống lại. Để khắc phục sự cố, hãy kiểm tra các mục sau trong khối resource:
Hãy đảm bảo bạn đã chỉ định giá trị cho thuộc tính project.
Đảm bảo bạn đang sử dụng nhà cung cấp với user_project_override = true
(không có bí danh). Giá trị này trong mẫu Firebase là google-beta.
Khi tạo một
dự án mới trên Google Cloud, bạn gặp lỗi mã dự án được chỉ định
dự án mới đã tồn tại.
Dưới đây là một số 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 liên kết với mã nhận dạng đó đã bị xoá (bằng thao tác xoá mềm
trạng thái).
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ề
cho bạn, sau đó kiểm tra trạng thái của dự án bằng cách sử dụng
API REST của projects.get.
Dự án được liên kết với mã nhận dạng đó tồn tại đúng đối với người dùng hiện tại. Đáp
nguyên nhân gây ra lỗi có thể là terraform apply trước đó đã xảy ra
bị gián đoạn.
Cách khắc phục: Chạy các lệnh sau: terraform import google_project.default PROJECT_ID
sau đó là terraform import google_firebase_project.default PROJECT_ID
Thời gian
cố gắng cung cấp Cloud Firestore rồi đến Cloud Storage (thông qua
google_app_engine_application), bạn sẽ gặp lỗi sau:
Error: Error creating App Engine application: googleapi: Error 409:
Cannot create Firestore database resource <resource-name> since it
already exists at location <location-id>, alreadyExists.
Ứng dụng App Engine cần có một 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 cho thấy,
nếu bạn đã cấp phép cho phiên bản Cloud Firestore của dự án trong một
vị trí, App Engine sẽ gặp lỗi nếu bạn cố gắng cung cấp một Cloud Firestore
thực thể ở một vị trí khác. App Engine cho rằng bạn đang cố gắng
"cấp phép lại" phiên bản Cloud Firestore hiện có.
Để khắc phục 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 một bộ chứa Cloud Storage trong một
khác với Cloud Firestore, bạn có thể cung cấp các bộ chứa bổ sung
(xem
cấu hình mẫu để tạo nhiều Cloud Storage
).
Thời gian
cố gắng cung cấp Cloud Storage (thông qua
google_app_engine_application) rồi đến Cloud Firestore, bạn sẽ có
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 bộ 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, sau đó sẽ tự động google_app_engine_application
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 cấp phép,
google_firestore_database sẽ gặp lỗi nếu bạn cố gắng cung cấp một cách rõ ràng
Phiên bản Cloud Firestore.
Sau khi cấp phép cho phiên bản Cloud Firestore của dự án, bạn sẽ không thể
"cấp phép lại" hoặc thay đổi vị trí của thiết bị. Để lỗi này không xảy ra nữa,
hãy xoá khối tài nguyên google_firestore_database khỏi tệp cấu hình.
Xin lưu ý rằng bạn nên cung cấp Cloud Firestore trước
bộ chứa Cloud Storage mặc định của dự án (xem lý do ở bên dưới).