הגדר ונהל פרויקטים ומוצרים של Firebase באמצעות Terraform

1. הקדמה

מטרות

אתה יכול להשתמש ב-Terraform כדי להגדיר ולנהל פרויקט Firebase, כולל תצורה פרוגרמטית של תשתית ומוצרי Firebase.

מעבדת קוד זה מתארת ​​תחילה כיצד לבנות קובץ תצורה של Terraform כדי ליצור פרויקט Firebase חדש, ולאחר מכן כיצד להגדיר את האפליקציות ומוצרי Firebase שברצונך להשתמש בפרויקט זה. אנו מכסים גם את היסודות של שורת הפקודה Terraform, כמו תצוגה מקדימה של שינויים שיש לבצע ואז ליישם אותם.

אם רצית ללמוד כיצד להגדיר ולנהל פרויקטים ומוצרים של Firebase עם Terraform, אז מעבד הקוד הזה הוא בשבילך!

מה תלמד

  • כיצד ליצור קובץ תצורה של Terraform ( *.tf )
  • כיצד להשתמש בפקודות Terraform CLI כדי לנהל את התשתית שלך
  • כיצד לשנות את התצורה שלך כדי לעדכן את המשאבים והשירותים שלך
  • כיצד להחיל את התצורה שלך באפליקציית אינטרנט אמיתית (נקראת Friendly Chat )
  • כיצד להגדיר תצורות מקבילות (וסינכרון) בסביבות שונות (הפקה, בימוי וכו')

מה אתה צריך

כדי להצליח עם מעבדת קוד זה, אתה צריך מיומנות בסיסית עם Terraform והטרמינולוגיה שלה, כולל התנאים המוקדמים הבאים:

מעבדת קוד זה מספקת אפליקציה אמיתית לדוגמה כדי שתוכל לבדוק ולקיים אינטראקציה עם מה שאתה מספק באמצעות Terraform. כדי לעשות זאת, תצטרך את הדברים הבאים:

  • הקוד לדוגמה לאפליקציית אינטרנט - הורד את הקוד הזה בשלב הבא של מעבדת הקוד
  • מנהל החבילות npm (שמגיע בדרך כלל עם Node.js ) - התקן את הכלים האלה
  • ה- CLI של Firebase - התקן את ה-CLI הזה והיכנס

2. קבל את קוד ההתחלה

ב-codelab זה, אתה יכול לבדוק מה אתה מספק דרך Terraform עם אפליקציית אינטרנט אמיתית. אנו ממליצים לעשות זאת כדי שתבינו את כל השלבים הדרושים לשימוש במשאבים שסופקו על ידי Terraform.

שיבוט את מאגר GitHub של Codelab משורת הפקודה:

git clone https://github.com/firebase/codelab-friendlychat-web

לחלופין, אם לא התקנת git, אתה יכול להוריד את המאגר כקובץ ZIP .

3. צור תצורת Terraform

הגדר Terraform

  1. בבסיס הקוד של האפליקציה לדוגמה שהורדת, נווט אל השורש של ספריית web .
  2. בשורש של ספרייה זו, צור קובץ תצורה של Terraform בשם main.tf עם ההגדרה הראשונית הבאה:

    main.tf
    # Terraform configuration to set up providers by version.
    terraform {
      required_providers {
        google-beta = {
          source  = "hashicorp/google-beta"
          version = "~> 4.0"
        }
      }
    }
    
    # Configure the provider not to use the specified project for quota check.
    # This provider should only be used during project creation and initializing services.
    provider "google-beta" {
      alias                 = "no_user_project_override"
      user_project_override = false
    }
    
    # Configure the provider that uses the new project's quota.
    provider "google-beta" {
      user_project_override = true
    }
    

לכל אחד מספקי google-beta יש תכונה בשם user_project_override שקובעת כיצד הפעולות מ- Terraform ייבדקו מכסה. להקצאת רוב המשאבים, עליך להשתמש user_project_override = true , כלומר לבדוק מכסה מול פרויקט Firebase משלך. עם זאת, כדי להגדיר את הפרויקט החדש שלך כך שהוא יוכל לקבל בדיקות מכסה, תחילה עליך להשתמש user_project_override=false . תחביר alias של Terraform מאפשר לך להבחין בין שתי הגדרות הספק בשלבים הבאים של מעבדת קוד זה.

אתחול Terraform בספרייה

יצירת תצורה חדשה בפעם הראשונה דורשת הורדת הספק שצוין בתצורה.

כדי לבצע אתחול זה, הפעל את הפקודה הבאה מהשורש של אותה ספרייה כמו קובץ התצורה main.tf שלך:

terraform init

4. צור פרויקט Firebase באמצעות Terraform

כדי "ליצור פרויקט Firebase", חשוב לזכור שכל פרויקט Firebase הוא למעשה פרויקט של Google Cloud, רק עם שירותי Firebase מופעלים עבורו.

הוסף בלוקים עבור פרויקט Google Cloud וממשקי ה-API הבסיסיים

  1. ראשית, אספקת הפרויקט הבסיסי של Google Cloud.

    לקובץ התצורה main.tf שלך, הוסף את בלוק המשאב הבא.

    עליך לציין את שם הפרויקט שלך (כמו "Terraform FriendlyChat Codelab" ) ומזהה הפרויקט שלך (כמו "terraform-codelab-your-initials" ). שים לב שערך name משמש רק בממשקי Firebase ואינו גלוי למשתמשי קצה. עם זאת, הערך project_id מזהה באופן ייחודי את הפרויקט שלך ל-Google, לכן הקפד לציין ערך ייחודי. main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
  2. לאחר מכן, עליך להפעיל את ממשקי ה-API הבסיסיים הנדרשים: ה-API של שירות שימוש ו-API לניהול Firebase.

    הפעלת ה-API הזו מטופלת בדרך כלל מאחורי הקלעים כאשר אתה משתמש במסוף Firebase ליצירת פרויקט Firebase, אך יש לומר ל- Terraform באופן מפורש לבצע הפעלה זו.

    לקובץ התצורה main.tf שלך (ממש מתחת לבלוק שיוצר את פרויקט הענן החדש), הוסף את בלוק המשאב הבא:

    main.tf
    ...
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "serviceusage" {
      provider = google-beta.no_user_project_override
    
      project = google_project.default.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "firebase" {
      provider = google-beta.no_user_project_override
    
      project = google_project.default.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    על ידי הפעלת ממשק ה-API של השימוש בשירות, הפרויקט החדש שלך יוכל לקבל המחאות מכסות! לכן, עבור כל אספקת המשאבים והפעלת השירותים הבאים, עליך להשתמש בספק עם user_project_override (אין צורך בכינוי).

הוסף חסימה כדי להפעיל שירותי Firebase

הדבר האחרון שנדרש כדי "ליצור פרויקט Firebase" הוא הפעלת שירותי Firebase בפרויקט.

המשך בקובץ התצורה main.tf שלך, הוסף את בלוק המשאב הבא.

כפי שהוזכר לעיל, שים לב שבלוק המשאב הזה משתמש בספק עם user_project_override (אין צורך בכינוי).

main.tf

...

# Enable Firebase services for the new project created above.
resource "google_firebase_project" "default" {
  provider = google-beta

  project = google_project.default.project_id

  # Wait until the required APIs are enabled.
  depends_on = [
    google_project_service.firebase,
    google_project_service.serviceusage,
  ]
}

בבלוק המשאבים למעלה, ייתכן שתבחין בסעיף depends_on , שאומר ל-Terraform להמתין להפעלת ממשקי ה-API הבסיסיים. ללא סעיף זה, Terraform אינו יודע על התלות ועלול להיתקל בשגיאות בעת הקצאת משאבים במקביל.

החל את התצורה

  1. כדי לספק את המשאבים החדשים ולאפשר את ממשקי ה-API שצוינו בקובץ התצורה שלך, הפעל את הפקודה הבאה מהשורש של אותה ספרייה כמו הקובץ main.tf שלך (שאמור להיות web ):
    terraform apply
    
  2. בטרמינל, Terraform מדפיסה תוכנית פעולות שהיא תבצע.

    אם הכל נראה כמצופה, אשר את הפעולות על ידי הזנת yes .

    main.tf
    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
      # google_firebase_project.default will be created
      + resource "google_firebase_project" "default" {
          + display_name   = (known after apply)
          + id             = (known after apply)
          + project        = "terraform-friendlychat-codelab"
          + project_number = (known after apply)
        }
    
      # google_project.default will be created
      + resource "google_project" "default" {
          + auto_create_network = true
          + id                  = (known after apply)
          + labels              = {
              + "firebase" = "enabled"
            }
          + name                = "Terraform FriendlyChat Codelab"
          + number              = (known after apply)
          + project_id          = "terraform-friendlychat-codelab"
          + skip_delete         = (known after apply)
        }
    
      # google_project_service.firebase will be created
      + resource "google_project_service" "firebase" {
          + disable_on_destroy = false
          + id                 = (known after apply)
          + project            = "terraform-friendlychat-codelab"
          + service            = "firebase.googleapis.com"
        }
    
      # google_project_service.serviceusage will be created
      + resource "google_project_service" "serviceusage" {
          + disable_on_destroy = false
          + id                 = (known after apply)
          + project            = "terraform-friendlychat-codelab"
          + service            = "serviceusage.googleapis.com"
        }
    
    Plan: 4 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes # <----
    

שים לב שאם אתה רק צריך להציג בתצוגה מקדימה את השינויים מבלי להחיל, אתה יכול להשתמש בפקודה terraform plan במקום זאת.

אמת את השינויים

לאחר ש- Terraform מסיים לפעול, תוכל לבדוק את המצב של כל המשאבים והשירותים שהופעלו ל- Terraform על ידי הפעלת הפקודה הבאה:

terraform show

הנה דוגמה למה שאתה צריך לראות מודפס. המדינה שלך תכיל ערכים ספציפיים לפרויקט שלך.

# google_firebase_project.default:
resource "google_firebase_project" "default" {
    display_name   = "Terraform FriendlyChat Codelab"
    id             = "projects/terraform-friendlychat-codelab"
    project        = "terraform-friendlychat-codelab"
    project_number = "000000000"
}

# google_project.default:
resource "google_project" "default" {
    auto_create_network = true
    id                  = "projects/terraform-friendlychat-codelab"
    labels              = {
        "firebase" = "enabled"
    }
    name                = "Terraform FriendlyChat Codelab"
    number              = "000000000"
    project_id          = "terraform-friendlychat-codelab"
}

# google_project_service.firebase:
resource "google_project_service" "firebase" {
    disable_on_destroy = false
    id                 = "terraform-friendlychat-codelab/firebase.googleapis.com"
    project            = "terraform-friendlychat-codelab"
    service            = "firebase.googleapis.com"
}

# google_project_service.serviceusage:
resource "google_project_service" "serviceusage" {
    disable_on_destroy = false
    id                 = "terraform-friendlychat-codelab/serviceusage.googleapis.com"
    project            = "terraform-friendlychat-codelab"
    service            = "serviceusage.googleapis.com"
}

לחלופין, תוכל לוודא שהפרויקט נוצר על ידי הצגתו במסוף Firebase .

The Terraform FriendlyChat Codelab project selected on the Firebase console

5. רשום את אפליקציית Firebase שלך ​​דרך Terraform

כדי להשתמש ב-Firebase, עליך לרשום כל גרסת פלטפורמה של האפליקציה שלך בפרויקט Firebase שלך. במעבדת הקוד הזה, תשתמש באפליקציה אמיתית כדי לבדוק ולקיים אינטראקציה עם מה שאתה מספק באמצעות Terraform. אפליקציה זו היא אפליקציית אינטרנט, לכן עליך לומר ל-Terraform לרשום אפליקציית Firebase Web בפרויקט Firebase החדש שלך.

הוסף בלוק כדי לרשום את אפליקציית האינטרנט

כדי לרשום את אפליקציית האינטרנט שלך בפרויקט Firebase שלך, הוסף את קובץ main.tf שלך עם בלוק המשאב הבא.

עליך לציין display_name משלך עבור אפליקציית האינטרנט שלך. שים לב שהשם הזה משמש רק בממשקי Firebase ואינו גלוי למשתמשי קצה.

main.tf

...

# Create a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "default" {
  provider = google-beta

  project      = google_firebase_project.default.project
  display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
  deletion_policy = "DELETE"
}

החל את התצורה

  1. כדי לספק את המשאב החדש, הפעל את הפקודה הבאה מהשורש של אותה ספרייה כמו הקובץ main.tf שלך (שאמור להיות web ).
    terraform apply
    
    שימו לב שהפקודה הזו לא תיצור מחדש פרויקט חדש של Google Cloud. Terraform יזהה שפרויקט עם מזהה הפרויקט שצוין כבר קיים וישווה את המצב הנוכחי של הפרויקט עם מה שיש בקובץ .tf ויבצע את כל השינויים שהוא מוצא.
  2. סקור את תוכנית הפעולה המודפסת. אם הכל נראה כמצופה, הקלד yes והקש Enter כדי לאשר את הפעולות.

אמת את השינויים

אתה יכול לבדוק את מצב המשאב שהוקצה לאחרונה על ידי הפעלת הפקודה הבאה:

terraform show

לחלופין, תוכל לוודא שהאפליקציה נרשמה בהצלחה בפרויקט שלך על ידי צפייה במסוף Firebase. עבור אל הגדרות הפרויקט ולאחר מכן גלול מטה אל הקטע האפליקציות שלך .

6. הגדר את אימות Firebase

אימות הוא חלק חשוב בכל אפליקציה. כדי לאפשר למשתמשי קצה להיכנס לאפליקציית האינטרנט שלך עם חשבונות Google שלהם, תוכל להפעיל את אימות Firebase ולהגדיר את שיטת הכניסה באמצעות Google.

שים לב שבמעבדת הקוד הזה, אנו מספקים שתי אפשרויות שונות להגדרת אימות Firebase:

  • אפשרות 1 (מומלץ) : הגדר אימות Firebase במסוף, שאינו דורש GCIP.
    • שימוש באפשרות זו פירושו שאינך צריך לשייך את הפרויקט החדש שלך לחשבון Cloud Billing.
  • אפשרות 2 : הגדר אימות Firebase באמצעות Terraform באמצעות ממשקי API של Google Cloud Identity Platform (GCIP).
    • שימוש באפשרות זו פירושו שעליך לשייך את הפרויקט החדש שלך לחשבון Cloud Billing מכיוון ש-GCIP דורש שהפרויקט יהיה בתוכנית התמחור של Blaze.

אפשרות 1: הגדר אימות באמצעות מסוף Firebase

כדי להגדיר אימות Firebase באמצעות מסוף Firebase, הפרויקט שלך לא צריך להיות בתוכנית התמחור של Blaze.

הנה איך להגדיר אימות Firebase ולהיכנס עם Google:

  1. במסוף Firebase , אתר את הקטע Build בחלונית השמאלית.
  2. לחץ על אימות , לחץ על התחל ולאחר מכן לחץ על הכרטיסייה שיטת כניסה (או לחץ כאן כדי לעבור ישירות לשם).
  3. לחץ על הוסף ספק חדש ובקטע ספקים נוספים בחר ב-Google .
  4. הפעל את הלחצן הפעל .
  5. הגדר את השם הפונה לציבור של האפליקציה שלך למשהו כמו FriendlyChat (זה לא חייב להיות ייחודי גלובלי).
  6. בחר אימייל לתמיכה בפרויקט מהתפריט הנפתח ולאחר מכן לחץ על שמור . Configuring Firebase Auth on the Firebase console
  7. אתה אמור לראות את Google כספק כניסה מופעל. Firebase console Authentication page: Google sign-in enabled

אפשרות 2: הגדר אימות באמצעות Terraform באמצעות ממשקי API של Google Cloud Identity Platform (GCIP)

כדי להגדיר אימות Firebase באמצעות Terraform, עליך להשתמש בממשקי API של GCIP, מה שאומר שהפרויקט חייב להיות בתוכנית התמחור של Blaze. אתה משדרג את פרויקט Firebase שלך ​​לשימוש בתוכנית Blaze על ידי שיוך חשבון Cloud Billing לפרויקט.

אפשר חיוב באמצעות Terraform

  1. אם עדיין אין לך חשבון Cloud Billing, השלב הראשון הוא יצירת חשבון חדש ב- Google Cloud Console . כאשר אתה עושה זאת, שים לב לזיהוי חשבון החיוב שלו. מזהה חשבון החיוב יכול להיות ממוקם בדף החיוב במזהה חשבון החיוב המשויך לפרויקט שלך. Enabling a billing account using the Google Cloud console
  2. כדי לאפשר חיוב בפרויקט שלך באמצעות Terraform, הוסף מאפיין billing_account למשאב google_project הקיים בקובץ main.tf שלך:

    main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Add this line with your Cloud Billing account ID
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
    ...
    

אפשר אימות Firebase וכניסה עם Google דרך Terraform

  1. כדי לספק אימות Firebase עם GCIP, הוסף את קובץ main.tf שלך עם בלוקי המשאבים הבאים:

    main.tf
    ...
    
    # Enable the Identity Toolkit API.
    resource "google_project_service" "auth" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      service =  "identitytoolkit.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Create an Identity Platform config.
    # Also, enable Firebase Authentication using Identity Platform (if Authentication isn't yet enabled).
    resource "google_identity_platform_config" "auth" {
      provider = google-beta
      project  = google_firebase_project.default.project
    
      # For example, you can configure to auto-delete anonymous users.
      autodelete_anonymous_users = true
    
      # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication.
      depends_on = [
        google_project_service.auth,
      ]
    }
    
  2. הפעלת כניסה עם Google מחייבת שיהיה לך לקוח OAuth . עבור לקטע ממשקי API ושירותים של Google Cloud Console כדי לבצע הגדרה זו.
  3. מכיוון שזו הפעם הראשונה שאתה יוצר מזהה לקוח עבור הפרויקט הזה, עליך להגדיר את מסך ההסכמה שלך ב-OAuth.
    1. פתח את דף מסך ההסכמה של OAuth ולאחר מכן בחר את הפרויקט שיצרת זה עתה.
    2. הגדר את סוג המשתמש ל- External , ולאחר מכן לחץ על צור .
    3. במסך הבא, השלם את הפעולות הבאות ולאחר מכן לחץ על שמור והמשך .
      • הגדר את שם האפליקציה הפונה לציבור של האפליקציה שלך למשהו כמו FriendlyChat (זה לא חייב להיות ייחודי גלובלי).
      • בחר אימייל לתמיכת משתמש מהתפריט הנפתח.
      • הזן אימייל עבור פרטי הקשר של המפתח .
    4. במסכים הבאים, השלם את הפעולות הבאות:
      • קבל את ברירות המחדל בדף היקפים ולאחר מכן לחץ על שמור והמשך .
      • קבל את ברירות המחדל בדף בדיקת משתמשים ולאחר מכן לחץ על שמור והמשך .
      • עיין בסיכום ולאחר מכן לחץ על חזרה למרכז השליטה .
      Configuring an OAuth2 client using the Google Cloud console
  4. הגדר לקוח OAuth בדף האישורים על ידי ביצוע הפעולות הבאות:
    1. לחץ על צור אישורים ובחר מזהה לקוח OAuth .
    2. מהתפריט הנפתח סוג יישום , בחר יישום אינטרנט .
    3. בשדה שם , הזן את שם האפליקציה שלך, למשל FriendlyChat (זה לא חייב להיות ייחודי גלובלי).
    4. אפשר לכתובת ה-URL של האפליקציה שלך להשתמש בלקוח OAuth זה, על ידי הגדרת הפעולות הבאות:
      • תחת מקור JavaScript מורשים , לחץ על הוסף URI והזן
        https://<PROJECT_ID>.firebaseapp.com , כאשר <PROJECT_ID> הוא מזהה הפרויקט שהגדרת ב- main.tf .
      • תחת URI מורשים להפניה מחדש , לחץ על הוסף URI והזן
        https://<PROJECT_ID>.firebaseapp.com/__/auth/handler , כאשר <PROJECT_ID> הוא מזהה הפרויקט שהגדרת ב- main.tf .
    5. לחץ על שמור .
    Obtaining the OAuth2 Client ID and secret from the Google Cloud console Credentials page
  5. כדי לאפשר כניסה עם Google באמצעות מזהה הלקוח OAuth וסוד הלקוח שלך, הוסף את קובץ main.tf שלך עם החסימה הבאה:

    main.tf
    ...
    
    variable "oauth_client_secret" {
      type = string
    
      description = "OAuth client secret. For this codelab, you can pass in this secret through the environment variable TF_VAR_oauth_client_secret. In a real app, you should use a secret manager service."
    
      sensitive = true
    }
    
    resource "google_identity_platform_default_supported_idp_config" "google_sign_in" {
      provider = google-beta
      project  = google_firebase_project.default.project
    
      enabled       = true
      idp_id        = "google.com"
      client_id     = "<YOUR_OAUTH_CLIENT_ID>"
      client_secret = var.oauth_client_secret
    
      depends_on = [
         google_identity_platform_config.auth
      ]
    }
    

החל את התצורה

  1. כדי להגדיר אימות לפי התצורה שלך, הפעל את הפקודות הבאות מהשורש של אותה ספרייה כמו קובץ main.tf שלך (שאמור להיות web ):
    export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
    
    terraform apply
    
    שים לב שהפעלת terraform apply לא תיצור מחדש פרויקט חדש של Google Cloud. Terraform יזהה שפרויקט עם מזהה הפרויקט שצוין כבר קיים וישווה את המצב הנוכחי של הפרויקט עם מה שיש בקובץ .tf . לאחר מכן הוא יבצע את כל השינויים שהוא ימצא.
  2. סקור את תוכנית הפעולה המודפסת. אם הכל נראה כמצופה, הקלד yes והקש Enter כדי לאשר את הפעולות.

אמת את השינויים

  1. במסוף Firebase , אתר את הקטע Build בחלונית השמאלית.
  2. לחץ על אימות ולאחר מכן לחץ על הכרטיסייה שיטת כניסה (או לחץ כאן כדי לעבור ישירות לשם).
  3. אתה אמור לראות את Google כספק כניסה מופעל. Firebase console Authentication page: Google sign-in enabled

7. הגדר מסד נתונים של Firestore וכללי האבטחה שלו

עבור אפליקציית האינטרנט של Codelab זה, תשמור הודעות בין משתמשי קצה במסד נתונים של Firestore.

  1. כדי להפעיל את ממשקי ה-API הנדרשים ולספק את מופע מסד הנתונים, הוסף את הקובץ main.tf שלך עם בלוקי המשאבים הבאים:

    main.tf
    ...
    
    # Enable required APIs for Cloud Firestore.
    resource "google_project_service" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "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
    }
    
    # Provision the Firestore database instance.
    resource "google_firestore_database" "default" {
      provider                    = google-beta
    
      project                     = google_firebase_project.default.project
      name                        = "(default)"
      # See available locations:
      # https://firebase.google.com/docs/firestore/locations
      location_id                 = "<NAME_OF_DESIRED_REGION>"
      # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs,
      # authentication, and Firebase Security Rules.
      type                        = "FIRESTORE_NATIVE"
      concurrency_mode            = "OPTIMISTIC"
    
      depends_on = [
        google_project_service.firestore
      ]
    }
    
  2. שנה את <NAME_OF_DESIRED_REGION> לאזור שבו ברצונך שמסד הנתונים ישוכן.

    בעת פיתוח אפליקציית ייצור, תרצה שזה יהיה באזור הקרוב לרוב המשתמשים ומשותף לשירותי Firebase אחרים, כמו פונקציות ענן. עבור מעבדת קוד זה, אתה יכול להשתמש us-east1 (דרום קרולינה) או להשתמש באזור הקרוב אליך (ראה מיקומי Cloud Firestore ).
  3. כל מופע של מסד נתונים של Firestore שנגיש ל-Firebase חייב להיות מוגן על ידי כללי אבטחה של Firebase .

    הקוד לדוגמה של מעבדת קוד זה מספק קבוצה של חוקי Firestore מאובטחים בקובץ firestore.rules , שתוכל למצוא בשורש ספריית web .
  4. הוסף את קובץ main.tf שלך עם בלוקי המשאבים הבאים כדי לבצע את הפעולות הבאות:
    • צור ערכת כללים של כללי אבטחה של Firebase מהקובץ המקומי firestore.rules .
    • שחרר את ערכת הכללים עבור מופע Firestore.
    שים לב שחסימות משאבים אלה משיגות את המקבילה של לחיצה על הלחצן פרסם במסוף Firebase או הפעלת firebase deploy --only firestore:rules .

    main.tf
    ...
    
    # Create a ruleset of Firestore Security Rules from a local file.
    resource "google_firebaserules_ruleset" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      source {
        files {
          name = "firestore.rules"
          # Write security rules in a local file named "firestore.rules".
          # Learn more: https://firebase.google.com/docs/firestore/security/get-started
          content = file("firestore.rules")
        }
      }
    
      # Wait for Firestore to be provisioned before creating this ruleset.
      depends_on = [
        google_firestore_database.default,
      ]
    }
    
    # Release the ruleset for the Firestore instance.
    resource "google_firebaserules_release" "firestore" {
      provider     = google-beta
    
      name         = "cloud.firestore"  # must be cloud.firestore
      ruleset_name = google_firebaserules_ruleset.firestore.name
      project      = google_firebase_project.default.project
    
      # Wait for Firestore to be provisioned before releasing the ruleset.
      depends_on = [
        google_firestore_database.default,
      ]
    
      lifecycle {
        replace_triggered_by = [
          google_firebaserules_ruleset.firestore
        ]
      }
    }
    
  5. הפעל terraform apply על אספקת מסד הנתונים של Firestore ופריסה של כללי האבטחה שלו.
  6. ודא שמסד הנתונים מסופק ושכללי האבטחה שלו פרוסים:
    1. במסוף Firebase , אתר את הקטע Build בחלונית השמאלית.
    2. עבור אל הקטע Firestore Database ולאחר מכן לחץ על הכרטיסייה כללים .
    Verifying Cloud Firestore rules using the Firebase console

