پروژه ها و محصولات Firebase را از طریق Terraform راه اندازی و مدیریت کنید

۱. مقدمه

اهداف

شما می‌توانید از Terraform برای راه‌اندازی و مدیریت یک پروژه Firebase، از جمله پیکربندی برنامه‌نویسی زیرساخت و محصولات Firebase، استفاده کنید.

این آزمایشگاه کد ابتدا نحوه ساخت یک فایل پیکربندی Terraform برای ایجاد یک پروژه جدید Firebase را شرح می‌دهد و پس از آن نحوه پیکربندی برنامه‌ها و محصولات Firebase که می‌خواهید در آن پروژه استفاده کنید را شرح می‌دهد. ما همچنین اصول اولیه خط فرمان Terraform، مانند پیش‌نمایش تغییرات ایجاد شده و سپس پیاده‌سازی آنها را پوشش می‌دهیم.

اگر می‌خواستید یاد بگیرید که چگونه پروژه‌ها و محصولات Firebase را با Terraform راه‌اندازی و مدیریت کنید، این codelab برای شما مناسب است!

آنچه یاد خواهید گرفت

  • نحوه ایجاد فایل پیکربندی Terraform ( *.tf )
  • نحوه استفاده از دستورات رابط خط فرمان Terraform برای مدیریت زیرساخت شما
  • نحوه تغییر پیکربندی برای به‌روزرسانی منابع و خدمات
  • نحوه اعمال پیکربندی خود در یک برنامه وب واقعی (به نام چت دوستانه )
  • نحوه تعریف پیکربندی‌های موازی (و همگام‌سازی) در محیط‌های مختلف (تولید، مرحله‌بندی و غیره)

آنچه نیاز دارید

برای موفقیت در این آزمایشگاه کد، به مهارت اولیه با Terraform و اصطلاحات آن، از جمله پیش‌نیازهای زیر، نیاز دارید:

این codelab یک برنامه نمونه واقعی ارائه می‌دهد تا بتوانید آنچه را که از طریق Terraform ارائه می‌دهید، آزمایش و با آن تعامل داشته باشید. برای انجام این کار، به موارد زیر نیاز دارید:

  • کد نمونه برای یک برنامه وب - این کد را در مرحله بعدی codelab دانلود کنید
  • مدیر بسته npm (که معمولاً با Node.js همراه است) - این ابزارها را نصب کنید
  • رابط خط فرمان فایربیس - این رابط خط فرمان را نصب کنید و وارد شوید

۲. کد شروع را دریافت کنید

در این آزمایشگاه کد، می‌توانید آنچه را که از طریق Terraform ارائه می‌دهید، با یک برنامه وب واقعی آزمایش کنید. توصیه می‌کنیم این کار را انجام دهید تا تمام مراحل مورد نیاز برای استفاده از منابع ارائه شده توسط Terraform را درک کنید.

مخزن گیت‌هاب codelab را از خط فرمان کلون کنید:

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

از طرف دیگر، اگر git را نصب ندارید، می‌توانید مخزن را به صورت یک فایل ZIP دانلود کنید .

۳. ایجاد پیکربندی Terraform

راه‌اندازی Terraform

  1. در کدبیس برنامه نمونه دانلود شده، به ریشه دایرکتوری web بروید.
  2. در ریشه آن دایرکتوری، یک فایل پیکربندی Terraform به نام main.tf با تنظیمات اولیه زیر ایجاد کنید:

    اصلی.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 به شما امکان می‌دهد در مراحل بعدی این codelab بین دو تنظیم ارائه‌دهنده تمایز قائل شوید.

مقداردهی اولیه Terraform در دایرکتوری

ایجاد یک پیکربندی جدید برای اولین بار نیاز به دانلود ارائه دهنده مشخص شده در پیکربندی دارد.

برای انجام این مقداردهی اولیه، دستور زیر را از ریشه همان دایرکتوری که فایل پیکربندی main.tf شما در آن قرار دارد، اجرا کنید:

terraform init

