قم بإعداد وإدارة مشاريع ومنتجات Firebase عبر Terraform

1 المقدمة

الأهداف

يمكنك استخدام Terraform لإعداد مشروع Firebase وإدارته، بما في ذلك التكوين البرمجي للبنية الأساسية ومنتجات Firebase.

يصف هذا الدرس التطبيقي حول التعليمات البرمجية أولاً كيفية إنشاء ملف تكوين Terraform لإنشاء مشروع Firebase جديد، متبوعًا بكيفية تكوين التطبيقات ومنتجات Firebase التي تريد استخدامها في هذا المشروع. نحن نغطي أيضًا أساسيات سطر أوامر Terraform، مثل معاينة التغييرات التي سيتم إجراؤها ثم تنفيذها.

إذا كنت تريد معرفة كيفية إعداد مشاريع ومنتجات Firebase وإدارتها باستخدام Terraform، فهذا الدرس التطبيقي حول البرمجة مناسب لك!

ما ستتعلمه

  • كيفية إنشاء ملف تكوين Terraform ( *.tf )
  • كيفية استخدام أوامر Terraform CLI لإدارة البنية الأساسية لديك
  • كيفية تعديل التكوين الخاص بك لتحديث الموارد والخدمات الخاصة بك
  • كيفية تطبيق التكوين الخاص بك على تطبيق ويب حقيقي (يسمى Friendly Chat )
  • كيفية تحديد التكوينات المتوازية (والمتزامنة) في بيئات مختلفة (الإنتاج، والتجهيز، وما إلى ذلك)

ماذا ستحتاج

لتحقيق النجاح في هذا الدرس التطبيقي حول التعليمات البرمجية، تحتاج إلى إتقان أساسيات استخدام Terraform ومصطلحاته، بما في ذلك المتطلبات الأساسية التالية:

  • قم بتثبيت Terraform والتعرف على Terraform باستخدام البرامج التعليمية الرسمية الخاصة بهم

يوفر هذا الدرس التطبيقي حول التعليمات البرمجية نموذجًا حقيقيًا للتطبيق حتى تتمكن من اختبار ما توفره عبر Terraform والتفاعل معه. للقيام بذلك، سوف تحتاج إلى ما يلي:

  • نموذج التعليمات البرمجية لتطبيق ويب - قم بتنزيل هذا الرمز في الخطوة التالية من الدرس التطبيقي حول التعليمات البرمجية
  • يقوم مدير الحزم npm (الذي يأتي عادةً مع Node.js ) - بتثبيت هذه الأدوات
  • Firebase CLI - قم بتثبيت CLI هذا وقم بتسجيل الدخول

2. احصل على رمز البداية

في هذا الدرس التطبيقي حول التعليمات البرمجية، يمكنك اختبار ما توفره عبر 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 الأساسي وواجهات برمجة التطبيقات

  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. بعد ذلك، تحتاج إلى تمكين واجهات برمجة التطبيقات الأساسية المطلوبة: واجهة برمجة تطبيقات استخدام الخدمة وواجهة برمجة تطبيقات إدارة 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
    }
    
    من خلال تمكين واجهة برمجة تطبيقات استخدام الخدمة، سيتمكن مشروعك الجديد من قبول عمليات التحقق من الحصص! لذلك، بالنسبة لجميع عمليات توفير الموارد وتمكين الخدمة اللاحقة، يجب عليك استخدام الموفر مع 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 بالانتظار حتى يتم تمكين واجهات برمجة التطبيقات الأساسية. بدون هذا الشرط، لا يعرف Terraform التبعية وقد يواجه أخطاء عند توفير الموارد بالتوازي.

تطبيق التكوين

  1. لتوفير الموارد الجديدة وتمكين واجهات برمجة التطبيقات المحددة في ملف التكوين الخاص بك، قم بتشغيل الأمر التالي من جذر نفس الدليل مثل ملف 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 App في مشروع 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 باستخدام واجهات برمجة تطبيقات Google Cloud Identity Platform (GCIP).
    • يعني استخدام هذا الخيار أنه يتعين عليك ربط مشروعك الجديد بحساب Cloud Billing نظرًا لأن GCIP يتطلب أن يكون المشروع مدرجًا في خطة تسعير Blaze.

الخيار 1: إعداد المصادقة باستخدام وحدة تحكم Firebase

