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

1. معرفی

اهداف

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

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

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

چیزی که یاد خواهید گرفت

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

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

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

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

  • نمونه کد یک برنامه وب - این کد را در مرحله بعد از برنامه کد دانلود کنید
  • مدیر بسته npm (که معمولاً با Node.js ارائه می شود) - این ابزارها را نصب کنید
  • Firebase CLI - این CLI را نصب کرده و وارد شوید

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

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

مخزن GitHub کد لبه را از خط فرمان کلون کنید:

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

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

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

Terraform راه اندازی شد

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

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

هر یک از ارائه‌دهندگان google-beta دارای یک ویژگی به نام user_project_override است که تعیین می‌کند عملیات Terraform چگونه سهمیه بررسی می‌شود. برای تهیه بیشتر منابع، باید از user_project_override = true استفاده کنید، که به معنای بررسی سهمیه در برابر پروژه Firebase خودتان است. با این حال، برای تنظیم پروژه جدید خود به گونه ای که بتواند بررسی های سهمیه را بپذیرد، ابتدا باید از user_project_override=false استفاده کنید. نحو alias Terraform به شما امکان می دهد در مراحل بعدی این کد لبه بین دو تنظیمات ارائه دهنده تمایز قائل شوید.

Terraform را در فهرست راه اندازی کنید

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

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

terraform init

4. یک پروژه Firebase از طریق Terraform ایجاد کنید

برای "ایجاد یک پروژه Firebase"، مهم است که به یاد داشته باشید که هر پروژه Firebase در واقع یک پروژه Google Cloud است، فقط با خدمات Firebase که برای آن فعال شده است.

بلوک‌هایی را برای پروژه Google Cloud و APIهای زیربنایی اضافه کنید

  1. ابتدا، پروژه زیربنایی Google Cloud را ارائه دهید.

    به فایل پیکربندی main.tf خود، بلوک منبع زیر را اضافه کنید.

    شما باید نام پروژه خود (مانند "Terraform FriendlyChat Codelab" ) و شناسه پروژه خود را (مانند "terraform-codelab-your-initials" ) مشخص کنید. توجه داشته باشید که مقدار name فقط در رابط های Firebase استفاده می شود و برای کاربران نهایی قابل مشاهده نیست. با این حال، مقدار project_id به طور منحصربه‌فرد پروژه شما را برای Google شناسایی می‌کند، بنابراین مطمئن شوید که یک مقدار منحصر به فرد را مشخص کرده‌اید. main.tf
    ...
    
    # Create a new Google Cloud project.
    resource "google_project" "default" {
      provider = google-beta.no_user_project_override
    
      name            = "<PROJECT_NAME_OF_YOUR_PROJECT>"
      project_id      = "<PROJECT_ID_OF_YOUR_PROJECT>"
    
      # Required for the project to display in any list of Firebase projects.
      labels = {
        "firebase" = "enabled"
      }
    }
    
  2. در مرحله بعد، باید APIهای زیربنایی مورد نیاز را فعال کنید: API Usage Service و Firebase Management API.

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

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

    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
    }
    
    با فعال کردن سرویس Usage API، پروژه جدید شما می‌تواند چک‌های سهمیه را بپذیرد! بنابراین، برای تمام فراهم کردن منابع بعدی و فعال کردن خدمات، باید از ارائه دهنده با user_project_override (بدون نیاز به نام مستعار) استفاده کنید.

برای فعال کردن خدمات Firebase یک بلوک اضافه کنید

آخرین چیزی که برای "ایجاد پروژه Firebase" لازم است، فعال کردن خدمات Firebase در پروژه است.

در ادامه در فایل پیکربندی main.tf خود، بلوک منبع زیر را اضافه کنید.

همانطور که در بالا ذکر شد، توجه داشته باشید که این بلوک منبع از ارائه دهنده با user_project_override (بدون نیاز به نام مستعار) استفاده می کند.

main.tf

...

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

  project = google_project.default.project_id

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

در بلوک منبع بالا، ممکن است متوجه بند depends_on شوید، که به Terraform می‌گوید منتظر فعال شدن APIهای زیربنایی باشد. بدون این بند، Terraform از وابستگی اطلاعی ندارد و ممکن است هنگام تهیه منابع به صورت موازی با خطا مواجه شود.