۴. ایجاد یک پروژه 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 ، پروژه شما را به طور منحصر به فرد برای گوگل مشخص می‌کند، بنابراین مطمئن شوید که یک مقدار منحصر به فرد مشخص می‌کنید. اصلی.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 مربوط به استفاده از سرویس (Service Usage API) و API مربوط به مدیریت فایربیس (Firebase Management API).

    این فعال‌سازی API معمولاً هنگام استفاده از کنسول Firebase برای ایجاد یک پروژه Firebase در پشت صحنه انجام می‌شود، اما Terraform باید صریحاً برای انجام این فعال‌سازی مطلع شود.

    به فایل پیکربندی main.tf خود (درست زیر بلوکی که پروژه جدید Cloud را ایجاد می‌کند)، بلوک منبع زیر را اضافه کنید:

    اصلی.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 استفاده می‌کند (نیازی به نام مستعار نیست).

اصلی.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 اقدامات را تأیید کنید.

    اصلی.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

۵. برنامه Firebase خود را از طریق Terraform ثبت کنید

برای استفاده از Firebase، باید هر نوع پلتفرم از برنامه خود را در پروژه Firebase خود ثبت کنید. در این آزمایشگاه کد، از یک برنامه واقعی برای آزمایش و تعامل با آنچه از طریق Terraform ارائه می‌دهید، استفاده خواهید کرد. این برنامه یک برنامه وب است، بنابراین باید به Terraform بگویید که یک برنامه وب Firebase را در پروژه Firebase تازه ایجاد شده شما ثبت کند.

یک بلوک برای ثبت برنامه وب اضافه کنید

برای ثبت برنامه وب خود در پروژه Firebase، فایل main.tf خود را با بلوک منبع زیر پیوست کنید.

شما باید display_name خودتان را برای برنامه وب خود مشخص کنید. توجه داشته باشید که این نام فقط در رابط‌های Firebase استفاده می‌شود و برای کاربران نهایی قابل مشاهده نیست.

اصلی.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، تأیید کنید که با موفقیت در پروژه شما ثبت شده است. به تنظیمات پروژه بروید و سپس به بخش برنامه‌های خود بروید.

۶. تنظیم احراز هویت فایربیس

احراز هویت بخش مهمی از هر برنامه‌ای است. برای اینکه کاربران نهایی بتوانند با حساب‌های گوگل خود وارد برنامه وب شما شوند، می‌توانید احراز هویت Firebase را فعال کرده و روش ورود به سیستم با گوگل را تنظیم کنید.

توجه داشته باشید که در این آزمایشگاه کد، ما دو گزینه مختلف برای تنظیم احراز هویت Firebase ارائه می‌دهیم:

  • گزینه ۱ (توصیه شده) : تنظیم احراز هویت Firebase در کنسول، که نیازی به GCIP ندارد.
    • استفاده از این گزینه به این معنی است که لازم نیست پروژه جدید خود را با یک حساب Cloud Billing مرتبط کنید.
  • گزینه ۲ : راه‌اندازی احراز هویت Firebase از طریق Terraform با استفاده از APIهای پلتفرم هویت ابری گوگل (GCIP).
    • استفاده از این گزینه به این معنی است که شما باید پروژه جدید خود را با یک حساب Cloud Billing مرتبط کنید زیرا GCIP مستلزم آن است که پروژه در طرح قیمت‌گذاری Blaze باشد.

گزینه ۱: تنظیم احراز هویت با استفاده از کنسول Firebase

برای راه‌اندازی احراز هویت فایربیس با استفاده از کنسول فایربیس، نیازی نیست پروژه شما جزو طرح قیمت‌گذاری Blaze باشد.