لإعداد مصادقة Firebase باستخدام وحدة تحكم Firebase، لا يلزم أن يكون مشروعك مدرجًا في خطة تسعير Blaze.

فيما يلي كيفية إعداد مصادقة Firebase وتسجيل الدخول باستخدام Google:

  1. في وحدة تحكم Firebase ، حدد موقع قسم البناء في اللوحة اليمنى.
  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 باستخدام واجهات برمجة تطبيقات Google Cloud Identity Platform (GCIP).

لإعداد مصادقة Firebase عبر Terraform، يجب عليك استخدام واجهات برمجة تطبيقات 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 . انتقل إلى قسم واجهات برمجة التطبيقات والخدمات في Google Cloud Console للقيام بهذا الإعداد.
  3. نظرًا لأن هذه هي المرة الأولى التي تقوم فيها بإنشاء معرف عميل لهذا المشروع، فأنت بحاجة إلى تكوين شاشة موافقة OAuth الخاصة بك.
    1. افتح صفحة شاشة موافقة OAuth ، ثم حدد المشروع الذي أنشأته للتو.
    2. قم بتعيين نوع المستخدم إلى خارجي ، ثم انقر فوق إنشاء .
    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 لن يؤدي إلى إعادة الإنشاء مشروع جوجل السحابي الجديد. سيكتشف Terraform وجود مشروع بمعرف المشروع المحدد بالفعل وسيقارن الحالة الحالية للمشروع بما هو موجود في ملف .tf . سيقوم بعد ذلك بإجراء أية تغييرات يجدها.
  2. قم بمراجعة خطة العمل المطبوعة. إذا بدا كل شيء كما هو متوقع، فاكتب yes واضغط على Enter للموافقة على الإجراءات.

التحقق من صحة التغييرات

  1. في وحدة تحكم Firebase ، حدد موقع قسم البناء في اللوحة اليمنى.
  2. انقر فوق المصادقة ، ثم انقر فوق علامة التبويب طريقة تسجيل الدخول (أو انقر هنا للانتقال مباشرة إلى هناك).
  3. يجب أن ترى Google كموفر تسجيل دخول ممكّن. Firebase console Authentication page: Google sign-in enabled

7. قم بإعداد قاعدة بيانات Firestore وقواعد الأمان الخاصة بها

بالنسبة لتطبيق الويب الخاص ببرنامج Codelab هذا، ستقوم بتخزين الرسائل بين المستخدمين النهائيين في قاعدة بيانات Firestore.

  1. لتمكين واجهات برمجة التطبيقات المطلوبة وتوفير مثيل قاعدة البيانات، قم بإلحاق ملف 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 الأخرى، مثل Cloud Functions. بالنسبة إلى هذا الدرس التطبيقي حول التعليمات البرمجية، يمكنك استخدام us-east1 (كارولينا الجنوبية) أو استخدام المنطقة الأقرب إليك (راجع مواقع Cloud Firestore ).
  3. يجب حماية كل مثيل لقاعدة بيانات Firestore يمكن الوصول إليها بواسطة Firebase بواسطة قواعد أمان Firebase .

    يوفر نموذج التعليمات البرمجية الخاص ببرنامج Codelab مجموعة من قواعد 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 ، حدد موقع قسم البناء في اللوحة اليمنى.
    2. انتقل إلى قسم قاعدة بيانات Firestore ، ثم انقر فوق علامة التبويب "القواعد" .
    Verifying Cloud Firestore rules using the Firebase console

8. قم بإعداد مجموعة التخزين السحابي وقواعد الأمان الخاصة بها

بالنسبة لتطبيق الويب الخاص ببرنامج Codelab هذا، ستقوم بتخزين الصور المشتركة بين المستخدمين النهائيين في مجموعة التخزين السحابي.

  1. لتمكين واجهات برمجة التطبيقات المطلوبة وتوفير مجموعة Cloud Storage الافتراضية، قم بإلحاق ملف main.tf بكتل الموارد التالية.

    لاحظ أنه يتم توفير مجموعة التخزين السحابي الافتراضية لمشروعك عبر Google App Engine ويجب أن يكون لها نفس موقع قاعدة بيانات Firestore الخاصة بك. راجع مواقع محرك التطبيقات لمزيد من المعلومات.

    إذا كنت تريد مجموعات متعددة في مشروعك، فقم بتوفيرها باستخدام مورد 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. يجب حماية كل حاوية تخزين سحابية يمكن الوصول إليها بواسطة Firebase بواسطة قواعد أمان Firebase .

    يوفر نموذج التعليمة البرمجية الخاصة ببرنامج Codelab مجموعة من قواعد 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 ، حدد موقع قسم البناء في اللوحة اليمنى.
    2. انتقل إلى قسم التخزين ، ثم انقر فوق علامة التبويب القواعد .
    Verifying security rules using the Firebase console

