קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
מתחילים להוסיף תמיכה ב-Firebase ב-Terraform.
אם אתם חברים בצוות שרוצה להפוך לאוטומטי את תהליך היצירה של פרויקטים ב-Firebase עם הקצאה של משאבים ספציפיים והפעלה של שירותים, כדאי לכם להשתמש ב-Terraform עם Firebase.
תהליך העבודה הבסיסי לשימוש ב-Terraform עם Firebase כולל את השלבים הבאים:
יצירה והתאמה אישית של קובץ הגדרות של Terraform (קובץ .tf) שמציין את התשתית שרוצים להקצות (כלומר, משאבים שרוצים להקצות ושירותים שרוצים להפעיל).
שימוש בפקודות gcloud CLI שמתקשרות עם Terraform כדי להקצות את התשתית שצוינה בקובץ .tf.
ניהול הגדרות ומשימות ספציפיות למוצרים באמצעות Terraform, כמו:
הפעלת ספקי כניסה לחשבון Firebase Authentication.
יצירת קטגוריות Cloud Storage או מופעים של מסד נתונים ופריסת Firebase Security Rules עבורם.
יצירת קצה עורפי Firebase App Hosting, בנייה ומשאבים קשורים אחרים.
אפשר להשתמש בפקודות ובקבצי התצורה הרגילים של Terraform כדי לבצע את כל המשימות האלה. כדי לעזור לכם בכך, סיפקנו דוגמאות לקובצי הגדרות של Terraform לכמה תרחישי שימוש נפוצים.
תהליך עבודה כללי לשימוש ב-Terraform עם Firebase
דרישות מוקדמות
המדריך הזה הוא מבוא לשימוש ב-Terraform עם Firebase, ולכן הוא מניח שיש לכם ידע בסיסי ב-Terraform. לפני שמתחילים בתהליך העבודה הזה, חשוב לוודא שביצעתם את הפעולות הבאות.
אם אתם משתמשים בחשבון משתמש, אתם צריכים לאשר את התנאים וההגבלות של Firebase. אישרתם את התנאים וההגבלות של Firebase אם אתם יכולים לראות פרויקט Firebase במסוף Firebase
כדי ש-Terraform יבצע פעולות מסוימות (לדוגמה, יצירת פרויקטים), התנאים הבאים צריכים להתקיים:
למשתמש או לחשבון השירות צריכה להיות גישת IAM רלוונטית לפעולות האלה.
אם המשתמש או חשבון השירות שייכים לארגון Google Cloud, מדיניות הארגון צריכה לאפשר לחשבון לבצע את הפעולות האלה.
שלב 1: יוצרים קובץ הגדרות אישיות של Terraform
קובץ תצורה של Terraform צריך לכלול שני חלקים עיקריים (שמתוארים בפירוט בהמשך):
נדרש להגדיר provider לא משנה באילו מוצרים או שירותים של Firebase מדובר.
יוצרים קובץ תצורה של Terraform (כמו קובץ main.tf) בספרייה המקומית.
במדריך הזה, תשתמשו בקובץ ההגדרות הזה כדי לציין את ההגדרה provider ואת כל התשתית שאתם רוצים ש-Terraform תיצור. חשוב לזכור שיש כמה אפשרויות לכלול את הגדרת הספק.
אפשרויות להכללת ההגדרה של provider
יש לכם את האפשרויות הבאות לגבי הכללת הגדרת 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="~> 6.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.
אם זו הפעם הראשונה שאתם מריצים פקודות Terraform בספרייה, אתם צריכים לאתחל את ספריית התצורה ולהתקין את ספק Google Terraform. כדי לעשות זאת, מריצים את הפקודה הבאה:
terraform init
כדי ליצור את התשתית שצוינה בקובץ main.tf, מריצים את הפקודה הבאה:
terraform apply
מוודאים שהקצאת ההרשאות או ההפעלה של הכול בוצעו כצפוי:
אפשרות 1: כדי לראות את ההגדרה מודפסת במסוף, מריצים את הפקודה הבאה:
המשאבים הבאים של Firebase ו-Google תומכים ב-Terraform. אנחנו גם מוסיפים עוד מקורות מידע כל הזמן. לכן, אם לא מופיע המשאב שרוצים לנהל באמצעות Terraform, כדאי לבדוק שוב בקרוב אם הוא זמין או לדווח על בעיה במאגר GitHub.
google_identity_platform_config —
הפעלת Google Cloud Identity Platform (GCIP) (שהוא הקצה העורפי של Firebase Authentication) והגדרת הגדרות אימות ברמת הפרויקט
הפרויקט שבו Terraform יפעיל את GCIP או את Firebase Authentication צריך להיות בתכנית התמחור Blaze (כלומר, צריך להיות לפרויקט חשבון משויך ב-Cloud Billing). אפשר לעשות זאת באופן פרוגרמטי על ידי הגדרת המאפיין billing_account במשאב google_project.
בנוסף, המשאב הזה מאפשר לבצע הגדרות נוספות, כמו שיטות כניסה מקומיות, למשל אימות אנונימי, אימות באמצעות אימייל/סיסמה ואימות באמצעות טלפון, וגם פונקציות חסימה ודומיינים מורשים.
דוגמאות לקובצי הגדרות של Terraform לתרחישים נפוצים
הגדרה של Firebase Authentication באמצעות GCIP
ההגדרה הזו יוצרת פרויקט חדש Google Cloud, משייכת את הפרויקט לחשבון Cloud Billing (נדרש תוכנית תמחור Blaze לשימוש ב-Firebase Authentication עם GCIP), מפעילה את שירותי Firebase בפרויקט, מגדירה את Firebase Authentication עם GCIP ורושמת שלושה סוגים שונים של אפליקציות בפרויקט.
שימו לב: כדי להגדיר את Firebase Authentication באמצעות Terraform, צריך להפעיל את GCIP.
# 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"}# 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_firebase_project.auth.project # 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",]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Web app"}
הקצאת שירות Firebase Data Connect
ההגדרה הזו יוצרת פרויקט חדש של Google Cloud, מפעילה את שירותי Firebase עבור הפרויקט ומקצה שירות Data Connect.
# Creates a new Google Cloud project.resource"google_project""dataconnect"{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 Data Connect).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""services"{provider=google-beta.no_user_project_overrideproject=google_project.dataconnect.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedataconnect.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""dataconnect"{provider=google-betaproject=google_project.dataconnect.project_iddepends_on=[google_project_service.services]}# Create a Firebase Data Connect serviceresource"google_firebase_data_connect_service""dataconnect-default"{project=google_firebase_project.dataconnect.projectlocation="name-of-region-for-service"service_id="${google_firebase_project.dataconnect.project}-default-fdc"deletion_policy="DEFAULT"}
הקצאת מופע ברירת המחדל 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"}# 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_iddepends_on=[google_project_service.rtdb]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_firebase_project.rtdb.project # 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"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Web app"}
הקצאת כמה מופעים של 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"}# 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_iddepends_on=[google_project_service.rtdb-multi]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # 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"}# Provisions an additional Realtime Database instance.resource"google_firebase_database_instance""database-additional"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # 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"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Web app"}
הקצאת מופע ברירת המחדל 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"}# 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_iddepends_on=[google_project_service.firestore]}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectname="(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"}# Creates a ruleset of Firestore Security Rules from a local file.resource"google_firebaserules_ruleset""firestore"{provider=google-betaproject=google_firestore_database.firestore.projectsource{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")}}}# 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_firestore_database.firestore.project}# Adds a new Firestore index.resource"google_firestore_index""indexes"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"query_scope="COLLECTION"fields{field_path="question"order="ASCENDING"}fields{field_path="answer"order="ASCENDING"}}# 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_firestore_database.firestore.projectcollection="quiz"document_id="question-1"fields="{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Web app"}
זהו קובץ הכללים של 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"}# 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_iddepends_on=[google_project_service.storage-multi]}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="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_firebase_project.storage-multi.projectname="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_firebase_project.storage-multi.projectbucket_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_firebase_project.storage-multi.projectbucket_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_firebase_project.storage-multi.projectsource{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")}}}# 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_firebase_project.storage-multi.project}# 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_firebase_project.storage-multi.project}# 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_firebase_project.storage-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Web app"}
זהו קובץ הכללים של Cloud Storage Security Rules שצריך להיות בקובץ מקומי בשם storage.rules.
ההגדרה הזו יוצרת פרויקט 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"}# 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"}# 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]}# 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=[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"}# 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_firebase_project.extensions.projectinstance_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"}}}
הפעלה והגנה על Firebase AI Logic
ההגדרה הזו יוצרת פרויקט Google Cloud חדש, מפעילה את שירותי Firebase בפרויקט, כולל Firebase AI Logic, ומגדירה ומפעילה את האכיפה של Firebase App Check עבור Firebase AI Logic, כך שניתן יהיה לגשת אליו רק מהאפליקציות שלכם.
# Creates a new Google Cloud project.resource"google_project""vertex"{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 Vertex AI in Firebase).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.vertex.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase"aiplatform.googleapis.com","firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse"firebaseappcheck.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""vertex"{provider=google-betaproject=google_project.vertex.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Web App"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Android App"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Creates a Firebase Apple App in the new project created earlier.resource"google_firebase_apple_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Apple App"bundle_id="bundle.id"team_id="1234567890"}### Protects Vertex AI in Firebase with App Check.# Turns on enforcement for Vertex AI in Firebaseresource"google_firebase_app_check_service_config""vertex"{provider=google-betaproject=google_firebase_project.vertex.projectservice_id="firebaseml.googleapis.com"enforcement_mode="ENFORCED"}# Enables the reCAPTCHA Enterprise APIresource"google_project_service""recaptcha_enterprise"{provider=google-betaproject=google_firebase_project.vertex.projectservice="recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables the Play Integrity APIresource"google_project_service""play_integrity"{provider=google-betaproject=google_firebase_project.vertex.projectservice="playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Allows the web app to use reCAPTCHA Enterprise with App Checkresource"google_firebase_app_check_recaptcha_enterprise_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_web_app.app.app_idsite_key="your site key"token_ttl="7200s" # Optionaldepends_on=[google_project_service.recaptcha_enterprise]}# Registers the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_android_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=length(google_firebase_android_app.app.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}depends_on=[google_project_service.play_integrity]}# Registers the Apple app with the AppAttest providerresource"google_firebase_app_check_app_attest_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_apple_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=google_firebase_apple_app.app.team_id!=""error_message="Provide a Team ID on the Apple App to use App Check"}}}
הקצאת שרת קצה עורפי (backend) באופן ידניApp Hosting
ההגדרה הזו מדגימה איך להקצות באופן ידני עורף (backend) של App Hosting באמצעות Terraform. הגישה הזו מאפשרת לכם שליטה פרטנית במשאבים שנוצרים, אבל מחייבת אתכם להגדיר כל משאב בנפרד. האפשרות הזו שימושית כשרוצים להתאים אישית את הקצה העורפי מעבר לאפשרויות ברירת המחדל.
# Creates a new Google Cloud project.resource"google_project""apphosting"{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 App Hosting).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.apphosting.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseapphosting.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""apphosting"{provider=google-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}# Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS" # or "REGIONAL_STRICT"service_account=google_service_account.service_account.email}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Creates a Buildresource"google_firebase_app_hosting_build""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idbuild_id="my-build"source{container{ # TODO: use your own imageimage="us-docker.pkg.dev/cloudrun/container/hello"}}}# Rolls out the Buildresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idtarget{splits{build=google_firebase_app_hosting_build.example.namepercent=100}}}
הקצאת שרת קצה עורפי (backend) באמצעות GitHubApp Hosting
ההגדרה הזו מדגימה איך להקצות App Hosting קצה עורפי באמצעות קוד אפליקציה שמאוחסן במאגר GitHub. הגישה הזו מאפשרת לכם לנהל ולעדכן את התשתית באמצעות בקשות משיכה ב-GitHub וצינורות CI/CD, בהתאם למודל האופייני לפריסות של App Hosting.
# Creates a new Google Cloud project.resource"google_project""apphosting"{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 App Hosting).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.apphosting.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseapphosting.googleapis.com","serviceusage.googleapis.com","developerconnect.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""apphosting"{provider=google-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}### Setting up Firebase App Hosting #### Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS" # or "REGIONAL_STRICT"service_account=google_service_account.service_account.emailcodebase{repository=google_developer_connect_git_repository_link.my-repository.nameroot_directory="/"}}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/developerconnect.readTokenAccessor","roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Configures auto rollout from GitHubresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idrollout_policy{codebase_branch="main" # Or another branch}}###### Setting up a connection to GitHub #### Provisions Service Agent for Developer Connectresource"google_project_service_identity""devconnect-p4sa"{provider=google-betaproject=google_firebase_project.apphosting.projectservice="developerconnect.googleapis.com"}# Adds permission to Developer Connect Service Agent to manager GitHub tokensresource"google_project_iam_member""devconnect-secret"{provider=google-betaproject=google_firebase_project.apphosting.projectrole="roles/secretmanager.admin"member=google_project_service_identity.devconnect-p4sa.member}# Connects to a GitHub accountresource"google_developer_connect_connection""my-connection"{provider=google-betaproject=google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's locationlocation="name-of-region-for-service" # Must be `firebase-app-hosting-github-oauth`connection_id="firebase-app-hosting-github-oauth"github_config{github_app="FIREBASE"}depends_on=[google_project_iam_member.devconnect-secret]}# Follow the next steps to set up the GitHub connection# Tip: Run terraform refresh to obtain the outputoutput"next_steps"{description="Follow the action_uri if present to continue setup"value=google_developer_connect_connection.my-connection.installation_state}# Links a GitHub repo to the projectresource"google_developer_connect_git_repository_link""my-repository"{provider=google-betaproject=google_firebase_project.apphosting.projectlocation=google_developer_connect_connection.my-connection.locationgit_repository_link_id="my-repo-id"parent_connection=google_developer_connect_connection.my-connection.connection_idclone_uri="https://github.com/myuser/myrepo.git"}###
פתרון בעיות ושאלות נפוצות
אתם רוצים לקבל מידע נוסף על כל המאפיינים השונים שקשורים לפרויקט (כמו 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 במהלך יצירת הפרויקט. אפשר למחוק את הפרויקט הזה באופן מיידי דרך הגדרות הפרויקט במסוף.
אחרי שמריצים את הפקודה
terraform apply, מוצגת השגיאה:
generic::permission_denied: IAM authority does not have the
permission.
מחכים כמה דקות ומנסים להפעיל את terraform apply שוב.
היצירה של משאב נכשלה, אבל כשמריצים שוב את הפקודה terraform apply, מוצגת ההודעה ALREADY_EXISTS.
יכול להיות שזה קורה בגלל עיכוב בהפצה במערכות שונות. כדי לנסות לפתור את הבעיה, מייבאים את המשאב למצב של Terraform על ידי הרצת הפקודה terraform import. אחר כך מנסים להריץ את terraform apply שוב.
בקטע 'ייבוא' במסמכי התיעוד של Terraform (לדוגמה, מסמכי התיעוד של 'ייבוא' עבור Cloud Firestore) אפשר לקרוא איך לייבא כל משאב.
כשעובדים עם
Cloud Firestore, מוצגת השגיאה הבאה: Error creating Index: googleapi:
Error 409;...Concurrent access -- try again
כפי שמופיע בשגיאה, יכול להיות ש-Terraform מנסה להקצות כמה אינדקסים או ליצור מסמך בו-זמנית, ונתקל בשגיאת מקביליות.
נסו להפעיל את terraform apply שוב.
מוצגת השגיאה:
"you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes".
השגיאה הזו מציינת ש-Terraform לא יודע באיזה פרויקט לבדוק את המכסה. כדי לפתור את הבעיה, בודקים את הפרטים הבאים בבלוק resource:
מוודאים שציינתם ערך למאפיין project.
מוודאים שמשתמשים בספק עם user_project_override = true
(ללא כינוי), שבמקרים לדוגמה של Firebase הוא google-beta.
כשיוצרים פרויקט Google Cloud חדש, מוצגת השגיאה שמזהה הפרויקט שצוין עבור הפרויקט החדש כבר קיים.
אלה הסיבות האפשריות לכך שמזהה הפרויקט כבר קיים:
הפרויקט שמשויך למזהה הזה שייך למישהו אחר.
כדי לפתור את הבעיה: צריך לבחור מזהה פרויקט אחר.
הפרויקט שמשויך למזהה הזה נמחק לאחרונה (במצב של מחיקה רכה).
כדי לפתור את הבעיה: אם אתם חושבים שהפרויקט שמשויך למזהה שייך לכם, אתם יכולים לבדוק את מצב הפרויקט באמצעות projects.get REST API.
הפרויקט שמשויך למזהה הזה קיים בצורה תקינה אצל המשתמש הנוכחי. יכול להיות שהסיבה לשגיאה היא שפעולה קודמת של terraform apply נקטעה.
כדי לפתור את הבעיה: מריצים את הפקודות הבאות: terraform import google_project.default PROJECT_ID
ואז terraform import google_firebase_project.default PROJECT_ID
למה צריך להקצות את מופע ברירת המחדל Cloud Firestore לפני קטגוריית ברירת המחדל Cloud Storage?
אם הקצאתם את דלי ברירת המחדל Cloud Storage (באמצעות google_app_engine_application) לפני שניסיתם להקצות את מופע ברירת המחדל Cloud Firestore, תגלו שמופע ברירת המחדל Cloud Firestore כבר הוקצה. חשוב לשים לב שמופע מסד הנתונים שהוקצה נמצא במצב Datastore, כלומר לא ניתן לגשת אליו באמצעות Firebase SDK, אימות או 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, כלומר לא ניתן לגשת אליו באמצעות Firebase SDK, אימות או Firebase Security Rules. אם רוצים להשתמש ב-Cloud Firestore עם שירותי Firebase האלה, צריך לרוקן את מסד הנתונים ואז לשנות את סוג מסד הנתונים במסוף Google Cloud.