در اینجا نحوه تنظیم احراز هویت Firebase و ورود به سیستم با Google آورده شده است:

  1. در کنسول Firebase ، بخش Build را در پنل سمت چپ پیدا کنید.
  2. روی تأیید اعتبار (Authentication) کلیک کنید، روی شروع (Get started ) کلیک کنید و سپس روی برگه روش ورود (Sign-in method ) کلیک کنید (یا برای رفتن مستقیم به آنجا اینجا کلیک کنید ).
  3. روی «افزودن ارائه‌دهنده جدید» کلیک کنید و از بخش «ارائه‌دهندگان اضافی »، گوگل را انتخاب کنید.
  4. ضامن فعال کردن را فعال کنید.
  5. نام عمومی برنامه خود را چیزی مانند FriendlyChat تنظیم کنید (نیازی نیست که این نام به صورت سراسری منحصر به فرد باشد).
  6. از منوی کشویی، یک ایمیل پشتیبانی پروژه انتخاب کنید و سپس روی ذخیره کلیک کنید. Configuring Firebase Auth on the Firebase console
  7. شما باید گوگل را به عنوان یک ارائه دهنده ورود فعال ببینید. Firebase console Authentication page: Google sign-in enabled

گزینه ۲: راه‌اندازی احراز هویت از طریق Terraform با استفاده از APIهای پلتفرم هویت ابری گوگل (GCIP)

برای راه‌اندازی احراز هویت فایربیس از طریق Terraform، باید از APIهای GCIP استفاده کنید، به این معنی که پروژه باید در طرح قیمت‌گذاری Blaze باشد. شما با مرتبط کردن یک حساب Cloud Billing با پروژه، پروژه فایربیس خود را برای استفاده از طرح Blaze ارتقا می‌دهید.

فعال کردن پرداخت از طریق Terraform

  1. اگر از قبل حساب Cloud Billing ندارید، اولین قدم ایجاد یک حساب جدید در کنسول Google Cloud است. هنگام انجام این کار، شناسه حساب Billing آن را یادداشت کنید. شناسه حساب Billing را می‌توانید در صفحه Billing در شناسه حساب Billing مرتبط با پروژه خود پیدا کنید. Enabling a billing account using the Google Cloud console
  2. برای فعال کردن پرداخت صورتحساب در پروژه خود از طریق Terraform، یک ویژگی billing_account به منبع google_project موجود در فایل main.tf خود اضافه کنید:

    اصلی.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"
      }
    }
    
    ...
    

فعال کردن احراز هویت فایربیس و ورود به سیستم با گوگل از طریق Terraform

  1. برای ارائه احراز هویت فایربیس با GCIP، فایل main.tf خود را با بلوک‌های منبع زیر پیوست کنید:

    اصلی.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. فعال کردن ورود با گوگل مستلزم داشتن یک کلاینت OAuth است. برای انجام این تنظیمات به بخش APIها و خدمات کنسول ابری گوگل بروید.
  3. از آنجایی که این اولین باری است که برای این پروژه یک شناسه کلاینت ایجاد می‌کنید، باید صفحه رضایت OAuth خود را پیکربندی کنید.
    1. صفحه‌ی رضایت‌نامه‌ی OAuth را باز کنید و سپس پروژه‌ای را که ایجاد کرده‌اید انتخاب کنید.
    2. نوع کاربر را روی خارجی تنظیم کنید و سپس روی ایجاد کلیک کنید.
    3. در صفحه بعد، موارد زیر را تکمیل کنید و سپس روی ذخیره و ادامه کلیک کنید.
      • نام برنامه عمومی خود را چیزی مانند FriendlyChat تنظیم کنید (نیازی نیست که این نام به صورت سراسری منحصر به فرد باشد).
      • از منوی کشویی، یک ایمیل پشتیبانی کاربر انتخاب کنید.
      • برای اطلاعات تماس توسعه‌دهنده، یک ایمیل وارد کنید.
    4. در صفحات بعدی، موارد زیر را تکمیل کنید:
      • در صفحه Scopes ، مقادیر پیش‌فرض را بپذیرید و سپس روی ذخیره و ادامه کلیک کنید.
      • در صفحه کاربران آزمایشی ، پیش‌فرض‌ها را بپذیرید و سپس روی ذخیره و ادامه کلیک کنید.
      • خلاصه را مرور کنید و سپس روی «بازگشت به داشبورد» کلیک کنید.
      Configuring an OAuth2 client using the Google Cloud console
  4. با انجام موارد زیر، یک کلاینت OAuth را در صفحه Credentials راه‌اندازی کنید:
    1. روی ایجاد اعتبارنامه کلیک کنید و شناسه کلاینت OAuth را انتخاب کنید.
    2. از منوی کشویی نوع برنامه ، برنامه وب را انتخاب کنید.
    3. در فیلد نام ، نام برنامه خود را وارد کنید، برای مثال FriendlyChat (نیازی نیست که این نام به صورت سراسری منحصر به فرد باشد).
    4. با تنظیم موارد زیر، به URL برنامه خود اجازه دهید از این کلاینت OAuth استفاده کند:
      • در زیر Authorized JavaScript origins ، روی Add URI کلیک کنید و وارد کنید
        https://<PROJECT_ID>.firebaseapp.com ، که در آن <PROJECT_ID> شناسه پروژه‌ای است که در main.tf تنظیم کرده‌اید.
      • در زیر Authorized redirect URIs ، روی Add 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. برای فعال کردن ورود به سیستم با استفاده از شناسه کلاینت OAuth و رمز کلاینت، فایل main.tf خود را با بلوک زیر پیوست کنید:

    اصلی.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. شما باید گوگل را به عنوان یک ارائه دهنده ورود فعال ببینید. Firebase console Authentication page: Google sign-in enabled