8. הגדר דלי של Cloud Storage וכללי האבטחה שלו

עבור אפליקציית האינטרנט של Codelab זה, תשמור תמונות ששותפו בין משתמשי קצה בדלי של Cloud Storage.

  1. כדי להפעיל את ממשקי ה-API הנדרשים ולהקצות את דלי ברירת המחדל של Cloud Storage, הוסף את קובץ main.tf שלך עם בלוקי המשאבים הבאים.

    שים לב שדלי ברירת המחדל של Cloud Storage עבור הפרויקט שלך מסופק באמצעות Google App Engine וחייב להיות באותו מיקום כמו מסד הנתונים שלך ב-Firestore. ראה מיקומי App Engine למידע נוסף.

    אם אתה רוצה מספר דליים בפרויקט שלך, הקצא אותם באמצעות המשאב google_storage_bucket (לא מוצג במעבדת קוד זה).

    main.tf
    ...
    
    # Enable required APIs for Cloud Storage for Firebase.
    resource "google_project_service" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "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
    }
    
    # Provision the default Cloud Storage bucket for the project via Google App Engine.
    resource "google_app_engine_application" "default" {
      provider    = google-beta
    
      project     = google_firebase_project.default.project
      # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
      # This will set the location for the default Storage bucket and the App Engine App.
      location_id = "<NAME_OF_DESIRED_REGION_FOR_DEFAULT_BUCKET>"  # Must be in the same location as Firestore (above)
    
      # Wait until Firestore is provisioned first.
      depends_on = [
        google_firestore_database.default
      ]
    }
    
    # Make the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
    resource "google_firebase_storage_bucket" "default-bucket" {
      provider  = google-beta
    
      project   = google_firebase_project.default.project
      bucket_id = google_app_engine_application.default.default_bucket
    }
    
  2. כל דלי Cloud Storage שנגיש ל-Firebase חייב להיות מוגן על ידי כללי אבטחה של Firebase .

    הקוד לדוגמה של מעבדת קוד זה מספק קבוצה של חוקי Firestore מאובטחים בקובץ storage.rules , שתוכל למצוא בשורש ספריית web .
  3. הוסף את קובץ main.tf שלך עם בלוקי המשאבים הבאים כדי לבצע את הפעולות הבאות:
    • צור ערכת כללים של כללי אבטחה של Firebase מהקובץ המקומי.
    • שחרר את ערכת הכללים עבור דלי האחסון.
    שים לב שחסימות משאבים אלה משיגות את המקבילה של לחיצה על הלחצן פרסם במסוף Firebase או הפעלת firebase deploy --only storage .

    main.tf
    ...
    
    # Create a ruleset of Cloud Storage Security Rules from a local file.
    resource "google_firebaserules_ruleset" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      source {
        files {
          # Write security rules in a local file named "storage.rules".
          # Learn more: https://firebase.google.com/docs/storage/security/get-started
          name    = "storage.rules"
          content = file("storage.rules")
        }
      }
    
      # Wait for the default Storage bucket to be provisioned before creating this ruleset.
      depends_on = [
        google_firebase_storage_bucket.default-bucket,
      ]
    }
    
    # Release the ruleset to the default Storage bucket.
    resource "google_firebaserules_release" "default-bucket" {
      provider     = google-beta
    
      name         = "firebase.storage/${google_app_engine_application.default.default_bucket}"
      ruleset_name = "projects/${google_firebase_project.default.project}/rulesets/${google_firebaserules_ruleset.storage.name}"
      project      = google_firebase_project.default.project
    
      lifecycle {
        replace_triggered_by = [
          google_firebaserules_ruleset.storage
        ]
      }
    }
    
  4. הפעל terraform apply על אספקת דלי ברירת המחדל של Cloud Storage ופריסה של כללי האבטחה שלו.
  5. ודא שהדלי מסופק ושכללי האבטחה שלו פרוסים:
    1. במסוף Firebase , אתר את הקטע Build בחלונית השמאלית.
    2. עבור למקטע אחסון ולאחר מכן לחץ על הכרטיסייה כללים .
    Verifying security rules using the Firebase console