تنظیمات را اعمال کنید

  1. برای تهیه منابع جدید و فعال کردن API های مشخص شده در فایل کانفیگ خود، دستور زیر را از ریشه همان پوشه فایل main.tf خود (که باید web باشد) اجرا کنید:
    terraform apply
    
  2. در ترمینال، Terraform طرحی از اقداماتی را که انجام خواهد داد چاپ می کند.

    اگر همه چیز مطابق انتظار به نظر می رسد، با وارد کردن yes اقدامات را تأیید کنید.

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

توجه داشته باشید که اگر فقط نیاز به پیش نمایش تغییرات بدون اعمال دارید، می توانید به جای آن از دستور terraform plan استفاده کنید.

تغییرات را تایید کنید

پس از پایان اجرای Terraform، می‌توانید با اجرای دستور زیر وضعیت تمام منابع و سرویس‌های ارائه‌شده Terraform را بررسی کنید:

terraform show

در اینجا نمونه ای از مواردی است که باید چاپ شده ببینید. وضعیت شما حاوی مقادیری خاص برای پروژه شما خواهد بود.

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

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

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

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

همچنین، می‌توانید با مشاهده آن در کنسول Firebase تأیید کنید که پروژه ایجاد شده است.

The Terraform FriendlyChat Codelab project selected on the Firebase console

5. اپلیکیشن Firebase خود را از طریق Terraform ثبت کنید

برای استفاده از Firebase، باید هر نوع پلتفرم برنامه خود را در پروژه Firebase خود ثبت کنید. در این کد لبه، از یک برنامه واقعی برای آزمایش و تعامل با آنچه از طریق Terraform ارائه می‌کنید استفاده خواهید کرد. این برنامه یک برنامه وب است، بنابراین باید به Terraform بگویید تا یک برنامه وب Firebase را در پروژه 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 Authentication ارائه می دهیم:

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

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

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

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

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

گزینه 2: تنظیم احراز هویت از طریق Terraform با استفاده از APIهای Google Cloud Identity Platform (GCIP)

برای راه اندازی Firebase Authentication از طریق Terraform، باید از GCIP API استفاده کنید، به این معنی که پروژه باید در طرح قیمت گذاری 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 است. برای انجام این تنظیمات، به بخش APIs & Services در Google Cloud Console بروید.
  3. از آنجایی که اولین بار است که یک شناسه مشتری برای این پروژه ایجاد می کنید، باید صفحه رضایت OAuth خود را پیکربندی کنید.
    1. صفحه نمایش رضایت OAuth را باز کنید و سپس پروژه ای را که ایجاد کرده اید انتخاب کنید.
    2. User Type را روی External تنظیم کنید و سپس روی Create کلیک کنید.
    3. در صفحه بعد، موارد زیر را تکمیل کنید و سپس روی ذخیره کلیک کنید و ادامه دهید .
      • نام برنامه عمومی برنامه خود را روی چیزی مانند FriendlyChat تنظیم کنید (نیازی نیست این نام در سطح جهانی منحصر به فرد باشد).
      • ایمیل پشتیبانی کاربر را از منوی کشویی انتخاب کنید.
      • یک ایمیل برای اطلاعات تماس برنامه‌نویس وارد کنید.
    4. در صفحه های بعدی موارد زیر را کامل کنید:
      • پیش فرض ها را در صفحه Scopes بپذیرید و سپس روی Save and Continue کلیک کنید.
      • پیش فرض ها را در صفحه کاربران تست بپذیرید و سپس روی ذخیره و ادامه کلیک کنید.
      • خلاصه را مرور کنید و سپس روی بازگشت به داشبورد کلیک کنید.
      Configuring an OAuth2 client using the Google Cloud console
  4. با انجام موارد زیر یک مشتری OAuth را در صفحه اعتبارنامه ها راه اندازی کنید:
    1. روی ایجاد اعتبارنامه کلیک کنید و شناسه مشتری OAuth را انتخاب کنید.
    2. از منوی کشویی Application type ، Web application را انتخاب کنید.
    3. در قسمت Name ، نام برنامه خود را وارد کنید، به عنوان مثال FriendlyChat (نیازی نیست که این برنامه منحصر به فرد جهانی باشد).
    4. با تنظیم موارد زیر به URL برنامه خود اجازه دهید از این سرویس گیرنده OAuth استفاده کند:
      • در زیر مبداهای مجاز جاوا اسکریپت ، روی افزودن 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. برای تنظیم Authentication بر اساس پیکربندی خود، دستورات زیر را از ریشه همان پوشه فایل main.tf خود (که باید web باشد) اجرا کنید:
    export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
    
    terraform apply
    
    توجه داشته باشید که اجرای terraform apply دوباره ایجاد نمی شود. یک پروژه جدید Google Cloud. Terraform تشخیص می دهد که پروژه ای با شناسه پروژه مشخص شده از قبل وجود دارد و وضعیت فعلی پروژه را با آنچه در فایل .tf مقایسه می کند. سپس هر تغییری را که پیدا کند ایجاد می کند.
  2. برنامه اقدامات چاپ شده را مرور کنید. اگر همه چیز مطابق انتظار به نظر می رسد، yes تایپ کرده و Enter را فشار دهید تا اقدامات تأیید شود.