۷. یک پایگاه داده Firestore و قوانین امنیتی آن را تنظیم کنید

برای برنامه وب این codelab، پیام‌های بین کاربران نهایی را در یک پایگاه داده Firestore ذخیره خواهید کرد.

  1. برای فعال کردن API های مورد نیاز و آماده سازی نمونه پایگاه داده، فایل main.tf خود را با بلوک های منبع زیر پیوست کنید:

    اصلی.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، باشد. برای این codelab، می‌توانید us-east1 (کارولینای جنوبی) استفاده کنید یا از منطقه‌ای که به شما نزدیک‌تر است استفاده کنید (به مکان‌های Cloud Firestore مراجعه کنید).
  3. هر نمونه پایگاه داده Firestore که برای Firebase قابل دسترسی است، باید توسط قوانین امنیتی Firebase محافظت شود.

    کد نمونه این codelab مجموعه‌ای از قوانین امن Firestore را در فایل firestore.rules ارائه می‌دهد که می‌توانید آن را در ریشه دایرکتوری web پیدا کنید.
  4. فایل main.tf خود را با بلوک‌های منبع زیر پیوست کنید تا موارد زیر را انجام دهید:
    • یک مجموعه قوانین از قوانین امنیتی Firebase را از فایل محلی firestore.rules ایجاد کنید.
    • مجموعه قوانین مربوط به نمونه Firestore را منتشر کنید.
    توجه داشته باشید که این بلوک‌های منابع معادل کلیک کردن روی دکمه Publish در کنسول Firebase یا اجرای firebase deploy --only firestore:rules انجام می‌دهند.

    اصلی.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 بروید و سپس روی برگه قوانین کلیک کنید.
    Verifying Cloud Firestore rules using the Firebase console

۸. یک فضای ذخیره‌سازی ابری و قوانین امنیتی آن را تنظیم کنید

