بدأ دعم Firebase
Terraform:
في حال كنت ضمن فريق يريد إنشاء Firebase بشكل تلقائي وتوحيدي
بها موارد محددة متوفرة وخدمات مُفعّلة، ثم تستخدم
قد يكون تنسيق التضاريس باستخدام Firebase مناسبًا لك.
يتضمن سير العمل الأساسي لاستخدام Terraform مع Firebase ما يلي:
إنشاء وتخصيص ملف إعداد Terraform (ملف .tf) الذي
البنية الأساسية التي تريد توفيرها (أي الموارد التي
الخدمة التي تريد إعدادها والخدمات التي تريد تفعيلها).
استخدام أوامر gcloud CLI التي تتفاعل مع Terraform
توفير البنية الأساسية المحدَّدة في ملف .tf.
حذف البنية الأساسية الحالية وتعديلها باستخدام Terraform.
يمكنك إدارة التهيئة والمهام الخاصة بالمنتج باستخدام Terraform، مثل:
تفعيل مقدمي خدمة تسجيل الدخول لمصادقة Firebase.
إنشاء حِزم Cloud Storage أو مثيلات قاعدة البيانات والنشر
قواعد أمان Firebase الخاصة بهم.
يمكنك استخدام ملفات وأوامر تهيئة Terraform العادية لإنجاز كل هذه
المهام. ولمساعدتك في ذلك، قدّمنا
نماذج من ملفات تهيئة Terraform للعديد من الاستخدامات الشائعة
الحالات.
سير عمل معمَّم لاستخدام Terraform مع Firebase
المتطلبات الأساسية
يمثل هذا الدليل مقدمة عن استخدام Terraform مع Firebase، لذلك يفترض
الكفاءة الأساسية في استخدام Terraform. تأكَّد من إكمال ما يلي:
المتطلبات الأساسية قبل بدء سير العمل هذا.
تثبيت Terraform
وتعرّف على Terraform من خلال برامجهم التعليمية الرسمية.
إذا كنت تستخدم حساب مستخدم، يجب أن تكون قد قبلت بنود Firebase
الخدمة (بنود خدمة Firebase) أنّك وافقت على "بنود خدمة Firebase" إذا كان بإمكانك الاطّلاع على
لمشروع Firebase في
وحدة تحكُّم Firebase
لكي تتخذ Terraform إجراءات معينة (على سبيل المثال، إنشاء مشاريع)، يجب إنشاء
يجب أن يكون ما يلي صحيحًا:
يجب أن يمتلك حساب المستخدم أو الخدمة إذن الوصول الساري إلى إدارة الهوية وإمكانية الوصول من أجل
تلك الإجراءات.
إذا كان حساب المستخدم أو الخدمة جزءًا من مؤسسة على Google Cloud،
حينئذٍ يجب أن تسمح سياسات المؤسسة للحساب باتخاذ هذه الإجراءات.
الخطوة 1: إنشاء ملف إعداد Terraform وتخصيصه
يحتاج ملف التهيئة Terraform إلى قسمين رئيسيين (يتم وصفهما بالتفصيل
أدناه):
يجب إعداد provider بغض النظر عن المنتجات أو الخدمات في Firebase.
المشاركة.
أنشئ ملف إعداد Terraform (مثل ملف main.tf) في جهازك
الدليل.
في هذا الدليل، ستستخدم ملف الإعداد هذا لتحديد كل من provider
الإعداد وكل البنية الأساسية التي تريد أن تنشئها Terraform. ملاحظة:
ومع ذلك، لديك خيارات لكيفية تضمين إعداد الموفِّر.
الاطّلاع على خيارات الطريقة
لتضمين إعداد provider
تتوفّر لك الخيارات التالية لكيفية تضمين إعداد "provider" من أجل
بقية إعدادات Terraform:
الخيار 1: تضمينه في أعلى تهيئة واحدة.tf من مجموعات Terraform
(كما هو موضح في هذا الدليل).
يمكنك استخدام هذا الخيار في حال كنت في بداية استخدام Terraform أو
تجربة Terraform باستخدام Firebase.
الخيار 2: تضمينه في ملف .tf منفصل (مثل provider.tf
فقط)، باستثناء ملف .tf الذي تحدد فيه البنية الأساسية
إنشاء (مثل ملف main.tf).
استخدم هذا الخيار إذا كنت جزءًا من فريق أكبر يحتاج إلى
وتوحيد الإعداد.
عند تشغيل أوامر Terraform، يُظهر كل من الملف provider.tf
يجب أن يكون الملف main.tf في الدليل نفسه.
ضمِّن إعداد provider التالي في أعلى ملف main.tf.
يجب استخدام موفِّر خدمة "google-beta" لأنّه إصدار تجريبي من
باستخدام Firebase مع Terraform. يُرجى توخي الحذر عند الاستخدام في مرحلة الإنتاج.
# Terraform configuration to set up providers by version.
terraform {
required_providers {
google-beta = {
source = "hashicorp/google-beta"
version = "~> 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
}
يمكنك الاطّلاع على مزيد من المعلومات عن سياسة
أنواعًا مختلفة من السمات المتعلّقة بالمشروع
(بما في ذلك ما يسميه هذا الدليل "مشروع التحقق من الحصة") عند استخدام
تنسيق التضاريس باستخدام Firebase.
انتقِل إلى القسم التالي لإكمال ملف الإعداد وتحديد الملفات
البنية التحتية يجب إنشاؤها.
تحديد البنية الأساسية التي يجب إنشاؤها باستخدام وحدات resource
في ملف تهيئة Terraform (بالنسبة لهذا الدليل، ملف main.tf)، تحتاج إلى
تحديد جميع البنية التحتية التي تريد من Terraform إنشاءها (أي جميع
الموارد التي تريد توفيرها وجميع الخدمات التي تريد تفعيلها). ضِمن
هذا الدليل، والعثور على قائمة كاملة بجميع
موارد Firebase التي تتوافق مع Terraform.
افتح ملف main.tf.
ضمن إعداد provider، يجب تضمين إعدادات resource التالية.
مربّعات.
ينشئ هذا المثال الأساسي مشروع Firebase جديدًا ثم يُنشئ
تطبيق Firebase المتوافق مع Android ضمن هذا المشروع.
# 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,
]
}
عرض
نسخة توضيحية من مثال ملف الإعداد هذا
إذا لم تكن على دراية بالبنية الأساسية للمشروعات والتطبيقات
والموارد، فراجع الوثائق التالية:
# Terraform configuration to set up providers by version.
...
# Configures the provider to use the resource block's specified project for quota checks.
...
# Configures the provider to not use the resource block's specified project for quota checks.
...
# Creates a new Google Cloud project.
resource "google_project" "default" {
# Use the provider that enables the setup of quota checks for a new project
provider = google-beta.no_user_project_override
name = "Project Display Name" // learn more about the project name
project_id = "project-id-for-new-project" // learn more about the project ID
# Required for any service that requires the Blaze pricing plan
# (like Firebase Authentication with GCIP)
billing_account = "000000-000000-000000"
# Required for the project to display in any list of Firebase projects.
labels = {
"firebase" = "enabled" // learn more about the Firebase-enabled label
}
}
# Enables required APIs.
resource "google_project_service" "default" {
# Use the provider without quota checks for enabling APIS
provider = google-beta.no_user_project_override
project = google_project.default.project_id
for_each = toset([
"cloudbilling.googleapis.com",
"cloudresourcemanager.googleapis.com",
"firebase.googleapis.com",
# Enabling the ServiceUsage API allows the new project to be quota checked from now on.
"serviceusage.googleapis.com",
])
service = each.key
# Don't disable the service if the resource block is removed by accident.
disable_on_destroy = false
}
# Enables Firebase services for the new project created above.
# This action essentially "creates a Firebase project" and allows the project to use
# Firebase services (like Firebase Authentication) and
# Firebase tooling (like the Firebase console).
# Learn more about the relationship between Firebase projects and Google Cloud.
resource "google_firebase_project" "default" {
# Use the provider that performs quota checks from now on
provider = google-beta
project = google_project.default.project_id
# Waits for the required APIs to be enabled.
depends_on = [
google_project_service.default
]
}
# Creates a Firebase Android App in the new project created above.
# Learn more about the relationship between Firebase Apps and Firebase projects.
resource "google_firebase_android_app" "default" {
provider = google-beta
project = google_project.default.project_id
display_name = "My Awesome Android app" # learn more about an app's display name
package_name = "awesome.package.name" # learn more about an app's package name
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.default,
]
}
الخطوة 2: تشغيل أوامر Terraform لإنشاء البنية الأساسية المحددة
لتوفير الموارد وتفعيل الخدمات المحدّدة في main.tf
شغِّل الأوامر التالية من الدليل نفسه الذي يتضمن ملف main.tf.
للحصول على معلومات تفصيلية حول هذه الأوامر، يمكنك الاطّلاع على
مستندات مكوّنة من تِراميات خارجية:
إذا كانت هذه هي المرة الأولى التي تُشغِّل فيها أوامر Terraform في
الدليل، فستحتاج إلى تهيئة دليل التهيئة وتثبيت
موفِّر خدمة Google Terraform. يمكنك إجراء ذلك عن طريق تشغيل الأمر التالي:
terraform init
أنشئ البنية الأساسية المحددة في ملف main.tf من خلال تشغيل
الأمر التالي:
terraform apply
تأكَّد من أنّه تمت إدارة حسابات جميع الخدمات أو تفعيلها على النحو المتوقّع:
الخيار 1: راجِع الإعدادات المطبوعة في الوحدة الطرفية من خلال تشغيل
الأمر التالي:
تتوافق موارد Firebase وGoogle التالية مع Terraform. ونحن
وإضافة المزيد من الموارد طوال الوقت! لذلك إذا لم يظهر لك المورد
وترغب في إدارتها باستخدام Terraform، ثم أعد التحقق قريبًا لمعرفة ما إذا كان متاحًا أو
طلبه عن طريق
الإبلاغ عن مشكلة في مستودع GitHub
google_identity_platform_config —
تفعيل Google Cloud Identity Platform (GCIP) (وهو الواجهة الخلفية لمصادقة Firebase)
وتوفير إعدادات المصادقة على مستوى المشروع
المشروع الذي ستفعّل فيه Terraform GCIP و/أو مصادقة Firebase
أن يكون ضمن خطة أسعار Blaze (أي أن المشروع يجب أن يكون له
حساب فوترة Cloud مرتبط بحسابك). يمكنك القيام بذلك آليًا عن طريق
ضبط
billing_account
في مورد google_project.
يتيح هذا المورد أيضًا المزيد من الإعدادات، مثل طرق تسجيل الدخول المحلية
مثل مصادقة الهوية المجهولة، والبريد الإلكتروني/كلمة المرور، ومصادقة الهاتف، وكذلك
دوال الحظر والنطاقات المسموح بها.
نماذج من ملفات الإعداد Terraform لحالات الاستخدام الشائعة
إعداد مصادقة Firebase باستخدام
برنامج GCIP
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
ربط المشروع بحساب فوترة Cloud (خطة أسعار Blaze
مطلوبة لمصادقة Firebase باستخدام GCIP)،
لتمكين خدمات Firebase للمشروع،
لإعداد مصادقة Firebase باستخدام GCIP
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
تجدر الإشارة إلى أنّ تفعيل GCIP مطلوب لإعداد مصادقة Firebase عبر 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,
]
}
توفير
المثيل التلقائي لقاعدة بيانات Firebase في الوقت الفعلي
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
لتمكين خدمات Firebase للمشروع،
مثيل قاعدة البيانات الافتراضية للمشروع،
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
# 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,
]
}
توفير حسابات متعددة
مثيلات قاعدة بيانات Firebase في الوقت الفعلي
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
ربط المشروع بحساب فوترة Cloud (خطة أسعار Blaze
مطلوب لمثيلات قاعدة بيانات الوقت الفعلي المتعددة)،
لتمكين خدمات Firebase للمشروع،
توفّر مثيلات متعددة لقاعدة البيانات في الوقت الفعلي
(بما في ذلك مثيل قاعدة بيانات الوقت الفعلي الافتراضية للمشروع)،
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
# 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,
]
}
توفير
مثيل Cloud Firestore
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
لتمكين خدمات Firebase للمشروع،
توفير مثيل Cloud Firestore الخاص بالمشروع
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
وتفرض أيضًا قواعد أمان Firebase لمثيل Cloud Firestore،
ينشئ فهرس Cloud Firestore،
وتضيف مستند Cloud Firestore مع بيانات المحتوى الأساسي.
# Creates a new Google Cloud project.
resource "google_project" "firestore" {
provider = google-beta.no_user_project_override
folder_id = "folder-id-for-new-project"
name = "Project Display Name"
project_id = "project-id-for-new-project"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# Enables required APIs.
resource "google_project_service" "firestore" {
provider = google-beta.no_user_project_override
project = google_project.firestore.project_id
for_each = toset([
"cloudresourcemanager.googleapis.com",
"serviceusage.googleapis.com",
"firestore.googleapis.com",
"firebaserules.googleapis.com",
])
service = each.key
# Don't disable the service if the resource block is removed by accident.
disable_on_destroy = false
}
# Enables Firebase services for the new project created above.
resource "google_firebase_project" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
}
# Provisions the Firestore database instance.
resource "google_firestore_database" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
name = "(default)"
# See available locations: https://firebase.google.com/docs/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,
]
}
هذه هي مجموعة قواعد أمان Cloud Firestore التي يجب أن تكون في ملف محلي
تُسمَّى 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;
}
}
توفير
الحزمة التلقائية على Cloud Storage
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
لتمكين خدمات Firebase للمشروع،
توفير حزمة Cloud Storage التلقائية للمشروع
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
وتوفّر أيضًا قواعد أمان Firebase لحزمة Cloud Storage،
وتحمّل ملفًا إلى الحزمة.
# 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,
]
}
هذه هي مجموعة قواعد أمان Cloud Storage التي يجب أن تكون في ملف على الجهاز.
تُسمَّى storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
التمويل
حِزم متعدّدة في Cloud Storage
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
ربط المشروع بحساب فوترة Cloud (خطة أسعار Blaze
مطلوبة لمجموعات بيانات متعددة)،
لتمكين خدمات Firebase للمشروع،
توفير عدة حِزم Cloud Storage
(بما في ذلك حزمة Cloud Storage التلقائية للمشروع)
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
وتوفّر هذه السياسة أيضًا قواعد أمان Firebase لحِزم Cloud Storage،
وتحمِّل ملفًا إلى الحزمة التلقائية على Cloud Storage.
# Creates a new Google Cloud project.
resource "google_project" "storage-multi" {
provider = google-beta.no_user_project_override
folder_id = "folder-id-for-new-project"
name = "Project Display Name"
project_id = "project-id-for-new-project"
# Associates the project with a Cloud Billing account
# (required for multiple Cloud Storage buckets).
billing_account = "000000-000000-000000"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# Enables required APIs.
resource "google_project_service" "storage-multi" {
provider = google-beta.no_user_project_override
project = google_project.storage-multi.project_id
for_each = toset([
"cloudbilling.googleapis.com",
"serviceusage.googleapis.com",
"cloudresourcemanager.googleapis.com",
"firebaserules.googleapis.com",
"firebasestorage.googleapis.com",
"storage.googleapis.com",
])
service = each.key
# Don't disable the service if the resource block is removed by accident.
disable_on_destroy = false
}
# Enables Firebase services for the new project created above.
resource "google_firebase_project" "storage-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
}
# Provisions 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,
]
}
هذه هي مجموعة قواعد أمان Cloud Storage التي يجب أن تكون في ملف على الجهاز.
تُسمَّى storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
توفير
مثيل Cloud Firestore وحزمة Cloud Storage التلقائية
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
لتمكين خدمات Firebase للمشروع،
يقدم مثيل Cloud Firestore
توفير الحزمة التلقائية على Cloud Storage
وتوفِّر أيضًا قواعد أمان Firebase لمثيل Cloud Firestore والأداة التلقائية
حزمة 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
}
هذه هي مجموعة قواعد أمان Cloud Firestore التي يجب أن تكون في ملف محلي
تُسمَّى 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;
}
}
هذه هي مجموعة قواعد أمان Cloud Storage التي يجب أن تكون في ملف على الجهاز.
تُسمَّى storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
حماية مورد واجهة برمجة التطبيقات
باستخدام ميزة "فحص التطبيقات من Firebase"
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
وتفعيل خدمات Firebase للمشروع
إعداد وتفعيل ميزة "فحص التطبيقات من Firebase" في Cloud Firestore
لكي لا يمكن الوصول إليه إلا من خلال تطبيق Android.
# Creates a new Google Cloud project.
resource "google_project" "appcheck" {
provider = google-beta.no_user_project_override
folder_id = "folder-id-for-new-project"
name = "Project Display Name"
project_id = "project-id-for-new-project"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# Enables required APIs.
resource "google_project_service" "services" {
provider = google-beta.no_user_project_override
project = google_project.appcheck.project_id
for_each = toset([
"cloudresourcemanager.googleapis.com",
"firebase.googleapis.com",
"firebaseappcheck.googleapis.com",
"firestore.googleapis.com",
"serviceusage.googleapis.com",
])
service = each.key
# Don't disable the service if the resource block is removed by accident.
disable_on_destroy = false
}
# Enables Firebase services for the new project created earlier.
resource "google_firebase_project" "appcheck" {
provider = google-beta
project = google_project.appcheck.project_id
depends_on = [google_project_service.services]
}
# Provisions the Firestore database instance.
resource "google_firestore_database" "database" {
provider = google-beta
project = google_firebase_project.appcheck.project
name = "(default)"
# See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
location_id = "name-of-region"
# "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.
type = "FIRESTORE_NATIVE"
concurrency_mode = "OPTIMISTIC"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore.
depends_on = [
google_firebase_project.appcheck,
]
}
# Creates a Firebase Android App in the new project created earlier.
resource "google_firebase_android_app" "appcheck" {
provider = google-beta
project = google_firebase_project.appcheck.project
display_name = "Play Integrity app"
package_name = "package.name.playintegrity"
sha256_hashes = [
# TODO: insert your Android app's SHA256 certificate
]
}
# It takes a while for App Check to recognize the new app
# If your app already exists, you don't have to wait 30 seconds.
resource "time_sleep" "wait_30s" {
depends_on = [google_firebase_android_app.appcheck]
create_duration = "30s"
}
# Register the Android app with the Play Integrity provider
resource "google_firebase_app_check_play_integrity_config" "appcheck" {
provider = google-beta
project = google_firebase_project.appcheck.project
app_id = google_firebase_android_app.appcheck.app_id
depends_on = [time_sleep.wait_30s, google_firestore_database.database]
lifecycle {
precondition {
condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0
error_message = "Provide a SHA-256 certificate on the Android App to use App Check"
}
}
}
# Enable enforcement of App Check for Firestore
resource "google_firebase_app_check_service_config" "firestore" {
provider = google-beta
project = google_firebase_project.appcheck.project
service_id = "firestore.googleapis.com"
depends_on = [google_project_service.services]
}
تثبيت
مثيل لإحدى إضافات Firebase
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud
وتفعيل خدمات Firebase للمشروع
تثبِّت نسخة جديدة من إضافة Firebase
من المشروع. إذا كان المثيل موجودًا بالفعل،
ويتم تعديل معلَماتها استنادًا إلى القيم المقدَّمة في الإعداد.
# 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"
}
}
}
تحديد المشاكل وحلّها والأسئلة الشائعة
تريد
لمعرفة المزيد حول جميع السمات المختلفة المتعلقة بالمشروع (مثل
project وuser_project_override)
يستخدم هذا الدليل سمات Terraform التالية عند التعامل مع "المشاريع".
project في مجموعة resource
ننصح بتضمين السمة project في كل سمة، متى أمكن ذلك.
قطعة resource
من خلال تضمين سمة المشروع، ستنشئ Terraform البنية التحتية
المحددة في كتلة الموارد ضمن المشروع المحدد. يتضمن هذا الدليل
تستخدم جميع نماذج ملفات التهيئة هذه الممارسة.
لإدارة معظم الموارد، يجب عليك استخدام
user_project_override = true، ما يعني التحقّق من حصة مساحة التخزين الخاصة بك.
مشروع على Firebase. ومع ذلك، لإعداد مشروعك الجديد بحيث يمكنه قبول
للتحقق من الحصة، عليك أولاً استخدام user_project_override = false.
يظهر لك هذا الخطأ:
generic::permission_denied: Firebase Tos Not Accepted
تأكَّد من أنّ حساب المستخدم الذي تستخدمه لتشغيل gcloud CLI
قبِلت الأوامر بنود خدمة Firebase (بنود خدمة Firebase).
يمكنك إجراء عملية التحقّق هذه باستخدام متصفّح تم تسجيل الدخول إلى حساب المستخدم عليه
محاولة عرض مشروع حالي في Firebase في
وحدة تحكُّم Firebase: إذا كان بإمكانك الاطّلاع على
مشروع حالي في Firebase، فإن حساب المستخدم قد قبل
بنود خدمة Firebase
إذا لم تتمكّن من عرض أي مشروع حالي في Firebase، سيتعين عليك حينئذٍ حساب
ربما لم تقبل بنود خدمة Firebase. لحلّ هذه المشكلة، عليك إنشاء حساب جديد
مشروع Firebase من خلال
وحدة تحكُّم Firebase وقبول
بنود خدمة Firebase كجزء من عملية إنشاء المشروع. يمكنك حذف هذا العنصر على الفور.
المشروع من خلال إعدادات المشروع في وحدة التحكم.
بعد التشغيل
terraform apply، في ما يلي رسالة الخطأ التي تظهر لك:
generic::permission_denied: IAM authority does not have the
permission
يُرجى الانتظار بضع دقائق، ثم محاولة تشغيل terraform apply مرة أخرى.
تشير رسالة الأشكال البيانية
تعذّر إنشاء مورد، ولكن عند تشغيل terraform apply
مرة أخرى، هي ALREADY_EXISTS.
قد يرجع ذلك إلى تأخير النشر في أنظمة مختلفة. محاولة حلّ هذه المشكلة
من خلال استيراد المورد إلى حالة Terraform عن طريق تشغيل
terraform import بعد ذلك، حاوِل تشغيل "terraform apply" مرة أخرى.
يمكنك التعرّف على كيفية استيراد كل مورد في القسم "استيراد". القسم الخاص بها
وثائق الترابي (على سبيل المثال،
"استيراد" Cloud Firestore).
عند العمل مع
Cloud Firestore، حدث الخطأ التالي: Error creating Index: googleapi:
Error 409;...Concurrent access -- try again
كما يشير الخطأ، قد تحاول Terraform توفير فهارس متعددة
و/أو أثناء إنشاء مستند في الوقت نفسه وحدث خطأ في التزامن.
يُرجى محاولة تشغيل "terraform apply" مرة أخرى.
الميزات
هذا الخطأ:
"you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes"
يعني هذا الخطأ أنّ Terraform لا يمكنه معرفة المشروع المطلوب التحقق من الحصة
ضد. لتحديد المشاكل وحلّها، يُرجى الاطّلاع على ما يلي في مجموعة "resource":
تأكَّد من أنّك حدّدت قيمة لسمة project.
تأكَّد من استخدام مقدِّم الخدمة مع user_project_override = true.
(بدون اسم مستعار)، والذي يمثل google-beta في نماذج Firebase.
عند إنشاء
مشروع جديد على Google Cloud، فستحصل على الخطأ الذي يحدده رقم تعريف المشروع
المشروع الجديد موجود بالفعل.
في ما يلي الأسباب المحتملة لحدوث رقم تعريف المشروع حاليًا:
المشروع المرتبط برقم التعريف هذا يملكه شخص آخر.
لحلّ المشكلة: اختَر رقم تعريف مشروع آخر.
المشروع المرتبط برقم التعريف هذا تم حذفه مؤخرًا (في عملية حذف أوّلية)
).
لحلّ المشكلة: في حال اعتقادك أنّ المشروع المرتبط برقم التعريف ينتمي إلى
لك، ثم تحقق من حالة المشروع باستخدام
projects.get REST API.
المشروع المرتبط برقم التعريف هذا متوفّر بشكل صحيح لدى المستخدم الحالي. حاسمة
ربما يكون السبب المحتمل للخطأ هو تلقي terraform apply سابق
تمت مقاطعته.
فعندما
محاولة توفير المتطلبات اللازمة لمنصة Cloud Firestore ثم على Cloud Storage (عبر
google_app_engine_application)، فيظهر لك الخطأ التالي:
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
يتطلب تطبيق App Engine مثيل Cloud Firestore، ولكن يمكنك فقط
على مثيل Cloud Firestore واحد لكل مشروع. لذلك، كما تشير رسالة الخطأ،
إذا سبق لك توفير المتطلبات اللازمة لمثيل Cloud Firestore الخاص بالمشروع في جلسة واحدة
الموقع الجغرافي، سيظهر خطأ App Engine إذا حاولت إعداد Cloud Firestore
مثال في موقع مختلف. تعتقد App Engine أنك تحاول
"إعادة إدارة الحسابات" مثيل Cloud Firestore الحالي.
لحلّ هذا الخطأ، استخدِم الموقع الجغرافي نفسه لكل من Cloud Firestore
تطبيق App Engine. إذا كنت بحاجة إلى حزمة Cloud Storage في
موقع مختلف عن Cloud Firestore، فيمكنك توفير مجموعات إضافية
(اطّلِع على
نموذج من الإعدادات لإنشاء عدة خدمات في Cloud Storage
البيانات).
فعندما
محاولة توفير خدمة Cloud Storage (عبر
google_app_engine_application) ثم Cloud Firestore،
هذا الخطأ:
Error: Error creating Database: googleapi: Error 409: Database already
exists. Please use another database_id
عند توفير الحزمة التلقائية على Cloud Storage لمشروع (من خلال
google_app_engine_application) ولم يتضمن المشروع حتى الآن
مثيل Cloud Firestore، ثم يتم تحصيل google_app_engine_application تلقائيًا
في مثيل Cloud Firestore للمشروع.
مثلاً، إذا سبق توفير مثيل Cloud Firestore الخاص بمشروعك،
سيظهر خطأ google_firestore_database عند محاولة توفير المتطلبات اللازمة
مثيل Cloud Firestore
بعد توفير المتطلبات اللازمة لمثيل Cloud Firestore الخاص بالمشروع، لن تتمكّن
"إعادة إدارة الحسابات" أو تغيير موقعه. لمنع حدوث الخطأ،
أزِل كتلة موارد google_firestore_database من ملف الإعداد.
مع ذلك، ننصحك بتوفير المتطلبات اللازمة لخدمة Cloud Firestore قبل
الحزمة التلقائية على Cloud Storage الخاصة بالمشروع (اطّلِع على القسم أدناه لمعرفة السبب).