9. הפעל את האפליקציה שלך באופן מקומי

עכשיו אתה מוכן להפעיל את אפליקציית האינטרנט שלך בפעם הראשונה! אתה תשתמש באמולטור Firebase Hosting כדי לשרת את האפליקציה שלך באופן מקומי.

  1. פתח חלון מסוף חדש ומתוך ספריית web , הפעל את פקודת Firebase CLI הבאה כדי להפעיל את האמולטור:
    firebase emulators:start --project=<PROJECT_ID>
    
  2. בדפדפן שלך, פתח את אפליקציית האינטרנט שלך בכתובת האתר המקומית המוחזרת על ידי ה-CLI (בדרך כלל http://localhost:5000 ).

אתה אמור לראות את ממשק המשתמש של אפליקציית FriendlyChat שלך, אשר לא (עדיין!) פועל. האפליקציה עדיין לא מחוברת ל-Firebase, אבל על ידי השלמת השלבים הבאים של מעבדת קוד זה, היא תהיה!

שים לב שבכל פעם שאתה מבצע שינויים באפליקציית האינטרנט שלך (כמו שתעשה בשלבים הבאים של מעבדת קוד זה), רענן את הדפדפן שלך כדי לעדכן את כתובת האתר המקומית בשינויים אלה.

10. התקן, תצורה ואתחול של Firebase

כדי לגרום לאפליקציה לעבוד עם Firebase, האפליקציה שלך צריכה את Firebase SDK ואת תצורת Firebase עבור פרויקט Firebase שלך.

הקוד לדוגמה עבור מעבדת קוד זה כבר אפליקציה עובדת עם כל התלות והפונקציות הנדרשות לשימוש במוצרי Firebase שונים באפליקציה. אתה יכול להסתכל ב- web/package.json וב- web/src/index.js אם תרצה לראות מה כבר נעשה.

למרות שקוד הדוגמה הושלם ברובו, אתה עדיין צריך לעשות כמה דברים כדי להפעיל את האפליקציה שלך, כולל: התקנת Firebase SDK, התחל את הבנייה, הוסף את תצורת Firebase לאפליקציה שלך ולבסוף אתחל את Firebase.

התקן את Firebase SDK והתחל את בניית ה-webpack שלך

עליך להפעיל כמה פקודות כדי להתחיל את בניית האפליקציה שלך.

  1. פתח חלון מסוף חדש.
  2. ודא שאתה נמצא בשורש ספריית web .
  3. הפעל npm install כדי להוריד את Firebase SDK.
  4. הפעל npm update כדי לעדכן את כל התלות.
  5. הפעל npm run start כדי להפעיל webpack.

עבור שאר ה-codelab, webpack יבנה כעת מחדש את קוד המקור שלך ללא הרף.

הוסף את תצורת Firebase שלך ​​לאפליקציה שלך

אתה גם צריך להוסיף את תצורת Firebase לאפליקציה שלך כדי ש-SDKs של Firebase ידעו באיזה פרויקט Firebase אתה רוצה שהם ישתמשו.

עבור מעבדת קוד זה, יש לך שתי אפשרויות שונות לקבל את תצורת Firebase שלך:

  • אפשרות 1 : השג את תצורת Firebase ממסוף Firebase.
  • אפשרות 2 : השג את תצורת Firebase שלך ​​באמצעות Terraform.

אפשרות 1: השג את התצורה ממסוף Firebase והוסף אותה לבסיס הקוד שלך

  1. במסוף Firebase, עבור אל הגדרות הפרויקט שלך.
  2. גלול מטה אל כרטיס האפליקציות שלך , ולאחר מכן בחר את אפליקציית האינטרנט שלך.
  3. בחר Config מחלונית קטעי הקוד של Firebase SDK ולאחר מכן העתק את קטע ה-config.
  4. הדבק את התצורה שלך בקובץ web/src/firebase-config.js של האפליקציה שלך, כך:

    firebase-config.js
    ...
    
    const config = {
      apiKey: "<API_KEY>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      projectId: "<PROJECT_ID>",
      storageBucket: "<PROJECT_ID>.appspot.com",
      messagingSenderId: "<SENDER_ID>",
      appId: "<APP_ID>",
      measurementId: "<G-MEASUREMENT_ID>",
    };
    
    ...
    

אפשרות 2: השג את התצורה דרך Terraform והוסף אותה לבסיס הקוד שלך

לחלופין, אתה יכול לקבל את תצורת Firebase שלך ​​דרך Terraform כערך פלט ב-CLI.

  1. בקובץ main.tf שלך, מצא את בלוק המשאב של google_firebase_web_app שלך (החסימה שרשם אפליקציית אינטרנט בפרויקט שלך).
  2. מיד לאחר הבלוק הזה, הוסף את הבלוקים הבאים:

    main.tf
    ...
    
    data "google_firebase_web_app_config" "default" {
      provider     = google-beta
      project      = google_firebase_project.default.project
      web_app_id   = google_firebase_web_app.default.app_id
    }
    
    output "friendlychat_web_app_config" {
      value = {
        projectId         = google_firebase_project.default.project
        appId             = google_firebase_web_app.default.app_id
        apiKey            = data.google_firebase_web_app_config.default.api_key
        authDomain        = data.google_firebase_web_app_config.default.auth_domain
        storageBucket     = lookup(data.google_firebase_web_app_config.default, "storage_bucket", "")
        messagingSenderId = lookup(data.google_firebase_web_app_config.default, "messaging_sender_id", "")
        measurementId     = lookup(data.google_firebase_web_app_config.default, "measurement_id", "")
      }
    }
    
    ...
    
  3. מכיוון שבלוק data ובלוק output אינם מיועדים לשינוי התשתית בשום אופן, אתה רק צריך להפעיל את הפקודות הבאות.
    1. כדי לטעון את תצורת Firebase של אפליקציית האינטרנט שלך למצב Terraform של הספרייה שלך, הפעל את הפקודה הבאה:
      terraform refresh
      
    2. כדי להדפיס את ערכי התצורה של Firebase, הפעל את הפקודה הבאה:
      terraform output –json
      
      להלן פלט לדוגמה של תצורה. הפלט המודפס שלך יכיל את ערכי הפרויקט והאפליקציה שלך.
      {
        "friendlychat_web_app_config": {
          "sensitive": false,
          "type": [
            "object",
            {
              "apiKey": "string",
              "appId": "string",
              "authDomain": "string",
              "measurementId": "string",
              "messagingSenderId": "string",
              "projectId": "string",
              "storageBucket": "string"
            }
          ],
          "value": {
            "apiKey": "<API_KEY>",
            "appId": "<APP_ID>",
            "authDomain": "<PROJECT_ID>.firebaseapp.com",
            "measurementId": "<G-MEASUREMENT_ID>",
            "messagingSenderId": "<SENDER_ID>",
            "projectId": "<PROJECT_ID>",
            "storageBucket": "<PROJECT_ID>.appspot.com"
          }
        }
      }
      
  4. העתק את הערכים מתוך מפת value .
  5. הדבק את הערכים האלה (התצורה שלך) בקובץ web/src/firebase-config.js של האפליקציה שלך, כך:

    firebase-config.js
    ...
    
    const config = {
      apiKey: "<API_KEY>",
      appId: "<APP_ID>",
      authDomain: "<PROJECT_ID>.firebaseapp.com",
      measurementId: "<G-MEASUREMENT_ID>",
      messagingSenderId: "<SENDER_ID>",
      projectId: "<PROJECT_ID>",
      storageBucket: "<PROJECT_ID>.appspot.com",
    };
    
    ...
    

אתחל את Firebase באפליקציה שלך

לבסוף, כדי לאתחל את Firebase, הוסף את הקובץ web/src/index.js של האפליקציה שלך עם הפרטים הבאים:

index.js

...

const firebaseAppConfig = getFirebaseConfig();
initializeApp(firebaseAppConfig);

נסה את האפליקציה שלך

כעת, כשהכל מוגדר עבור Firebase, אתה יכול לנסות את אפליקציית האינטרנט הפונקציונלית שלך.

  1. רענן את הדפדפן המשרת את האפליקציה שלך.
  2. כעת אתה אמור להיות מסוגל להיכנס עם Google ולהתחיל לפרסם הודעות בצ'אט. אם יש לך קבצי תמונה, אתה יכול אפילו להעלות אותם!

11. שכפל את התצורה שלך על פני סביבות

Terraform מצטיינת בניהול תשתיות מרובות המוגדרות באופן דומה (לדוגמה, הקמת פרויקט Firebase שדומה לפרויקט פרוד).

במעבדת הקוד הזה, תיצור פרויקט Firebase שני שיהווה סביבת בימוי.

כדי לשכפל תצורה קיימת ליצירת פרויקט בימוי זה, יש לך שתי אפשרויות:

  • אפשרות 1 : צור עותק של תצורת Terraform.
    אפשרות זו מציעה את הגמישות הגדולה ביותר לכמה הפרוייקט המשוכפל יכול להיות שונה מפרויקט המקור.
  • אפשרות 2 : שימוש חוזר בתצורות עם for_each .
    אפשרות זו מציעה יותר שימוש חוזר בקוד אם כל פרויקט לא צריך להיות שונה במובנים משמעותיים וברצונך להפיץ שינויים לכל הפרויקטים בבת אחת.

אפשרות 1: צור עותק של תצורת Terraform

אפשרות זו מציעה את הגמישות הגדולה ביותר לכמה שהפרויקט המשוכפל יכול להיות שונה מפרויקט המקור, כגון אפליקציות עם שמות תצוגה שונים והשקה מדרגת.

  1. בשורש ספריית web שלך, צור קובץ תצורה חדש של Terraform בשם main_staging.tf .
  2. העתק את כל בלוקי המשאבים מקובץ main.tf שלך (למעט בלוקים terraform ו- provider ), ולאחר מכן הדבק אותם בקובץ main_staging.tf שלך.
  3. לאחר מכן עליך לשנות כל אחד מבלוק המשאבים המשוכפל שלך ב- main_staging.tf כדי שהם יעבדו עם פרויקט ההיערכות שלך:
    • תוויות משאבים: השתמש בשם חדש כדי למנוע התנגשות. לדוגמה, שנה את שם resource "google_project" "default" resource "google_project" "staging" .
    • הפניות למשאבים: עדכן כל אחד מהם. לדוגמה, עדכן את google_firebase_project.default.project ל- google_firebase_project.staging.project .
    אתה יכול למצוא את התצורה המלאה של קובץ main_staging.tf במאגר GitHub של Codelab זה:

    web/terraform-checkpoints/replicate-config/main_staging-copypaste.tf

    אם אתה רוצה להשתמש בתצורה זו, וודא שאתה עושה את הפעולות הבאות:
    1. העתק את התצורה מ- main_staging-copypaste.tf ולאחר מכן הדבק אותה בקובץ main_staging.tf שלך.
    2. בקובץ main_staging.tf שלך, בצע את הפעולות הבאות:
      • בגוש משאב google_project , עדכן את תכונת name , תכונת ה- project-id , ו(אם הגדרת אימות באמצעות Terraform) את התכונה billing_account עם הערכים שלך.
      • בגוש המשאבים google_firebase_web_app , עדכן את המאפיין display_name בערך משלך.
      • בבלוק המשאבים google_firestore_database ו- google_app_engine_application , עדכן את מאפייני location_id בערך משלך.
    main_staging.tf
    # Create a new Google Cloud project.
    resource "google_project" "staging" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_STAGING_PROJECT>"
      project_id      = "<PROJECT_ID_OF_STAGING_PROJECT"
      # Required if you want to set up Authentication via Terraform
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>"
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "staging_serviceusage" {
      provider = google-beta.no_user_project_override
    
      project = google_project.staging.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "staging_firebase" {
      provider = google-beta.no_user_project_override
    
      project = google_project.staging.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable Firebase services for the new project created above.
    resource "google_firebase_project" "staging" {
      provider = google-beta
    
      project = google_project.staging.project_id
    
      # Wait until the required APIs are enabled.
      depends_on = [
        google_project_service.staging_serviceusage,
        google_project_service.staging_firebase,
      ]
    }
    
    # Create a Firebase Web App in the new project created above.
    resource "google_firebase_web_app" "staging" {
      provider = google-beta
    
      project      = google_firebase_project.staging.project
      display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
      deletion_policy = "DELETE"
    }
    
  4. הפעל terraform apply על אספקת פרויקט ה-Firebase החדש שלך עם כל המשאבים והפעלת השירותים שלו.
  5. ודא שהכל סופק והופעל כצפוי על ידי בדיקתם במסוף Firebase כמו קודם.

אפשרות 2: שימוש חוזר בתצורות עם for_each

אפשרות זו מציעה יותר שימוש חוזר בקוד אם כל פרויקט לא צריך להיות שונה במובנים משמעותיים וברצונך להפיץ שינויים לכל הפרויקטים בבת אחת. הוא משתמש במטא-טיעון for_each בשפת Terraform.

  1. פתח את הקובץ main.tf שלך.
  2. לכל בלוק משאבים שברצונך לשכפל, הוסף מטא-ארגומנט for_each , כך:

    main.tf
    # Create new Google Cloud projects.
    resource "google_project" "default" {
      provider        = google-beta.no_user_project_override
      name            = each.value
      # Create a unique project ID for each project, with each ID starting with <PROJECT_ID>.
      project_id      = "<PROJECT_ID>-${each.key}"
      # Required if you want to set up Authentication via Terraform
      billing_account = "<YOUR_BILLING_ACCOUNT_ID>"
    
      # Required for the projects to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    
      for_each = {
        prod    = "<PROJECT_NAME_OF_PROD_PROJECT>"
        staging = "<PROJECT_NAME_OF_STAGING_PROJECT>"
      }
    }
    
    # Enable the required underlying Service Usage API.
    resource "google_project_service" "serviceusage" {
      provider = google-beta.no_user_project_override
      for_each = google_project.default
    
      project = each.value.project_id
      service = "serviceusage.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable the required underlying Firebase Management API.
    resource "google_project_service" "firebase" {
      provider = google-beta.no_user_project_override
      for_each = google_project.default
    
      project = each.value.project_id
      service = "firebase.googleapis.com"
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Enable Firebase services for each of the new projects created above.
    resource "google_firebase_project" "default" {
      provider = google-beta
      for_each = google_project.default
    
      project = each.value.project_id
    
      depends_on = [
        google_project_service.serviceusage,
        google_project_service.firebase,
      ]
    }
    
    # Create a Firebase Web App in each of the new projects created above.
    resource "google_firebase_web_app" "default" {
      provider = google-beta
      for_each = google_firebase_project.default
    
      project      = each.value.project
      # The Firebase Web App created in each project will have the same display name.
      display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
      deletion_policy = "DELETE"
    }
    
    
    # NOTE: For this codelab, we recommend setting up Firebase Authentication
    # using the Firebase console. However, if you set up Firebase Authentication
    # using Terraform, copy-paste from your main.tf the applicable blocks.
    # Make sure to add the `for_each` meta-argument into each block.
    
    
    # Copy-paste from your main.tf file the applicable resource blocks
    # for setting up Cloud Firestore (including rules) and
    # for setting up Cloud Storage for Firebase (including rules).
    # Make sure to add the `for_each` meta-argument into each block.
    
    אתה יכול למצוא את התצורה המלאה של קובץ main.tf המשתמש במטא-ארגומנט for_each במאגר GitHub של Codelab זה:

    web/terraform-checkpoints/replicate-config/main-foreach.tf

    אם אתה רוצה להשתמש בתצורה זו, וודא שאתה עושה את הפעולות הבאות:
    1. העתק את התצורה מ- main-foreach.tf ואז הדבק אותו בקובץ main.tf שלך.
    2. בקובץ main.tf שלך, בצע את הפעולות הבאות:
      • בבלוק המשאבים google_project , עדכן את תכונת name , תכונה project-id ו (אם אתה מגדיר אימות באמצעות TerraForm) את התכונה billing_account עם הערכים שלך.
      • ב- google_firebase_web_app Block, עדכן את התכונה display_name עם הערך שלך.
      • ב- google_firestore_database וב- google_app_engine_application Blocks משאבים, עדכן את תכונות location_id עם הערך שלך.
  3. במקום ליישם את התצורה הזו מייד, חשוב להבין ולתקן כמה דברים כיצד TerraForm מפרש את התצורה הזו בהשוואה לתשתית הקיימת.
    1. כרגע, אם יישמת את התצורה הזו המשתמשת for_each , כתובות המשאב ייראו כמו הבאות:
      google_project.default["prod"]
      google_project.default["staging"]
      google_firebase_project.default["prod"]
      google_firebase_project.default["staging"]
      google_firebase_web_app.default["prod"]
      google_firebase_web_app.default["staging"]
      
      עם זאת, הפרויקט הקיים שיצרת בחלק הראשון של Codelab זה ידוע ל- TerraForm כדברים הבאים:
      google_project.default
      google_firebase_project.default
      google_firebase_android_app.default
      
    2. הפעל terraform plan לראות אילו פעולות ייקח טרפורם בהתחשב במצב הנוכחי.

      הפלט אמור להראות ש- TerraForm ימחק את הפרויקט שיצרת בחלק הראשון של Codelab זה ויוצר שני פרויקטים חדשים. הסיבה לכך היא ש- TerraForm לא יודע שהפרויקט בכתובת google_project.default הועבר לכתובת החדשה google_project.default["prod"] .
    3. כדי לתקן זאת, הפעל את הפקודה terraform state mv :
      terraform state mv "google_project.default" "google_project.default[\"prod\"]"
      
    4. באופן דומה, כדי לתקן את כל שאר חסימות המשאבים, הפעל את terraform state mv עבור google_firebase_project , google_firebase_web_app וכל שאר חסימות המשאבים בקובץ main.tf שלך.
    5. עכשיו, אם אתה מפעיל שוב terraform plan , זה לא אמור להראות ש- TerraForm ימחק את הפרויקט שיצרת בחלק הראשון של Codelab זה.
  4. הפעל terraform apply על אספקת פרויקט FireBase "הבימוי" החדש שלך ואת כל המשאבים שלו ולאפשר את שירותיו.
  5. ודא שהכל הועלה והופעל כצפוי על ידי בדיקתם במסוף Firebase כמו קודם.

12. שלב בונוס: פרוס את אפליקציות הבמה שלך ו- Prod שלך

  1. בבסיס הקוד של האפליקציה שלך, שנה את firebase-config.js כדי להשתמש בתצורת Firebase מפרויקט הבימוי שלך במקום זאת.

    כדי להזכיר לעצמך כיצד להשיג את תצורת ה- Firebase שלך ​​ולהוסיף אותו לאפליקציה שלך, עיין בשלב הקודם של CodElab זה, הוסף את תצורת FireBase שלך ​​לאפליקציה שלך.
  2. בשורש ספריית web שלך, הפעל את הפקודה הבאה כדי לפרוס את האפליקציה שלך לפרויקט ה- Firebase שלך.
    firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
    
  3. פתח את אפליקציית הבמה שלך בדפדפן באמצעות כתובת האתר המודפסת בפלט של firebase deploy . נסה להיכנס, לשלוח הודעות ולהעלות תמונות.

    כשאתה מפרס אפליקציה לפרויקט Firebase, הוא משתמש במשאבי Firebase אמיתיים ולא במשאבים מחוקקים. כשאתה מתקשר עם אפליקציית הבימוי שלך, אתה אמור לראות נתונים ותמונות מופיעים בפרויקט הבימוי שלך במסוף Firebase.
  4. לאחר בדיקת האפליקציה שלך בבימוי, שנה את firebase-config.js בחזרה לשימוש בתצורת FireBase של Prod Project (הפרויקט הראשון שיצרת ב- Codelab זה).
  5. בשורש ספריית web שלך, הפעל את הפקודה הבאה כדי לפרוס את האפליקציה שלך לפרויקט Firebase הייצור שלך.
    firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
    
  6. פתח את אפליקציית הייצור שלך בדפדפן באמצעות כתובת האתר המודפסת בפלט של firebase deploy . נסה להיכנס, לשלוח הודעות ולהעלות תמונות.

    אתה אמור לראות נתונים ותמונות מופיעים בפרויקט הייצור שלך במסוף Firebase.
  7. כשתסיים ליצור אינטראקציה עם שתי האפליקציות עבור Codelab זה, אתה יכול למנוע את Firebase לשרת אותם. הפעל את הפקודה הבאה עבור כל אחד מהפרויקטים שלך:
    firebase hosting:disable --project=<STAGING_PROJECT_ID>
    
    firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
    

13. מזל טוב!

השתמשת ב- TerraForm כדי להגדיר יישום אינטרנט צ'אט בזמן אמת! ועקבת אחר שיטות עבודה מומלצות לסביבות פיתוח על ידי יצירת פרויקטים נפרדים של Firebase לביצוע ו- Prod.

מה שכיסינו

  • שימוש ב- Terraform CLI לניהול משאבי ענן
  • שימוש ב- TerraForm כדי להגדיר את מוצרי FireBase (אימות, Firestore, אחסון ענן וכללי אבטחה)
  • הפעלה ובדיקה של אפליקציית אינטרנט באופן מקומי באמצעות חבילת האמולטור המקומית Firebase
  • ייבוא ​​Firebase לאפליקציית אינטרנט
  • באמצעות TerraForm כדי לשכפל תצורה על פני סביבות מרובות

למידע נוסף על Firebase ו- TerraForm, בקרו בתיעוד שלנו. אתה יכול למצוא רשימה של כל מוצרי Firebase עם תמיכה ב- TerraForm, לדוגמא תצורות TerraForm עבור מקרי שימוש נפוצים ופתרון בעיות מועיל ושאלות נפוצות.