برای برنامه وب این codelab، تصاویر به اشتراک گذاشته شده بین کاربران نهایی را در یک فضای ذخیره‌سازی ابری ذخیره خواهید کرد.

  1. برای فعال کردن API های مورد نیاز و ارائه باکت پیش‌فرض Cloud Storage خود، فایل main.tf خود را با بلوک‌های منبع زیر پیوست کنید.

    توجه داشته باشید که فضای ذخیره‌سازی ابری پیش‌فرض برای پروژه شما از طریق Google App Engine تأمین می‌شود و باید همان مکان پایگاه داده Firestore شما را داشته باشد. برای اطلاعات بیشتر به مکان‌های App Engine مراجعه کنید.

    اگر می‌خواهید چندین سطل در پروژه خود داشته باشید، آنها را با استفاده از منبع google_storage_bucket (که در این codelab نشان داده نشده است) فراهم کنید .

    اصلی.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. هر مخزن ذخیره‌سازی ابری که برای فایربیس قابل دسترسی است، باید توسط قوانین امنیتی فایربیس محافظت شود.

    کد نمونه این codelab مجموعه‌ای از قوانین امن Firestore را در فایل storage.rules ارائه می‌دهد که می‌توانید آن را در ریشه دایرکتوری web پیدا کنید.
  3. فایل main.tf خود را با بلوک‌های منبع زیر پیوست کنید تا موارد زیر را انجام دهید:
    • یک مجموعه قوانین از قوانین امنیتی Firebase را از فایل محلی ایجاد کنید.
    • مجموعه قوانین مربوط به مخزن ذخیره‌سازی را منتشر کنید.
    توجه داشته باشید که این بلوک‌های منابع معادل کلیک کردن روی دکمه Publish در کنسول Firebase یا اجرای firebase deploy --only storage انجام می‌دهند.

    اصلی.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 اجرا کنید تا فضای ذخیره‌سازی ابری پیش‌فرض آماده شود و قوانین امنیتی آن اعمال گردد.
  5. تأیید کنید که سطل تأمین شده و قوانین امنیتی آن مستقر شده است:
    1. در کنسول Firebase ، بخش Build را در پنل سمت چپ پیدا کنید.
    2. به بخش Storage بروید و سپس روی تب Rules کلیک کنید.
    Verifying security rules using the Firebase console

۹. برنامه خود را به صورت محلی اجرا کنید

اکنون آماده‌اید تا برای اولین بار برنامه وب خود را اجرا کنید! از شبیه‌ساز Firebase Hosting برای ارائه برنامه خود به صورت محلی استفاده خواهید کرد.

  1. یک پنجره ترمینال جدید باز کنید و از دایرکتوری web ، دستور Firebase CLI زیر را برای شروع شبیه‌ساز اجرا کنید:
    firebase emulators:start --project=<PROJECT_ID>
    
  2. در مرورگر خود، برنامه وب خود را با آدرس محلی که توسط CLI برگردانده می‌شود (معمولاً http://localhost:5000 ) باز کنید.

شما باید رابط کاربری برنامه FriendlyChat خود را ببینید، که (هنوز!) کار نمی‌کند. این برنامه هنوز به Firebase متصل نشده است، اما با تکمیل مراحل بعدی این آزمایشگاه کد، متصل خواهد شد!

توجه داشته باشید که هر زمان که تغییراتی در برنامه وب خود ایجاد می‌کنید (مانند مراحل بعدی این آزمایشگاه کد)، مرورگر خود را رفرش کنید تا URL محلی با آن تغییرات به‌روزرسانی شود.

۱۰. نصب، پیکربندی و مقداردهی اولیه فایربیس

برای اینکه یک برنامه با Firebase کار کند، برنامه شما به Firebase SDK و پیکربندی Firebase برای پروژه Firebase شما نیاز دارد.

کد نمونه برای این codelab از قبل یک برنامه کاربردی با تمام وابستگی‌ها و توابع مورد نیاز برای استفاده از محصولات مختلف Firebase در برنامه است. اگر مایلید ببینید چه کارهایی قبلاً انجام شده است، می‌توانید به web/package.json و web/src/index.js مراجعه کنید.

اگرچه کد نمونه تقریباً کامل است، اما هنوز باید چند کار برای اجرای برنامه خود انجام دهید، از جمله: نصب Firebase SDK، شروع ساخت، اضافه کردن پیکربندی Firebase به برنامه خود و در نهایت راه‌اندازی اولیه Firebase.

Firebase SDK را نصب کنید و ساخت وب‌پک خود را آغاز کنید

برای شروع ساخت برنامه خود، باید چند دستور اجرا کنید.

  1. یک پنجره ترمینال جدید باز کنید.
  2. مطمئن شوید که در ریشه دایرکتوری web هستید.
  3. برای دانلود Firebase SDK، npm install اجرا کنید.
  4. برای به‌روزرسانی هرگونه وابستگی، npm update اجرا کنید.
  5. برای راه‌اندازی وب‌پک، npm run start اجرا کنید.

برای بقیه‌ی بخش codelab، webpack اکنون به طور مداوم کد منبع شما را بازسازی می‌کند.

پیکربندی Firebase خود را به برنامه خود اضافه کنید

همچنین باید پیکربندی Firebase خود را به برنامه خود اضافه کنید تا SDK های Firebase بدانند که از کدام پروژه Firebase می‌خواهید استفاده کنند.

برای این codelab، شما دو گزینه مختلف برای دریافت پیکربندی Firebase خود دارید:

  • گزینه ۱ : پیکربندی فایربیس خود را از کنسول فایربیس دریافت کنید.
  • گزینه 2 : پیکربندی Firebase خود را از طریق Terraform دریافت کنید.

گزینه ۱: پیکربندی را از کنسول Firebase دریافت کنید و آن را به پایگاه کد خود اضافه کنید

  1. در کنسول فایربیس، به تنظیمات پروژه خود بروید.
  2. به پایین اسکرول کنید تا به کارت «برنامه‌های شما» برسید، و سپس برنامه وب خود را انتخاب کنید.
  3. از قسمت قطعه کد Firebase SDK، گزینه Config را انتخاب کنید و سپس قطعه کد config را کپی کنید.
  4. پیکربندی خود را مانند زیر در فایل web/src/firebase-config.js برنامه خود قرار دهید:

    پیکربندی فایربیس.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>",
    };
    
    ...
    

