بدأ Firebase في دعم Terraform . إذا كنت ضمن فريق يريد أتمتة وتوحيد إنشاء مشاريع Firebase مع توفير موارد محددة وتمكين الخدمات، فإن استخدام Terraform مع Firebase يمكن أن يكون مناسبًا لك.
يتضمن سير العمل الأساسي لاستخدام Terraform مع Firebase ما يلي:
إنشاء وتخصيص ملف تكوين Terraform (ملف
.tf
) الذي يحدد البنية الأساسية التي تريد توفيرها (أي الموارد التي تريد توفيرها والخدمات التي تريد تمكينها).استخدام أوامر gCloud CLI التي تتفاعل مع Terraform لتوفير البنية الأساسية المحددة في ملف
.tf
.
ماذا يمكنك أن تفعل مع Terraform وFirebase؟
مثال سير العمل المعمم في هذا الدليل هو إنشاء مشروع Firebase جديد باستخدام تطبيق Android. ولكن يمكنك فعل الكثير باستخدام Terraform، مثل:
حذف وتعديل البنية التحتية الحالية باستخدام Terraform.
إدارة التكوين والمهام الخاصة بالمنتج باستخدام Terraform، مثل:
- تمكين موفري تسجيل الدخول لمصادقة Firebase.
- إنشاء مجموعات التخزين السحابي أو مثيلات قاعدة البيانات ونشر قواعد أمان Firebase لها.
يمكنك استخدام ملفات وأوامر تكوين Terraform القياسية لإنجاز كل هذه المهام. ولمساعدتك في ذلك، قدمنا نماذج لملفات تكوين Terraform للعديد من حالات الاستخدام الشائعة.
سير العمل المعمم لاستخدام Terraform مع Firebase
المتطلبات الأساسية
يعد هذا الدليل مقدمة لاستخدام Terraform مع Firebase، لذا فهو يفترض الكفاءة الأساسية في استخدام Terraform. تأكد من إكمال المتطلبات الأساسية التالية قبل بدء سير العمل هذا.
قم بتثبيت Terraform والتعرف على Terraform باستخدام البرامج التعليمية الرسمية الخاصة بهم.
قم بتثبيت Google Cloud CLI (gCloud CLI). تسجيل الدخول باستخدام حساب المستخدم أو حساب الخدمة .
- في حالة استخدام حساب مستخدم، يجب أن تكون قد قبلت شروط خدمة Firebase (Firebase ToS). لقد قبلت بنود خدمة Firebase إذا كان بإمكانك عرض مشروع Firebase في وحدة تحكم Firebase
- لكي يتخذ Terraform إجراءات معينة (على سبيل المثال، إنشاء مشاريع)، يجب أن يكون ما يلي صحيحًا:
- يجب أن يتمتع حساب المستخدم أو الخدمة بحق الوصول IAM المطبق لهذه الإجراءات.
- إذا كان حساب المستخدم أو الخدمة جزءًا من مؤسسة Google Cloud، فيجب أن تسمح سياسات المؤسسة للحساب باتخاذ هذه الإجراءات.
الخطوة 1: إنشاء وتخصيص ملف تكوين Terraform
يحتاج ملف تكوين Terraform إلى قسمين رئيسيين (يتم وصفهما بالتفصيل أدناه):
- قسم إعداد
provider
الذي يحدد موارد Terraform التي يمكن الوصول إليها - قسم من كتل
resource
الفردية التي تحدد البنية الأساسية المراد إنشاؤها
قم بإعداد provider
الخاص بك
يلزم إعداد provider
بغض النظر عن منتجات أو خدمات Firebase المعنية.
قم بإنشاء ملف تكوين Terraform (مثل ملف
main.tf
) في دليلك المحلي.في هذا الدليل، ستستخدم ملف التكوين هذا لتحديد إعداد
provider
وكل البنية الأساسية التي تريد من Terraform إنشاءها. ومع ذلك، لاحظ أن لديك خيارات لكيفية تضمين إعداد الموفر.لديك الخيارات التالية لكيفية تضمين إعداد
provider
لبقية تكوين Terraform الخاص بك:الخيار 1: قم بتضمينه في أعلى ملف تكوين Terraform
.tf
واحد (كما هو موضح في هذا الدليل).- استخدم هذا الخيار إذا كنت قد بدأت للتو في استخدام 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 }
تعرف على المزيد حول الأنواع المختلفة للسمات المتعلقة بالمشروع (بما في ذلك ما يسميه هذا الدليل "مشروع التحقق من الحصص") عند استخدام Terraform مع 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, ] }
إذا لم تكن على دراية بالبنية الأساسية للمشاريع والتطبيقات كموارد، فراجع الوثائق التالية:
- فهم مشاريع Firebase
- الوثائق المرجعية لإدارة مشروع Firebase
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { # 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 .
إذا كانت هذه هي المرة الأولى التي تقوم فيها بتشغيل أوامر Terraform في الدليل، فستحتاج إلى تهيئة دليل التكوين وتثبيت موفر Google Terraform. قم بذلك عن طريق تشغيل الأمر التالي:
terraform init
قم بإنشاء البنية الأساسية المحددة في ملف
main.tf
الخاص بك عن طريق تشغيل الأمر التالي:terraform apply
تأكد من توفير كل شيء أو تمكينه كما هو متوقع:
الخيار 1: راجع التكوين المطبوع في جهازك الطرفي عن طريق تشغيل الأمر التالي:
terraform show
الخيار 2: عرض مشروع Firebase الخاص بك في وحدة تحكم Firebase .
موارد Firebase مع دعم Terraform
تتمتع موارد Firebase وGoogle التالية بدعم Terraform. ونحن نضيف المزيد من الموارد في كل وقت! لذا، إذا كنت لا ترى المورد الذي تريد إدارته باستخدام Terraform، فتحقق مرة أخرى قريبًا لمعرفة ما إذا كان متاحًا أو اطلبه عن طريق تقديم مشكلة في GitHub repo .
مشروع Firebase وإدارة التطبيقات
google_firebase_project
— تمكين خدمات Firebase في مشروع Google Cloud الحاليgoogle_firebase_project_location
- قم بتعيين موقع موارد Google Cloud الافتراضية للمشروعتطبيقات فايربيس
-
google_firebase_apple_app
— إنشاء أو إدارة تطبيق منصات Firebase Apple -
google_firebase_android_app
— إنشاء أو إدارة تطبيق Firebase Android -
google_firebase_web_app
— إنشاء تطبيق ويب Firebase أو إدارته
-
مصادقة Firebase
google_identity_platform_config
— تمكين Google Cloud Identity Platform (GCIP) (وهو الواجهة الخلفية لمصادقة Firebase) وتوفير إعدادات المصادقة على مستوى المشروعيتطلب تكوين مصادقة Firebase عبر Terraform تمكين GCIP. تأكد من مراجعة نموذج ملف
.tf
للتعرف على كيفية إعداد مصادقة Firebase .يجب أن يكون المشروع الذي ستقوم فيه Terraform بتمكين GCIP و/أو مصادقة Firebase مدرجًا في خطة تسعير Blaze (أي، يجب أن يكون للمشروع حساب فوترة سحابية مرتبط). يمكنك إجراء ذلك برمجيًا عن طريق تعيين سمة
billing_account
في موردgoogle_project
.يتيح هذا المورد أيضًا المزيد من التكوينات، مثل طرق تسجيل الدخول المحلية، مثل المجهول والبريد الإلكتروني/كلمة المرور ومصادقة الهاتف، بالإضافة إلى وظائف الحظر والمجالات المعتمدة.
google_identity_platform_default_supported_idp_config
— تكوين موفري الهوية المتحدين المشتركين، مثل Google أو Facebook أو Appleidentity_platform_oauth_idp_config
— تكوين مصادر موفر هوية OAuth (IdP) التعسفيةgoogle_identity_platform_inbound_saml_config
— تكوين عمليات تكامل SAML
غير مدعوم بعد:
- تكوين المصادقة متعددة العوامل (MFA) عبر Terraform
قاعدة بيانات Firebase في الوقت الحقيقي
-
google_firebase_database_instance
— إنشاء مثيل لقاعدة البيانات في الوقت الفعلي
غير مدعوم بعد:
- نشر قواعد أمان قاعدة بيانات Firebase Realtime عبر Terraform (تعرف على كيفية نشر هذه القواعد باستخدام أدوات أخرى، بما في ذلك الخيارات البرمجية)
سحابة فايرستور
google_firestore_database
- إنشاء مثيل Cloud Firestoregoogle_firestore_index
— تمكين الاستعلامات الفعالة لـ Cloud Firestoregoogle_firestore_document
— قم بتجميع مثيل Cloud Firestore مع مستند محدد في مجموعةهام: لا تستخدم بيانات المستخدم النهائي أو بيانات الإنتاج الحقيقية في هذا المستند الأولي.
التخزين السحابي لـ Firebase
google_firebase_storage_bucket
- إتاحة الوصول إلى مجموعة التخزين السحابية الحالية لحزم Firebase SDK والمصادقة وقواعد أمان Firebase- يتطلب إعداد مجموعة Cloud Storage الافتراضية لمشروع Firebase أولاً توفير
google_app_engine_application
. تأكد من مراجعة نموذج ملف.tf
للتعرف على كيفية توفير مجموعات التخزين السحابي .
- يتطلب إعداد مجموعة Cloud Storage الافتراضية لمشروع Firebase أولاً توفير
google_storage_bucket_object
- إضافة كائن إلى مجموعة التخزين السحابيهام: لا تستخدم بيانات المستخدم النهائي أو بيانات الإنتاج الحقيقية في هذا الملف.
قواعد أمان Firebase (لـ Cloud Firestore وCloud Storage)
لاحظ أن قاعدة بيانات Firebase Realtime تستخدم نظام توفير مختلفًا لقواعد أمان Firebase الخاصة بها.
google_firebaserules_ruleset
- تحديد قواعد أمان Firebase التي تنطبق على مثيل Cloud Firestore أو مجموعة Cloud Storagegoogle_firebaserules_release
— نشر مجموعات قواعد محددة على مثيل Cloud Firestore أو مجموعة Cloud Storage
فحص تطبيق Firebase
-
google_firebase_app_check_service_config
- تمكين فرض التحقق من التطبيق للخدمة -
google_firebase_app_check_app_attest_config
- قم بتسجيل تطبيق أنظمة Apple الأساسية مع موفر App Attest -
google_firebase_app_check_device_check_config
- قم بتسجيل تطبيق أنظمة Apple الأساسية مع موفر DeviceCheck -
google_firebase_app_check_play_integrity_config
- قم بتسجيل تطبيق Android مع موفر Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
- تسجيل تطبيق ويب مع موفر reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
- تسجيل تطبيق ويب مع موفر reCAPTCHA v3 -
google_firebase_app_check_debug_token
- استخدم الرموز المميزة لتصحيح الأخطاء للاختبار
ملحقات Firebase
-
google_firebase_extensions_instance
— تثبيت أو تحديث مثيل لملحق Firebase
نموذج لملفات تكوين Terraform لحالات الاستخدام الشائعة
يقوم هذا التكوين بإنشاء مشروع Google Cloud جديد، وربط المشروع بحساب Cloud Billing (خطة تسعير 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, ] }
يقوم هذا التكوين بإنشاء مشروع Google Cloud جديد، وتمكين خدمات Firebase للمشروع، وتوفير مثيل قاعدة بيانات Realtime الافتراضية للمشروع، وتسجيل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
# 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, ] }
يقوم هذا التكوين بإنشاء مشروع Google Cloud جديد، وربط المشروع بحساب Cloud Billing (خطة تسعير Blaze مطلوبة لمثيلات قاعدة بيانات Realtime متعددة)، وتمكين خدمات Firebase للمشروع، وتوفير مثيلات قاعدة بيانات Realtime متعددة (بما في ذلك قاعدة بيانات Realtime الافتراضية للمشروع مثيل)، ويسجل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
# 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, ] }
يقوم هذا التكوين بإنشاء مشروع 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; } }
يقوم هذا التكوين بإنشاء مشروع Google Cloud جديد، وتمكين خدمات Firebase للمشروع، وتوفير مجموعة التخزين السحابي الافتراضية للمشروع، وتسجيل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
كما أنه يوفر قواعد أمان Firebase لحاوية التخزين السحابي، ويقوم بتحميل ملف إلى المجموعة.
# 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, ] }
هذه هي مجموعة قواعد قواعد أمان التخزين السحابي والتي يجب أن تكون موجودة في ملف محلي يسمى storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
يقوم هذا التكوين بإنشاء مشروع Google Cloud جديد، وربط المشروع بحساب Cloud Billing (خطة تسعير Blaze مطلوبة لمجموعات متعددة)، وتمكين خدمات Firebase للمشروع، وتوفير مجموعات تخزين سحابية متعددة (بما في ذلك مجموعة التخزين السحابي الافتراضية للمشروع) ، ويسجل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
كما أنه يوفر قواعد أمان Firebase لحاويات التخزين السحابي، ويقوم بتحميل ملف إلى حاوية التخزين السحابي الافتراضية.
# 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, ] }
هذه هي مجموعة قواعد قواعد أمان التخزين السحابي والتي يجب أن تكون موجودة في ملف محلي يسمى storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
يقوم هذا التكوين بإنشاء مشروع 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; } }
هذه هي مجموعة قواعد قواعد أمان التخزين السحابي والتي يجب أن تكون موجودة في ملف محلي يسمى storage.rules
.
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
يقوم هذا التكوين بإنشاء مشروع Google Cloud جديد، وتمكين خدمات Firebase للمشروع، وإعداد وتمكين تطبيق Firebase App Check for 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] }
يقوم هذا التكوين بإنشاء مشروع 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" } } }
استكشاف الأخطاء وإصلاحها والأسئلة الشائعة
يستخدم هذا الدليل سمات Terraform التالية عند العمل مع "المشاريع".
-
project
ضمن كتلةresource
موصى به: كلما أمكن، قم بتضمين سمة
project
داخل كل كتلةresource
من خلال تضمين سمة المشروع، سيقوم Terraform بإنشاء البنية التحتية المحددة في كتلة الموارد داخل المشروع المحدد. يستخدم هذا الدليل وملفات التكوين النموذجية لدينا هذه الممارسة.
راجع وثائق Terraform الرسمية حول
project
.-
user_project_override
داخل كتلةprovider
لتوفير معظم الموارد، يجب عليك استخدام
user_project_override = true
، مما يعني التحقق من الحصة النسبية مقابل مشروع Firebase الخاص بك. ومع ذلك، لإعداد مشروعك الجديد بحيث يمكنه قبول فحوصات الحصص، تحتاج أولاً إلى استخدامuser_project_override = false
.راجع وثائق Terraform الرسمية حول
user_project_override
.
تأكد من أن حساب المستخدم الذي تستخدمه لتشغيل أوامر gCloud CLI قد قبل شروط خدمة Firebase (Firebase ToS).
يمكنك إجراء هذا التحقق باستخدام متصفح تم تسجيل دخوله إلى حساب المستخدم ومحاولة عرض مشروع Firebase موجود في وحدة تحكم Firebase . إذا كان بإمكانك عرض مشروع Firebase حالي، فهذا يعني أن حساب المستخدم قد قبل بنود خدمة Firebase.
إذا لم تتمكن من عرض أي مشروع موجود في Firebase، فمن المحتمل أن حساب المستخدم لم يقبل بنود خدمة Firebase. لإصلاح ذلك، أنشئ مشروع Firebase جديدًا عبر وحدة تحكم Firebase واقبل بنود خدمة Firebase كجزء من إنشاء المشروع. يمكنك حذف هذا المشروع على الفور عبر إعدادات المشروع في وحدة التحكم.
انتظر بضع دقائق، ثم حاول تشغيل terraform apply
مرة أخرى.
قد يكون هذا بسبب تأخير النشر في الأنظمة المختلفة. حاول حل هذه المشكلة عن طريق استيراد المورد إلى حالة Terraform عن طريق تشغيل terraform import
. ثم حاول تشغيل terraform apply
مرة أخرى.
يمكنك التعرف على كيفية استيراد كل مورد في قسم "الاستيراد" في وثائق Terraform الخاصة به (على سبيل المثال، وثائق "الاستيراد" الخاصة بـ Cloud Firestore ).
كما يوحي الخطأ، ربما تحاول Terraform توفير مؤشرات متعددة و/أو إنشاء مستند في نفس الوقت وواجهت خطأ في التزامن. حاول تشغيل terraform apply
مرة أخرى.
يعني هذا الخطأ أن Terraform لا يعرف المشروع الذي يجب التحقق من الحصة النسبية مقابله. لاستكشاف الأخطاء وإصلاحها، تحقق مما يلي في كتلة resource
:
- تأكد من تحديد قيمة لسمة
project
. - تأكد من أنك تستخدم الموفر مع
user_project_override = true
(بدون اسم مستعار)، والذي في عينات Firebase هوgoogle-beta
.
فيما يلي الأسباب المحتملة لوجود معرف المشروع بالفعل:
المشروع المرتبط بهذا المعرف ينتمي إلى شخص آخر.
- لحل المشكلة: اختر معرف مشروع آخر.
تم حذف المشروع المرتبط بهذا المعرف مؤخرًا (في حالة الحذف الناعم).
- لحل المشكلة: إذا كنت تعتقد أن المشروع المرتبط بالمعرف يخصك، فتحقق من حالة المشروع باستخدام
projects.get
REST API .
- لحل المشكلة: إذا كنت تعتقد أن المشروع المرتبط بالمعرف يخصك، فتحقق من حالة المشروع باستخدام
المشروع المرتبط بهذا المعرف موجود بشكل صحيح تحت المستخدم الحالي. قد يكون السبب المحتمل للخطأ هو مقاطعة
terraform apply
سابق.- لحل المشكلة: قم بتشغيل الأوامر التالية:
terraform import google_project.default PROJECT_ID
وثم
terraform import google_firebase_project.default PROJECT_ID
- لحل المشكلة: قم بتشغيل الأوامر التالية:
يتطلب تطبيق App Engine مثيل Cloud Firestore، ولكن لا يمكنك الحصول إلا على مثيل Cloud Firestore واحد لكل مشروع. لذلك، كما تشير رسالة الخطأ، إذا قمت بالفعل بتوفير مثيل Cloud Firestore للمشروع في موقع واحد، فسوف يحدث خطأ في App Engine إذا حاولت توفير مثيل Cloud Firestore في موقع مختلف. يعتقد App Engine أنك تحاول "إعادة توفير" مثيل Cloud Firestore الموجود بالفعل.
لحل هذا الخطأ، استخدم نفس الموقع لكل من Cloud Firestore وتطبيق App Engine. إذا كنت بحاجة إلى مجموعة تخزين سحابي في موقع مختلف عن Cloud Firestore، فيمكنك توفير مجموعات إضافية (راجع نموذج التكوين لإنشاء مجموعات تخزين سحابية متعددة ).
عند توفير مجموعة 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 قبل مجموعة التخزين السحابي الافتراضية للمشروع (راجع الجزء الجانبي أدناه لمعرفة السبب).