9. قم بتشغيل تطبيقك محليًا

أنت الآن جاهز لتشغيل تطبيق الويب الخاص بك للمرة الأولى! ستستخدم محاكي Firebase Hosting لخدمة تطبيقك محليًا.

  1. افتح نافذة طرفية جديدة، ومن دليل web ، قم بتشغيل أمر Firebase CLI التالي لبدء المحاكي:
    firebase emulators:start --project=<PROJECT_ID>
    
  2. في متصفحك، افتح تطبيق الويب الخاص بك على عنوان URL المحلي الذي يعرضه سطر الأوامر (عادةً http://localhost:5000 ).

من المفترض أن تشاهد واجهة المستخدم الخاصة بتطبيق FriendlyChat، والتي لا تعمل (حتى الآن!). لم يتم ربط التطبيق بـ Firebase بعد، ولكن من خلال إكمال الخطوات التالية من هذا الدرس التطبيقي حول التعليمات البرمجية، سيتم ربطه!

لاحظ أنه عندما تقوم بإجراء تغييرات على تطبيق الويب الخاص بك (كما ستفعل في الخطوات التالية من هذا الدرس التطبيقي حول التعليمات البرمجية)، قم بتحديث متصفحك لتحديث عنوان URL المحلي بهذه التغييرات.

10. تثبيت Firebase وتكوينه وتهيئته

للحصول على تطبيق يعمل مع Firebase، يحتاج تطبيقك إلى Firebase SDK وتكوين Firebase لمشروع Firebase الخاص بك.

يعد نموذج التعليمات البرمجية الخاص ببرنامج تدريب التعليمات البرمجية هذا بالفعل تطبيقًا عاملاً يحتوي على جميع التبعيات والوظائف المطلوبة لاستخدام منتجات Firebase المتنوعة في التطبيق. يمكنك البحث في web/package.json و web/src/index.js إذا كنت ترغب في رؤية ما تم إنجازه بالفعل.

على الرغم من أن نموذج التعليمات البرمجية مكتمل في الغالب، إلا أنك لا تزال بحاجة إلى القيام ببعض الأشياء لتشغيل تطبيقك، بما في ذلك: تثبيت Firebase SDK، وبدء البناء، وإضافة تكوين Firebase إلى تطبيقك، وأخيرًا تهيئة Firebase.

قم بتثبيت Firebase SDK وابدأ في إنشاء حزمة الويب الخاصة بك

تحتاج إلى تشغيل بعض الأوامر لبدء إنشاء تطبيقك.

  1. افتح نافذة طرفية جديدة.
  2. تأكد من أنك في جذر دليل web .
  3. قم بتشغيل npm install لتنزيل Firebase SDK.
  4. قم بتشغيل npm update لتحديث أي تبعيات.
  5. قم بتشغيل npm run start لبدء تشغيل حزمة الويب.

بالنسبة لبقية الدرس التطبيقي حول التعليمات البرمجية، ستعمل حزمة الويب الآن على إعادة بناء التعليمات البرمجية المصدر بشكل مستمر.

أضف تكوين Firebase إلى تطبيقك

تحتاج أيضًا إلى إضافة تكوين Firebase إلى تطبيقك حتى تعرف مجموعات Firebase SDK مشروع Firebase الذي تريد أن تستخدمه.

في هذا الدرس التطبيقي حول التعليمات البرمجية، لديك خياران مختلفان للحصول على تهيئة Firebase:

  • الخيار 1 : احصل على تكوين Firebase الخاص بك من وحدة تحكم Firebase.
  • الخيار 2 : احصل على تكوين Firebase الخاص بك عبر Terraform.

الخيار 1: احصل على التكوين من وحدة تحكم Firebase وأضفه إلى قاعدة التعليمات البرمجية الخاصة بك

  1. في وحدة تحكم Firebase، انتقل إلى إعدادات المشروع .
  2. قم بالتمرير لأسفل إلى بطاقة تطبيقاتك ، ثم حدد تطبيق الويب الخاص بك.
  3. حدد Config من جزء مقتطف Firebase SDK، ثم انسخ مقتطف التكوين.
  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 الخاص بالبرنامج التدريبي هذا:

    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 ، قم بتحديث سمة display_name بقيمة خاصة بك.
      • في google_firestore_database و google_app_engine_application كتل الموارد ، قم بتحديث سمات 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 معروف بأنه ما يلي:
      google_project.default
      google_firebase_project.default
      google_firebase_android_app.default
      
    2. قم بتشغيل terraform plan لمعرفة الإجراءات التي سيتخذها Terraform بالنظر إلى الحالة الحالية.

      يجب أن يوضح الإخراج أن 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. خطوة المكافأة: نشر تطبيقات التدريج والمنتج

  1. في قاعدة بيانات التطبيق الخاصة بك ، قم بتغيير firebase-config.js لاستخدام تكوين Firebase من مشروع التدريج بدلاً من ذلك.

    لتذكير نفسك بكيفية الحصول على تكوين Firebase الخاص بك وإضافته إلى تطبيقك ، راجع الخطوة السابقة من هذا Codelab ، أضف تكوين Firebase الخاص بك إلى تطبيقك.
  2. في جذر دليل web الخاص بك ، قم بتشغيل الأمر التالي لنشر تطبيقك على مشروع Firebase التدريجي.
    firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
    
  3. افتح تطبيق التدريج الخاص بك في المتصفح عبر عنوان URL الذي تم طباعته في ناتج firebase deploy . حاول تسجيل الدخول وإرسال الرسائل وتحميل الصور.

    عند نشر تطبيق على مشروع Firebase ، فإنه يستخدم موارد Firebase الحقيقية ، وليس الموارد المحاكاة. بينما تتفاعل مع تطبيق التدريج الخاص بك ، يجب أن ترى البيانات والصور تظهر في مشروع التدريج الخاص بك في وحدة التحكم في Firebase.
  4. بعد اختبار تطبيقك في التدريج ، قم بتغيير firebase-config.js مرة أخرى لاستخدام تكوين Firebase الخاص بمشروع Prod (أول مشروع قمت بإنشائه في هذا Codelab).
  5. في جذر دليل web الخاص بك ، قم بتشغيل الأمر التالي لنشر تطبيقك على مشروع Firebase للإنتاج.
    firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
    
  6. افتح تطبيق الإنتاج الخاص بك في المتصفح عبر عنوان URL المطبوع في ناتج firebase deploy . حاول تسجيل الدخول وإرسال الرسائل وتحميل الصور.

    يجب أن ترى البيانات والصور تظهر في مشروع الإنتاج الخاص بك في وحدة التحكم في Firebase.
  7. عندما تنتهي من التفاعل مع التطبيقين لهذا Codelab ، يمكنك منع Firebase من تقديمها. قم بتشغيل الأمر التالي لكل مشروع من مشاريعك:
    firebase hosting:disable --project=<STAGING_PROJECT_ID>
    
    firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
    

13. تهانينا!

لقد استخدمت Terraform لتكوين تطبيق ويب الدردشة في الوقت الفعلي! وقد اتبعت أفضل الممارسات لبيئات التنمية من خلال إنشاء مشاريع منفصلة Firebase للتدريج والمنتج.

ما قمنا بتغطيته

  • باستخدام Terraform CLI لإدارة الموارد السحابية
  • باستخدام Terraform لتكوين منتجات Firebase (المصادقة ، Firestore ، تخزين السحابة ، وقواعد الأمان)
  • تشغيل واختبار تطبيق ويب محليًا باستخدام مجموعة المحاكي المحلي Firebase
  • استيراد Firebase إلى تطبيق ويب
  • باستخدام terraform لتكرار التكوين عبر بيئات متعددة

لمزيد من المعلومات حول Firebase و Terraform ، تفضل بزيارة وثائقنا . يمكنك العثور على قائمة بجميع منتجات Firebase بدعم من Terraform ، وتجربة تكوينات terraform لحالات الاستخدام الشائعة ، واستكشاف الأخطاء وإصلاحها مفيدة.