گزینه ۲: پیکربندی را از طریق Terraform دریافت کنید و آن را به کدبیس خود اضافه کنید

از طرف دیگر، می‌توانید پیکربندی Firebase خود را از طریق Terraform به عنوان یک مقدار خروجی در CLI دریافت کنید.

  1. در فایل main.tf خود، بلوک منبع google_firebase_web_app (بلوک ثبت یک برنامه وب در پروژه شما) را پیدا کنید.
  2. بلافاصله پس از آن بلوک، بلوک‌های زیر را اضافه کنید:

    اصلی.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 برنامه خود، مانند زیر، جایگذاری کنید:

    پیکربندی فایربیس.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، فایل web/src/index.js برنامه خود را با موارد زیر پیوست کنید:

ایندکس.js

...

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

برنامه خود را امتحان کنید

اکنون که همه چیز برای Firebase پیکربندی شده است، می‌توانید برنامه وب کاربردی خود را امتحان کنید.

  1. مرورگری که برنامه شما را اجرا می‌کند، رفرش کنید.
  2. اکنون باید بتوانید با گوگل وارد شوید و شروع به ارسال پیام در چت کنید. اگر فایل‌های تصویری دارید، حتی می‌توانید آنها را آپلود کنید!

۱۱. پیکربندی خود را در محیط‌های مختلف تکرار کنید

Terraform در مدیریت چندین زیرساخت با پیکربندی مشابه (برای مثال، راه‌اندازی یک پروژه Firebase مرحله‌ای که مشابه یک پروژه prod است) عالی عمل می‌کند.

در این آزمایشگاه کد، شما یک پروژه Firebase دوم ایجاد خواهید کرد تا یک محیط مرحله‌بندی باشد.

برای تکرار پیکربندی موجود برای ایجاد این پروژه مرحله‌بندی، دو گزینه دارید:

  • گزینه ۱ : یک کپی از پیکربندی Terraform تهیه کنید.
    این گزینه بیشترین انعطاف‌پذیری را در مورد میزان تفاوت پروژه تکثیر شده با پروژه منبع ارائه می‌دهد.
  • گزینه ۲ : استفاده مجدد از پیکربندی‌ها با for_each .
    اگر قرار نباشد هر پروژه تفاوت قابل توجهی داشته باشد و بخواهید تغییرات را به طور همزمان در همه پروژه‌ها اعمال کنید، این گزینه امکان استفاده مجدد از کد بیشتری را فراهم می‌کند.

گزینه ۱: یک کپی از پیکربندی 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 را در مخزن گیت‌هاب این 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 مانند قبل، تأیید کنید که همه چیز طبق انتظار فراهم و فعال شده است.

گزینه ۲: استفاده مجدد از پیکربندی‌ها با for_each

