تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
بدأت Firebase في توفير دعم
Terraform.
إذا كنت عضوًا في فريق يريد إنشاء مشاريع
Firebase بشكل آلي وموحد باستخدام موارد محدّدة تم توفيرها وخدمات مفعّلة، قد يكون استخدام Terraform مع Firebase مناسبًا لك.
يتضمن سير العمل الأساسي لاستخدام Terraform مع Firebase ما يلي:
إنشاء ملف إعدادات Terraform (ملف .tf) وتخصيصه لتحديد البنية الأساسية التي تريد توفيرها (أي الموارد التي تريد توفيرها والخدمات التي تريد تفعيلها)
استخدام أوامر gcloud CLI التي واجهة مع Terraform
لتوفير البنية الأساسية المحددة في ملف .tf.
حذف البنية الأساسية الحالية وتعديلها باستخدام Terraform.
يمكنك إدارة التهيئة والمهام الخاصة بالمنتج باستخدام Terraform، مثل:
تفعيل مقدّمي خدمة تسجيل الدخول إلى Firebase Authentication
إنشاء حِزم Cloud Storage أو نُسخ قاعدة بيانات ونشر
Firebase Security Rules لها
يمكنك استخدام ملفات الإعدادات وأوامر Terraform العادية لتنفيذ كل هذه المهام. لمساعدتك في ذلك، قدّمنا
عيّنات من ملفات إعدادات Terraform لعدة حالات استخدام
شائعة.
سير العمل العام لاستخدام Terraform مع Firebase
المتطلبات الأساسية
هذا الدليل هو مقدّمة لاستخدام Terraform مع Firebase، لذا يفترض أنّك تمتلك معرفة dasar بـ 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="~> 5.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}
انتقِل إلى القسم التالي لإكمال ملف الإعداد وتحديد البنية الأساسية التي تريد إنشاؤها.
تحديد البنية الأساسية التي تريد إنشاؤها باستخدام وحدات resource
في ملف إعدادات Terraform (ملف main.tf في هذا الدليل)، عليك
تحديد كل البنية الأساسية التي تريد أن تنشئها Terraform (أي كل
الموارد التي تريد توفيرها وجميع الخدمات التي تريد تفعيلها). في
هذا الدليل، يمكنك العثور على قائمة كاملة بكل
موارد Firebase المتوافقة مع Terraform.
افتح ملف main.tf.
ضمن إعداد provider، أدرِج الإعداد التالي لresource
الوحدات.
ينشئ هذا المثال الأساسي مشروعًا جديدًا على Firebase، ثمّ ينشئ
تطبيق Android على 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"{provider=google-beta.no_user_project_overridename="Project Display Name"project_id="project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""default"{provider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""default"{provider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app"package_name="awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
عرض نسخة مفصّلة
من مثال ملف الإعدادات
إذا لم تكن على دراية بالبنية الأساسية للمشاريع والتطبيقات كموارد، راجِع المستندات التالية:
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{ # Use the provider that enables the setup of quota checks for a new projectprovider=google-beta.no_user_project_overridename="Project Display Name" // learn more about the project nameproject_id="project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled" // learn more about the Firebase-enabled label}}# Enables required APIs.resource"google_project_service""default"{ # Use the provider without quota checks for enabling APISprovider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.# This action essentially "creates a Firebase project" and allows the project to use# Firebase services (like Firebase Authentication) and# Firebase tooling (like the Firebase console).# Learn more about the relationship between Firebase projects and Google Cloud.resource"google_firebase_project""default"{ # Use the provider that performs quota checks from now onprovider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.# Learn more about the relationship between Firebase Apps and Firebase projects.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app" # learn more about an app's display namepackage_name="awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
الخطوة 2: تنفيذ أوامر Terraform لإنشاء البنية الأساسية المحدّدة
لتوفير الموارد وتفعيل الخدمات المحدّدة في ملف main.tf
، نفِّذ الأوامر التالية من الدليل نفسه الذي يتضمّن ملف main.tf.
للحصول على معلومات تفصيلية حول هذه الأوامر، راجِع
مستندات الأشكال المصغّرة.
إذا كانت هذه هي المرة الأولى التي يتم فيها تنفيذ أوامر Terraform في directory، عليك بدء ملف الإعداد وتثبيت Google Terraform provider. يمكنك إجراء ذلك من خلال تنفيذ الأمر التالي:
terraform init
أنشئ البنية الأساسية المحددة في ملف main.tf من خلال تنفيذ الأمر التالي:
terraform apply
تأكَّد من أنّه تم توفير كل العناصر أو تفعيلها على النحو المتوقّع:
الخيار 1: الاطّلاع على الإعدادات المطبوعة في وحدة التحكّم من خلال تنفيذ
الأمر التالي:
تتوفّر أدوات Terraform في المراجع التالية حول Firebase وGoogle. ونحن نعمل على
إضافة المزيد من المراجع باستمرار. إذا لم يظهر لك المورد الذي تريد تدبيره باستخدام Terraform، يُرجى التحقّق مرة أخرى قريبًا لمعرفة ما إذا كان متاحًا أو طلبه من خلال
تسجيل مشكلة في مستودع GitHub.
google_identity_platform_config:
تفعيل Google Cloud Identity Platform (GCIP) (وهو الخلفية لـ Firebase Authentication)
وتوفير إعدادات المصادقة على مستوى المشروع
يجب أن يكون المشروع الذي ستفعّل فيه Terraform "شركاء تكنولوجيا المعلومات في Google" و/أو Firebase Authentication
مدرَجًا في خطة أسعار Blaze (أي أن يكون للمشروع حساب Cloud Billing مرتبطًا). يمكنك إجراء ذلك آليًا من خلال
ضبط سمة
billing_account
في مورد google_project.
يتيح هذا المرجع أيضًا المزيد من الإعدادات، مثل طرق تسجيل الدخول على الجهاز،
مثل المصادقة المجهولة الهوية وعبر البريد الإلكتروني/كلمة المرور والهاتف، بالإضافة إلى
حظر الدوال والنطاقات المعتمَدة.
ملاحظة مهمة: لا تستخدِم بيانات حقيقية للمستخدمين النهائيين أو بيانات الإنتاج في مستند ملف التمهيد
هذا.
Cloud Storage for Firebase
google_firebase_storage_bucket:
إتاحة الوصول إلى حزمة Cloud Storage حالية لحِزم تطوير البرامج (SDK) لمنصّة Firebase،
والمصادقة، وFirebase Security Rules
نماذج ملفات ضبط Terraform لحالات الاستخدام الشائعة
إعداد Firebase Authentication باستخدام
GCIP
تؤدي هذه الإعدادات إلى إنشاء مشروع Google Cloud جديد، وربط المشروع بحساب Cloud Billing (يجب توفّر خطة أسعار Blaze
من أجل Firebase Authentication مع GCIP)،
وتفعيل خدمات Firebase للمشروع،
وإعداد Firebase Authentication باستخدام GCIP،
وتسجيل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
يجب تفعيل GCIP لإعداد Firebase Authentication عبر Terraform.
# Creates a new Google Cloud project.resource"google_project""auth"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP).billing_account="000000-000000-000000" # 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_overrideproject=google_project.auth.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","identitytoolkit.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""auth"{provider=google-betaproject=google_project.auth.project_iddepends_on=[google_project_service.auth,]}# Creates an Identity Platform config.# Also enables Firebase Authentication with Identity Platform in the project if not.resource"google_identity_platform_config""auth"{provider=google-betaproject=google_project.auth.project_id # Auto-deletes anonymous usersautodelete_anonymous_users=true # Configures local sign-in methods, like anonymous, email/password, and phone authentication.sign_in{allow_duplicate_emails=trueanonymous{enabled=true}email{enabled=truepassword_required=false}phone_number{enabled=truetest_phone_numbers={"+11231231234"="000000"}}} # Sets an SMS region policy.sms_region_config{allowlist_only{allowed_regions=["US","CA",]}} # Configures blocking functions.blocking_functions{triggers{event_type="beforeSignIn"function_uri="https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in"}forward_inbound_credentials{refresh_token=trueaccess_token=trueid_token=true}} # Configures a temporary quota for new signups for anonymous, email/password, and phone number.quota{sign_up_quota_config{quota=1000start_time=""quota_duration="7200s"}} # Configures authorized domains.authorized_domains=["localhost","${google_project.auth.project_id}.firebaseapp.com","${google_project.auth.project_id}.web.app",] # 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-betaproject=google_project.auth.project_iddisplay_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-betaproject=google_project.auth.project_iddisplay_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-betaproject=google_project.auth.project_iddisplay_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 Realtime Database التلقائي
يؤدي هذا الإعداد إلى إنشاء مشروع Google Cloud جديد،
وتفعيل خدمات Firebase للمشروع،
وتوفير مثيل Realtime Database التلقائي للمشروع،
وتسجيل ثلاثة أنواع مختلفة من التطبيقات في المشروع.
# Creates a new Google Cloud project.resource"google_project""rtdb"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # 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_overrideproject=google_project.rtdb.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb"{provider=google-betaproject=google_project.rtdb.project_id}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_project.rtdb.project_id # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb.project_id}-default-rtdb"type="DEFAULT_DATABASE" # 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-betaproject=google_project.rtdb.project_iddisplay_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-betaproject=google_project.rtdb.project_iddisplay_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-betaproject=google_project.rtdb.project_iddisplay_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 Realtime Database
تنشئ هذه الإعدادات مشروعًا جديدًا على Google Cloud،
وتربط المشروع بحساب Cloud Billing (خطة أسعار Blaze
مطلوبة لحالات متعددة من Realtime Database)،
وتفعّل خدمات Firebase للمشروع،
وتوفّر حالات متعددة من Realtime Database
(بما في ذلك حالة Realtime Database التلقائية للمشروع)،
وتسجّل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
# Creates a new Google Cloud project.resource"google_project""rtdb-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances).billing_account="000000-000000-000000" # 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_overrideproject=google_project.rtdb-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb-multi"{provider=google-betaproject=google_project.rtdb-multi.project_id}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb-multi.project_id}-default-rtdb"type="DEFAULT_DATABASE" # 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-betaproject=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-betaproject=google_project.rtdb-multi.project_iddisplay_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-betaproject=google_project.rtdb-multi.project_iddisplay_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-betaproject=google_project.rtdb-multi.project_iddisplay_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 Security Rules لمثيل Cloud Firestore التلقائي، وينشئ فهرسًا Cloud Firestore، ويضيف مستند Cloud Firestore يحتوي على بيانات المحتوى الأساسي.
# Creates a new Google Cloud project.resource"google_project""firestore"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # 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_overrideproject=google_project.firestore.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firestore.googleapis.com","firebaserules.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""firestore"{provider=google-betaproject=google_project.firestore.project_id}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_project.firestore.project_idname="(default)" # See available locations: https://firebase.google.com/docs/firestore/locationslocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC" # 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-betaproject=google_project.firestore.project_idsource{files{name="firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-startedcontent=file("firestore.rules")}} # 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-betaname="cloud.firestore" # must be cloud.firestoreruleset_name=google_firebaserules_ruleset.firestore.nameproject=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-betaproject=google_project.firestore.project_idcollection="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-betaproject=google_project.firestore.project_idcollection="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-betaproject=google_project.firestore.project_iddisplay_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-betaproject=google_project.firestore.project_iddisplay_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-betaproject=google_project.firestore.project_iddisplay_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 Security Rules التي يجب أن تكون في ملف محلي اسمه firestore.rules.
تؤدي عملية الضبط هذه إلى إنشاء مشروع Google Cloud جديد،
وربط المشروع بحساب Cloud Billing (خطة أسعار Blaze
مطلوبة للمجموعات الإضافية)،
وتفعيل خدمات Firebase للمشروع،
وتوفير مجموعات Cloud Storage إضافية غير تلقائية،
وتسجيل ثلاثة أنواع مختلفة من التطبيقات مع المشروع.
ويوفّر أيضًا Firebase Security Rules لكل مجموعة بيانات Cloud Storage، ويحمِّل ملفًا إلى إحدى مجموعات البيانات Cloud Storage.
# Creates a new Google Cloud project.resource"google_project""storage-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets).billing_account="000000-000000-000000" # 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_overrideproject=google_project.storage-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebaserules.googleapis.com","firebasestorage.googleapis.com","storage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_id}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_project.storage-multi.project_idname="name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locationslocation="name-of-region-for-bucket"}# Provisions an additional Cloud Storage bucket.resource"google_storage_bucket""bucket-2"{provider=google-betaproject=google_project.storage-multi.project_idname="name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the existing Storage bucket.location="name-of-region-for-additional-bucket"}# Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-1"{provider=google-betaproject=google_project.storage-multi.project_idbucket_id=google_storage_bucket.bucket-1.name}# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-2"{provider=google-betaproject=google_project.storage-multi.project_idbucket_id=google_storage_bucket.bucket-2.name}# Creates a ruleset of Firebase Security Rules from a local file.resource"google_firebaserules_ruleset""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_idsource{files{ # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-startedname="storage.rules"content=file("storage.rules")}} # Wait for the Storage buckets to be provisioned before creating this ruleset.depends_on=[google_firebase_project.storage-multi,]}# Releases the ruleset to the first Storage bucket.resource"google_firebaserules_release""bucket-1"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-1.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_project.storage-multi.project_id}# Releases the ruleset to the additional Storage bucket.resource"google_firebaserules_release""bucket-2"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-2.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_project.storage-multi.project_id}# Uploads a new file to the first Storage bucket.# Do not use real end-user or production data in this file.resource"google_storage_bucket_object""cat-picture-multi"{provider=google-betaname="cat.png"source="path/to/cat.png"bucket=google_storage_bucket.bucket-1.name}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_iddisplay_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-betaproject=google_project.storage-multi.project_iddisplay_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-betaproject=google_project.storage-multi.project_iddisplay_name="My Web app" # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.storage-multi,]}
هذه هي مجموعة قواعد Cloud Storage Security Rules التي يجب أن تكون في ملف محلي
يحمل الاسم storage.rules.
حماية مورد واجهة برمجة التطبيقات
باستخدام Firebase App Check
يؤدي هذا الإعداد إلى إنشاء مشروع Google Cloud جديد،
وتفعيل خدمات Firebase للمشروع،
وإعداد Firebase App Check وتفعيل فرضه على Cloud Firestore
كي لا يمكن الوصول إليه إلا من تطبيق Android.
# Creates a new Google Cloud project.resource"google_project""appcheck"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Required for the project to display in a list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.appcheck.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseappcheck.googleapis.com","firestore.googleapis.com","serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""appcheck"{provider=google-betaproject=google_project.appcheck.project_iddepends_on=[google_project_service.services]}# Provisions the Firestore database instance.resource"google_firestore_database""database"{provider=google-betaproject=google_firebase_project.appcheck.projectname="(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-locationlocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC" # 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-betaproject=google_firebase_project.appcheck.projectdisplay_name="Play Integrity app"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# 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 providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectapp_id=google_firebase_android_app.appcheck.app_iddepends_on=[time_sleep.wait_30s,google_firestore_database.database]lifecycle{precondition{condition=length(google_firebase_android_app.appcheck.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}}# Enable enforcement of App Check for Firestoreresource"google_firebase_app_check_service_config""firestore"{provider=google-betaproject=google_firebase_project.appcheck.projectservice_id="firestore.googleapis.com"depends_on=[google_project_service.services]}
تثبيت مثيل
من Firebase Extension
يؤدي هذا الإعداد إلى إنشاء مشروع Google Cloud جديد،
وتفعيل خدمات Firebase للمشروع،
وتثبيت مثيل جديد من Firebase Extension
في المشروع. إذا كانت النسخة متوفّرة، تتم تعديل مَعلماتها استنادًا إلى القيم المقدَّمة في الإعداد.
# Creates a new Google Cloud project.resource"google_project""extensions"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions).billing_account="000000-000000-000000" # 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_overrideproject=google_project.extensions.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firebase.googleapis.com","firebaseextensions.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""extensions"{provider=google-betaproject=google_project.extensions.project_iddepends_on=[google_project_service.extensions,]}# Installs an instance of the "Translate Text in Firestore" extension.# Or updates the extension if the specified instance already exists.resource"google_firebase_extensions_instance""translation"{provider=google-betaproject=google_project.extensions.project_idinstance_id="translate-text-in-firestore"config{extension_ref="firebase/firestore-translate-text"params={COLLECTION_PATH="posts/comments/translations"DO_BACKFILL=trueLANGUAGES="ar,en,es,de,fr"INPUT_FIELD_NAME="input"LANGUAGES_FIELD_NAME="languages"OUTPUT_FIELD_NAME="translated"}system_params={"firebaseextensions.v1beta.function/location"="us-central1""firebaseextensions.v1beta.function/memory"="256""firebaseextensions.v1beta.function/minInstances"="0""firebaseextensions.v1beta.function/vpcConnectorEgressSettings"="VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"}}}
تحديد المشاكل وحلّها والأسئلة الشائعة
إذا أردت معرفة المزيد عن كل السمات المختلفة المرتبطة بالمشروع (مثل
project وuser_project_override)
يستخدم هذا الدليل سمات Terraform التالية عند العمل مع "المشاريع".
project ضمن قطعة أرض مساحتها resource
ننصحك بإدراج السمة project في كل مجموعة ضمن resource كلما أمكن
من خلال تضمين سمة مشروع، ستنشئ Terraform البنية الأساسية
المحدّدة في وحدة الموارد ضمن المشروع المحدّد. يستخدم كل هذا الدليل
ونماذج ملفات التهيئة الخاصة بنا هذه الممارسة.
اطّلِع على المستندات الرسمية حول Terraform المتعلّقة بملف project.
user_project_override ضمن مجموعة provider
لتوفير معظم الموارد، عليك استخدام
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 كجزء من عملية إنشاء المشروع. يمكنك حذف هذا المشروع فورًا من خلال إعدادات المشروع (Project Settings) في وحدة التحكّم.
بعد تشغيل
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، يظهر لك الخطأ التالي: 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
(بدون اسم مستعار)، وهو في نماذج Firebase هو google-beta.
عند إنشاء
مشروع Google Cloud جديد، يظهر لك الخطأ "رقم تعريف المشروع المحدّد
للمشروع الجديد متوفّر حاليًا".
في ما يلي الأسباب المحتمَلة لوجود معرّف المشروع حاليًا:
المشروع المرتبط برقم التعريف هذا يملكه شخص آخر.
لحلّ المشكلة: اختَر رقم تعريف مشروع آخر.
تم مؤخرًا حذف المشروع المرتبط برقم التعريف هذا (في حالة حذف مؤقت).
لحلّ المشكلة: إذا كنت تعتقد أنّ المشروع المرتبط بالرقم التعريفي ينتمي
إليك، تحقّق من حالة المشروع باستخدام
projects.get REST API.
المشروع المرتبط بهذا المعرّف متوفّر بشكل صحيح للمستخدم الحالي. أحد الأسباب المحتملة لهذا الخطأ هو أنّه تم
توقّف الإجراء terraform apply السابق.
لماذا تحتاج إلى توفير المتطلبات اللازمة لمثيل Cloud Firestore التلقائي قبل حزمة Cloud Storage التلقائية؟
إذا سبق لك توفير حزمة Cloud Storage التلقائية (من خلال
"google_app_engine_application") قبل محاولة توفير
مثيل Cloud Firestore التلقائي، سيظهر لك أنّه
سبق أن تم توفير المتطلبات اللازمة لمثيل Cloud Firestore التلقائي. يُرجى العِلم أنّ
مثيل قاعدة البيانات المقدَّمة في وضع "مستودع البيانات"، ما يعني أنّه لا
يمكن لحِزم تطوير البرامج (SDK) لمنصّة Firebase أو المصادقة أو Firebase Security Rules الوصول إليه. إذا كنت تريد استخدام
Cloud Firestore مع خدمات Firebase هذه، عليك إفراغ
قاعدة البيانات ثم تغيير نوع قاعدة البيانات في
وحدة تحكّم Google Cloud.
عند محاولة
توفير 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 التلقائي للمشروع، لا يمكنك
"إعادة توفيره" أو تغيير موقعه الجغرافي. يُرجى العِلم أنّ مثيل قاعدة البيانات التي تم توفيرها
يكون في وضع Datastore، ما يعني أنّه لا يمكن الوصول إليه باستخدام
حِزم تطوير البرامج (SDK) من Firebase أو المصادقة أو Firebase Security Rules. إذا كنت تريد استخدام Cloud Firestore
مع خدمات Firebase هذه، عليك إفراغ قاعدة البيانات ثم
تغيير نوع قاعدة البيانات في
وحدة تحكّم Google Cloud.
تاريخ التعديل الأخير: 2024-11-15 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2024-11-15 (حسب التوقيت العالمي المتفَّق عليه)"],[],[]]