تغییرات را تایید کنید

  1. در کنسول Firebase ، بخش Build را در پانل سمت چپ قرار دهید.
  2. روی احراز هویت کلیک کنید و سپس روی برگه روش ورود به سیستم کلیک کنید (یا اینجا را کلیک کنید تا مستقیماً به آنجا بروید).
  3. شما باید Google را به عنوان یک ارائه دهنده ورود به سیستم فعال ببینید. Firebase console Authentication page: Google sign-in enabled

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

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

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

    main.tf
    ...
    
    # Enable required APIs for Cloud Firestore.
    resource "google_project_service" "firestore" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "firestore.googleapis.com",
        "firebaserules.googleapis.com",
      ])
      service = each.key
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Provision the Firestore database instance.
    resource "google_firestore_database" "default" {
      provider                    = google-beta
    
      project                     = google_firebase_project.default.project
      name                        = "(default)"
      # See available locations:
      # https://firebase.google.com/docs/firestore/locations
      location_id                 = "<NAME_OF_DESIRED_REGION>"
      # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs,
      # authentication, and Firebase Security Rules.
      type                        = "FIRESTORE_NATIVE"
      concurrency_mode            = "OPTIMISTIC"
    
      depends_on = [
        google_project_service.firestore
      ]
    }
    
  2. <NAME_OF_DESIRED_REGION> را به منطقه ای که می خواهید پایگاه داده در آن قرار گیرد تغییر دهید.

    هنگام توسعه یک برنامه تولیدی، می‌خواهید که این برنامه در منطقه‌ای نزدیک به اکثر کاربران و مشترک با سایر سرویس‌های Firebase، مانند 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. برای ارائه پایگاه داده Firestore و استقرار قوانین امنیتی آن terraform apply اجرا کنید.
  6. بررسی کنید که پایگاه داده آماده شده است و قوانین امنیتی آن مستقر هستند:
    1. در کنسول Firebase ، بخش Build را در پانل سمت چپ قرار دهید.
    2. به بخش Firestore Database بروید و سپس روی تب Rules کلیک کنید.
    Verifying Cloud Firestore rules using the Firebase console

8. یک سطل Cloud Storage و قوانین امنیتی آن را تنظیم کنید

برای برنامه وب این کد لبه، تصاویر به اشتراک گذاشته شده بین کاربران نهایی را در یک سطل Cloud Storage ذخیره خواهید کرد.

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

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

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

    main.tf
    ...
    
    # Enable required APIs for Cloud Storage for Firebase.
    resource "google_project_service" "storage" {
      provider = google-beta
    
      project  = google_firebase_project.default.project
      for_each = toset([
        "firebasestorage.googleapis.com",
        "storage.googleapis.com",
      ])
      service = each.key
    
    
      # Don't disable the service if the resource block is removed by accident.
      disable_on_destroy = false
    }
    
    # Provision the default Cloud Storage bucket for the project via Google App Engine.
    resource "google_app_engine_application" "default" {
      provider    = google-beta
    
      project     = google_firebase_project.default.project
      # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
      # This will set the location for the default Storage bucket and the App Engine App.
      location_id = "<NAME_OF_DESIRED_REGION_FOR_DEFAULT_BUCKET>"  # Must be in the same location as Firestore (above)
    
      # Wait until Firestore is provisioned first.
      depends_on = [
        google_firestore_database.default
      ]
    }
    
    # Make the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
    resource "google_firebase_storage_bucket" "default-bucket" {
      provider  = google-beta
    
      project   = google_firebase_project.default.project
      bucket_id = google_app_engine_application.default.default_bucket
    }
    
  2. هر سطل Cloud Storage که برای Firebase قابل دسترسی است باید توسط قوانین امنیتی Firebase محافظت شود.

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

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

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

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

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

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