اگر قرار نباشد هر پروژه تفاوت قابل توجهی داشته باشد و بخواهید تغییرات را به طور همزمان در همه پروژه‌ها اعمال کنید، این گزینه امکان استفاده مجدد از کد بیشتری را فراهم می‌کند. این گزینه از فراآرگومان for_each در زبان Terraform استفاده می‌کند.

  1. فایل main.tf خود را باز کنید.
  2. به هر بلوک منبعی که می‌خواهید تکثیر کنید، یک متا-آرگومان for_each اضافه کنید، مانند این:

    اصلی.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 استفاده می‌کند را در مخزن گیت‌هاب این 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 ، ویژگی display_name را با مقدار دلخواه خود به‌روزرسانی کنید.
      • In the google_firestore_database and google_app_engine_application resource blocks, update the location_id attributes with your own value.
  3. Instead of applying this config right away, it's important to understand and fix a few things about how Terraform interprets this config compared to the existing infrastructure.
    1. Right now, if you applied this config that uses for_each , the resource addresses would look like the following:
      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"]
      
      However, the existing project you created in the first part of this codelab is known to Terraform as the following:
      google_project.default
      google_firebase_project.default
      google_firebase_android_app.default
      
    2. Run terraform plan to see what actions Terraform would take given the current state.

      The output should show that Terraform would delete the project you created in the first part of this codelab and create two new projects. This is because Terraform doesn't know that the project at the address google_project.default has been moved to the new address google_project.default["prod"] .
    3. To fix this, run the terraform state mv command:
      terraform state mv "google_project.default" "google_project.default[\"prod\"]"
      
    4. Similarly, to fix all the other resource blocks, run terraform state mv for google_firebase_project , google_firebase_web_app , and all the other resource blocks in your main.tf file.
    5. Now, if you run terraform plan again, it shouldn't show that Terraform would delete the project you created in the first part of this codelab.
  4. Run terraform apply to provision your new "staging" Firebase project and all its resources and enable its services.
  5. Verify that everything was provisioned and enabled as expected by checking them in the Firebase console as before.

12. Bonus step: Deploy your staging and prod apps

  1. In your app's codebase, change the firebase-config.js to use the Firebase config from your staging project instead.

    To remind yourself how to get your Firebase config and add it to your app, see the earlier step of this codelab, Add your Firebase configuration to your app.
  2. At the root of your web directory, run the following command to deploy your app to your staging Firebase project.
    firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
    
  3. Open your staging app in the browser via the URL that's printed in the output of firebase deploy . Try signing in, sending messages, and uploading images.

    When you deploy an app to a Firebase project, it uses real Firebase resources, not emulated resources. As you interact with your staging app, you should see data and images appear in your staging project in the Firebase console.
  4. After testing your app in staging, change the firebase-config.js back to using the prod project's Firebase config (the first project that you created in this codelab).
  5. At the root of your web directory, run the following command to deploy your app to your production Firebase project.
    firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
    
  6. Open your production app in the browser via the URL that's printed in the output of firebase deploy . Try signing in, sending messages, and uploading images.

    You should see data and images appear in your production project in the Firebase console.
  7. When you're finished interacting with the two apps for this codelab, you can stop Firebase from serving them. Run the following command for each of your projects:
    firebase hosting:disable --project=<STAGING_PROJECT_ID>
    
    firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
    

۱۳. تبریک می‌گویم!

You've used Terraform to configure a real-time chat web application! And you've followed best practices for development environments by creating separate Firebase projects for staging and prod.

آنچه ما پوشش داده‌ایم

  • Using the Terraform CLI to manage cloud resources
  • Using Terraform to configure Firebase products (Authentication, Firestore, Cloud Storage, and Security Rules)
  • Running and testing a web app locally using the Firebase Local Emulator Suite
  • Importing Firebase into a web app
  • Using Terraform to replicate a configuration across multiple environments

For more information about Firebase and Terraform, visit our documentation . You can find a list of all Firebase products with Terraform support, sample Terraform configurations for common use cases, and helpful troubleshooting and FAQ.