10. Firebase را نصب، پیکربندی و مقداردهی اولیه کنید

برای اینکه یک برنامه با 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 برای راه اندازی وب پک اجرا کنید.

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

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

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

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

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

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

  1. در کنسول Firebase، به تنظیمات پروژه خود بروید.
  2. به سمت پایین به کارت برنامه های شما بروید و سپس برنامه وب خود را انتخاب کنید.
  3. Config را از پنجره snippet 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 این کد لبه پیدا کنید:

    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 جدید "Staging" و تمام منابع آن و فعال کردن خدمات آن.
  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 و خدمات آن را فعال کنید.
  5. تأیید کنید که با بررسی آنها در کنسول Firebase مانند گذشته ، همه چیز تهیه و فعال شده است.

12. مرحله جایزه: برنامه های مرحله بندی و تولید خود را مستقر کنید

  1. در قسمت کد برنامه خود ، firebase-config.js تغییر دهید تا به جای آن از پیکربندی Firebase از پروژه مرحله بندی خود استفاده کنید.

    برای یادآوری اینکه چگونه می توانید پیکربندی Firebase خود را دریافت کرده و آن را به برنامه خود اضافه کنید ، مرحله اولیه این CodeLab را ببینید ، پیکربندی Firebase خود را به برنامه خود اضافه کنید.
  2. در ریشه دایرکتوری web خود ، دستور زیر را اجرا کنید تا برنامه خود را در پروژه Firebase Staging خود مستقر کنید.
    firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
    
  3. برنامه مرحله بندی خود را در مرورگر از طریق URL که در خروجی firebase deploy چاپ شده است ، باز کنید. وارد سیستم شوید ، پیام ارسال کنید و تصاویر را بارگذاری کنید.

    هنگامی که یک برنامه را به یک پروژه Firebase مستقر می کنید ، از منابع واقعی Firebase استفاده می کند ، نه منابع شبیه سازی شده. همانطور که با برنامه مرحله بندی خود تعامل دارید ، باید داده ها را ببینید و تصاویر در پروژه مرحله بندی خود در کنسول Firebase ظاهر می شوند.
  4. پس از آزمایش برنامه خود در مرحله بندی ، firebase-config.js به استفاده از پیکربندی Firebase Prod Project (اولین پروژه ای که در این CodeLab ایجاد کرده اید) تغییر دهید.
  5. در ریشه دایرکتوری web خود ، دستور زیر را اجرا کنید تا برنامه خود را به پروژه Firebase تولید خود مستقر کنید.
    firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
    
  6. برنامه تولید خود را در مرورگر از طریق URL که در خروجی Enploy firebase deploy چاپ شده است ، باز کنید. وارد سیستم شوید ، پیام ارسال کنید و تصاویر را بارگذاری کنید.

    باید داده ها را ببینید و تصاویر در پروژه تولید خود در کنسول Firebase ظاهر می شوند.
  7. پس از اتمام تعامل با دو برنامه برای این CodeLab ، می توانید از خدمت به آنها جلوگیری کنید. دستور زیر را برای هر یک از پروژه های خود اجرا کنید:
    firebase hosting:disable --project=<STAGING_PROJECT_ID>
    
    firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
    

13. تبریک می گویم!

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

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

  • با استفاده از Terraform CLI برای مدیریت منابع ابری
  • استفاده از Terraform برای پیکربندی محصولات Firebase (احراز هویت ، آتش نشانی ، ذخیره ابری و قوانین امنیتی)
  • در حال اجرا و آزمایش یک برنامه وب به صورت محلی با استفاده از مجموعه شبیه ساز محلی Firebase
  • وارد کردن Firebase به یک برنامه وب
  • با استفاده از Terraform برای تکرار پیکربندی در چندین محیط

برای کسب اطلاعات بیشتر در مورد Firebase و Terraform ، به اسناد ما مراجعه کنید. می توانید لیستی از کلیه محصولات Firebase را با پشتیبانی Terraform ، نمونه تنظیمات Terraform برای موارد استفاده مشترک و عیب یابی مفید و سؤالات متداول پیدا کنید.