1. مقدمه
اهداف
میتوانید از Terraform برای راهاندازی و مدیریت یک پروژه Firebase، از جمله پیکربندی برنامهای زیرساختها و محصولات Firebase استفاده کنید.
این کد لبه ابتدا نحوه ساخت یک فایل پیکربندی Terraform برای ایجاد یک پروژه Firebase جدید را توضیح می دهد و سپس نحوه پیکربندی برنامه ها و محصولات Firebase را که می خواهید در آن پروژه استفاده کنید، توضیح می دهد. ما همچنین اصول خط فرمان Terraform را پوشش میدهیم، مانند پیشنمایش تغییراتی که باید ایجاد شوند و سپس پیادهسازی آنها.
اگر میخواستید نحوه راهاندازی و مدیریت پروژهها و محصولات Firebase با Terraform را بیاموزید، این کد لبه برای شما مناسب است!
چیزی که یاد خواهید گرفت
-  نحوه ایجاد یک فایل پیکربندی Terraform ( 
*.tf) - چگونه از دستورات Terraform CLI برای مدیریت زیرساخت خود استفاده کنید
 - چگونه پیکربندی خود را برای به روز رسانی منابع و خدمات خود تغییر دهید
 - نحوه اعمال پیکربندی خود در یک برنامه وب واقعی (به نام چت دوستانه )
 - نحوه تعریف پیکربندی های موازی (و همزمان) در محیط های مختلف (تولید، صحنه سازی و غیره)
 
آنچه شما نیاز دارید
- یک ترمینال/کنسول
 - ویرایشگر IDE/متن انتخابی شما، مانند WebStorm ، Atom ، Sublime یا VS Code
 - مرورگر مورد نظر شما، مانند کروم
 - Google Cloud CLI (gcloud CLI) - این CLI را نصب کنید و با استفاده از یک حساب کاربری یا یک حساب سرویس وارد شوید
 
برای موفقیت با این کد لبه، به تسلط اولیه با Terraform و اصطلاحات آن، از جمله پیش نیازهای زیر نیاز دارید:
- Terraform را نصب کنید و با استفاده از آموزش های رسمی Terraform با 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 راه اندازی شد
-  در پایگاه کد برنامه نمونه دانلود شده، به ریشه دایرکتوری 
webبروید. -  در ریشه آن دایرکتوری، یک فایل پیکربندی 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های زیربنایی اضافه کنید
-  ابتدا، پروژه زیربنایی 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" } } - در مرحله بعد، باید APIهای زیربنایی مورد نیاز را فعال کنید: API Usage Service و Firebase Management API.
وقتی از کنسول Firebase برای ایجاد پروژه Firebase استفاده میکنید، معمولاً این فعالسازی API در پشت صحنه انجام میشود، اما به Terraform باید صریحاً گفته شود که این فعالسازی را انجام دهد.
به فایل پیکربندیmain.tfخود (درست زیر بلوکی که پروژه جدید Cloud را ایجاد می کند)، بلوک منبع زیر را اضافه کنید:
main.tf با فعال کردن سرویس Usage API، پروژه جدید شما میتواند چکهای سهمیه را بپذیرد! بنابراین، برای تمام فراهم کردن منابع بعدی و فعال کردن خدمات، باید از ارائه دهنده با... # Enable the required underlying Service Usage API. resource "google_project_service" "serviceusage" { provider = google-beta.no_user_project_override project = google_project.default.project_id service = "serviceusage.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enable the required underlying Firebase Management API. resource "google_project_service" "firebase" { provider = google-beta.no_user_project_override project = google_project.default.project_id service = "firebase.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false }user_project_override(بدون نیاز به نام مستعار) استفاده کنید. 
برای فعال کردن خدمات Firebase یک بلوک اضافه کنید
آخرین چیزی که برای "ایجاد پروژه Firebase" لازم است، فعال کردن خدمات Firebase در پروژه است.
 در ادامه در فایل پیکربندی main.tf خود، بلوک منبع زیر را اضافه کنید.
 همانطور که در بالا ذکر شد، توجه داشته باشید که این بلوک منبع از ارائه دهنده با user_project_override (بدون نیاز به نام مستعار) استفاده می کند.
main.tf
...
# Enable Firebase services for the new project created above.
resource "google_firebase_project" "default" {
  provider = google-beta
  project = google_project.default.project_id
  # Wait until the required APIs are enabled.
  depends_on = [
    google_project_service.firebase,
    google_project_service.serviceusage,
  ]
}
 در بلوک منبع بالا، ممکن است متوجه بند depends_on شوید، که به Terraform میگوید منتظر فعال شدن APIهای زیربنایی باشد. بدون این بند، Terraform از وابستگی اطلاعی ندارد و ممکن است هنگام تهیه منابع به صورت موازی با خطا مواجه شود.
تنظیمات را اعمال کنید
-  برای تهیه منابع جدید و فعال کردن API های مشخص شده در فایل کانفیگ خود، دستور زیر را از ریشه همان دایرکتوری فایل 
main.tfخود (که بایدwebباشد) اجرا کنید:terraform apply
 - در ترمینال، Terraform طرحی از اقداماتی را که انجام خواهد داد چاپ می کند.
اگر همه چیز مطابق انتظار به نظر می رسد، با وارد کردنyesاقدامات را تأیید کنید.
main.tfTerraform 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 تأیید کنید که پروژه ایجاد شده است.

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"
}
تنظیمات را اعمال کنید
-  برای تهیه منبع جدید، دستور زیر را از ریشه همان پوشه فایل 
main.tfخود (که بایدwebباشد) اجرا کنید. توجه داشته باشید که این دستور یک پروژه جدید Google Cloud را دوباره ایجاد نمی کند. Terraform تشخیص می دهد که پروژه ای با شناسه پروژه مشخص شده از قبل وجود دارد و وضعیت فعلی پروژه را با آنچه در فایلterraform apply
.tfاست مقایسه می کند و هر تغییری را که پیدا می کند ایجاد می کند. -  برنامه اقدامات چاپ شده را مرور کنید. اگر همه چیز مطابق انتظار به نظر می رسد، 
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 در اینجا آمده است:
- در کنسول Firebase ، بخش Build را در پانل سمت چپ قرار دهید.
 - روی تأیید هویت کلیک کنید، روی شروع کلیک کنید، و سپس روی برگه روش ورود به سیستم کلیک کنید (یا اینجا را کلیک کنید تا مستقیماً به آنجا بروید).
 - روی افزودن ارائهدهنده جدید کلیک کنید و از بخش ارائهدهندگان اضافی ، Google را انتخاب کنید.
 - کلید Enable را فعال کنید.
 -  نام عمومی برنامه خود را روی چیزی مانند 
FriendlyChatتنظیم کنید (نیازی نیست که این نام در سطح جهانی منحصر به فرد باشد). -  یک ایمیل پشتیبانی پروژه را از منوی کشویی انتخاب کنید و سپس روی ذخیره کلیک کنید. 

 -  شما باید Google را به عنوان یک ارائه دهنده ورود به سیستم فعال ببینید. 

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

 -  برای فعال کردن صورتحساب در پروژه خود از طریق 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 وارد شوید
-  برای ارائه احراز هویت 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, ] } - فعال کردن ورود به سیستم با Google مستلزم داشتن یک سرویس گیرنده OAuth است. برای انجام این تنظیمات، به بخش APIs & Services در Google Cloud Console بروید.
 -  از آنجایی که اولین بار است که یک شناسه مشتری برای این پروژه ایجاد می کنید، باید صفحه رضایت OAuth خود را پیکربندی کنید.
- صفحه نمایش رضایت OAuth را باز کنید و سپس پروژه ای را که ایجاد کرده اید انتخاب کنید.
 - User Type را روی External تنظیم کنید و سپس روی Create کلیک کنید.
 -  در صفحه بعد، موارد زیر را تکمیل کنید و سپس روی ذخیره کلیک کنید و ادامه دهید .
-  نام برنامه عمومی برنامه خود را روی چیزی مانند 
FriendlyChatتنظیم کنید (نیازی نیست این نام در سطح جهانی منحصر به فرد باشد). - ایمیل پشتیبانی کاربر را از منوی کشویی انتخاب کنید.
 - یک ایمیل برای اطلاعات تماس برنامهنویس وارد کنید.
 
 -  نام برنامه عمومی برنامه خود را روی چیزی مانند 
 -  در صفحه های بعدی موارد زیر را کامل کنید:
- پیش فرض ها را در صفحه Scopes بپذیرید و سپس روی Save and Continue کلیک کنید.
 - پیش فرض ها را در صفحه کاربران تست بپذیرید و سپس روی ذخیره و ادامه کلیک کنید.
 - خلاصه را مرور کنید و سپس روی بازگشت به داشبورد کلیک کنید.
 

 
 -  با انجام موارد زیر یک مشتری OAuth را در صفحه اعتبارنامه ها راه اندازی کنید:
- روی ایجاد اعتبارنامه کلیک کنید و شناسه مشتری OAuth را انتخاب کنید.
 - از منوی کشویی Application type ، Web application را انتخاب کنید.
 -  در قسمت Name ، نام برنامه خود را وارد کنید، به عنوان مثال 
FriendlyChat(نیازی نیست که این برنامه منحصر به فرد جهانی باشد). -  با تنظیم موارد زیر به 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تنظیم کرده اید. 
 -  در زیر مبداهای مجاز جاوا اسکریپت ، روی افزودن URI کلیک کرده و وارد کنید
 - روی ذخیره کلیک کنید.
 

 -  برای فعال کردن ورود به سیستم با 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 ] } 
تنظیمات را اعمال کنید
-  برای تنظیم Authentication بر اساس پیکربندی خود، دستورات زیر را از ریشه همان پوشه فایل 
main.tfخود (که بایدwebباشد) اجرا کنید:export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
 توجه داشته باشید که اجرایterraform apply
terraform applyباعث ایجاد مجدد پروژه Google Cloud جدید نمی شود. Terraform تشخیص می دهد که پروژه ای با شناسه پروژه مشخص شده از قبل وجود دارد و وضعیت فعلی پروژه را با آنچه در فایل.tfمقایسه می کند. سپس هر تغییری را که پیدا کند ایجاد می کند. -  برنامه اقدامات چاپ شده را مرور کنید. اگر همه چیز مطابق انتظار به نظر می رسد، 
yesرا تایپ کرده و Enter را فشار دهید تا اقدامات تأیید شود. 
تغییرات را تایید کنید
- در کنسول Firebase ، بخش Build را در پانل سمت چپ قرار دهید.
 - روی احراز هویت کلیک کنید و سپس روی برگه روش ورود به سیستم کلیک کنید (یا اینجا را کلیک کنید تا مستقیماً به آنجا بروید).
 -  شما باید Google را به عنوان یک ارائه دهنده ورود به سیستم فعال ببینید. 

 
7. پایگاه داده Firestore و قوانین امنیتی آن را تنظیم کنید
برای برنامه وب این Codelab، پیامها را بین کاربران نهایی در پایگاه داده Firestore ذخیره خواهید کرد.
-  برای فعال کردن 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 ] } -  
<NAME_OF_DESIRED_REGION>به منطقه ای که می خواهید پایگاه داده در آن قرار گیرد تغییر دهید.
هنگام توسعه یک برنامه تولیدی، میخواهید که این برنامه در منطقهای نزدیک به اکثر کاربران و مشترک با سایر سرویسهای Firebase، مانند Cloud Functions باشد. برای این کد، میتوانیدus-east1(کارولینای جنوبی) استفاده کنید یا از نزدیکترین منطقه به خود استفاده کنید (به مکانهای Cloud Firestore مراجعه کنید). -  هر نمونه پایگاه داده Firestore که برای Firebase قابل دسترسی است باید توسط قوانین امنیتی Firebase محافظت شود.
کد نمونه این Codelab مجموعه ای از قوانین Firestore امن را در فایلfirestore.rulesارائه می دهد که می توانید آنها را در ریشه فهرستwebبیابید. -  فایل 
main.tfخود را با بلوک های منبع زیر اضافه کنید تا کارهای زیر را انجام دهید:-  یک مجموعه قوانین از قوانین امنیتی Firebase از فایل 
firestore.rulesمحلی ایجاد کنید. - مجموعه قوانین را برای نمونه Firestore منتشر کنید.
 
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 ] } } -  یک مجموعه قوانین از قوانین امنیتی Firebase از فایل 
 -  برای ارائه پایگاه داده Firestore و استقرار قوانین امنیتی آن، 
terraform applyاجرا کنید. -  بررسی کنید که پایگاه داده آماده شده است و قوانین امنیتی آن مستقر هستند:
- در کنسول Firebase ، بخش Build را در پانل سمت چپ قرار دهید.
 - به بخش Firestore Database بروید و سپس روی تب Rules کلیک کنید.
 

 
8. یک سطل Cloud Storage و قوانین امنیتی آن را تنظیم کنید
برای برنامه وب این کد لبه، تصاویر به اشتراک گذاشته شده بین کاربران نهایی را در یک سطل Cloud Storage ذخیره خواهید کرد.
-  برای فعال کردن 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 } -  هر سطل Cloud Storage که برای Firebase قابل دسترسی است باید توسط قوانین امنیتی Firebase محافظت شود.
کد نمونه این Codelab مجموعه ای از قوانین Firestore امن را در فایلstorage.rulesارائه می دهد که می توانید در ریشه فهرستwebپیدا کنید. -  فایل 
main.tfخود را با بلوک های منبع زیر اضافه کنید تا کارهای زیر را انجام دهید:- یک مجموعه قوانین از قوانین امنیتی 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 ] } } -  برای ارائه سطل پیشفرض Cloud Storage و استقرار قوانین امنیتی آن، 
terraform applyاجرا کنید. -  بررسی کنید که سطل آماده است و قوانین امنیتی آن مستقر هستند:
- در کنسول Firebase ، بخش Build را در پانل سمت چپ قرار دهید.
 - به بخش Storage رفته و سپس روی تب Rules کلیک کنید.
 

 
9. برنامه خود را به صورت محلی اجرا کنید
اکنون برای اولین بار آماده اجرای برنامه وب خود هستید! شما از شبیه ساز میزبانی Firebase برای ارائه برنامه خود به صورت محلی استفاده خواهید کرد.
-  یک پنجره ترمینال جدید باز کنید و از فهرست 
web، دستور Firebase CLI زیر را برای راه اندازی شبیه ساز اجرا کنید:firebase emulators:start --project=<PROJECT_ID>
 -  در مرورگر خود، برنامه وب خود را در 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 را نصب کنید و ساخت بسته وب خود را شروع کنید
برای شروع ساخت برنامه خود باید چند دستور را اجرا کنید.
- یک پنجره ترمینال جدید باز کنید.
 -  مطمئن شوید که در ریشه دایرکتوری 
webهستید. -  برای دانلود Firebase SDK، 
npm installاجرا کنید. -  
npm updateبرای به روز رسانی وابستگی ها اجرا کنید. -  
npm run startبرای راه اندازی وب پک اجرا کنید. 
برای بقیه بخش کد، webpack اکنون به طور مداوم کد منبع شما را بازسازی می کند.
پیکربندی Firebase خود را به برنامه خود اضافه کنید
همچنین باید پیکربندی Firebase خود را به برنامه خود اضافه کنید تا SDK های Firebase بدانند از کدام پروژه Firebase می خواهید استفاده کنند.
برای این کد لبه، شما دو گزینه مختلف برای دریافت پیکربندی Firebase دارید:
- گزینه 1 : پیکربندی Firebase خود را از کنسول Firebase دریافت کنید.
 - گزینه 2 : پیکربندی Firebase خود را از طریق Terraform دریافت کنید.
 
گزینه 1: پیکربندی را از کنسول Firebase دریافت کرده و به پایگاه کد خود اضافه کنید
- در کنسول Firebase، به تنظیمات پروژه خود بروید.
 - به سمت پایین به کارت برنامه های شما بروید و سپس برنامه وب خود را انتخاب کنید.
 - Config را از پنجره snippet Firebase SDK انتخاب کنید و سپس قطعه پیکربندی را کپی کنید.
 -  پیکربندی خود را در فایل 
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 دریافت کنید.
-  در فایل 
main.tfخود، بلوک منبعgoogle_firebase_web_appخود را پیدا کنید (بلاکی که یک برنامه وب را با پروژه شما ثبت کرده است). -  بلافاصله پس از آن بلوک، بلوک های زیر را اضافه کنید:
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", "") } } ... -  از آنجایی که بلوک 
dataو بلوکoutputبه هیچ وجه برای اصلاح زیرساخت در نظر گرفته نشده اند، فقط باید دستورات زیر را اجرا کنید.-  برای بارگذاری پیکربندی Firebase برنامه وب خود در وضعیت Terraform پوشه خود، این دستور را اجرا کنید: 
terraform refresh
 -  برای چاپ مقادیر پیکربندی 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" } } } 
 -  برای بارگذاری پیکربندی Firebase برنامه وب خود در وضعیت Terraform پوشه خود، این دستور را اجرا کنید: 
 -  مقادیر را از داخل نقشه 
valueکپی کنید. -  این مقادیر (پیکربندی خود) را در فایل 
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 برنامه خود را با موارد زیر اضافه کنید:
...
const firebaseAppConfig = getFirebaseConfig();
initializeApp(firebaseAppConfig);
برنامه خود را امتحان کنید
اکنون که همه چیز برای Firebase پیکربندی شده است، می توانید برنامه کاربردی وب خود را امتحان کنید.
- مرورگر در حال سرویس دهی به برنامه شما را بازخوانی کنید.
 - اکنون باید بتوانید با Google وارد شوید و شروع به ارسال پیام در چت کنید. اگر فایل های تصویری دارید، حتی می توانید آنها را آپلود کنید!
 
11. پیکربندی خود را در محیط ها تکرار کنید
Terraform در مدیریت چندین زیرساخت با پیکربندی مشابه (به عنوان مثال، راهاندازی یک پروژه Firebase مرحلهای که شبیه به یک پروژه تولیدی است) برتر است.
در این کد لبه، شما دومین پروژه Firebase را ایجاد خواهید کرد تا یک محیط صحنه سازی باشد.
برای تکرار یک پیکربندی موجود برای ایجاد این پروژه مرحلهبندی، دو گزینه دارید:
-  گزینه 1 : یک کپی از پیکربندی Terraform تهیه کنید.
این گزینه بیشترین انعطاف را برای تفاوت پروژه تکرار شده با پروژه منبع ارائه می دهد. -  گزینه 2 : استفاده مجدد از تنظیمات با 
for_each.
این گزینه در صورتی که هر پروژه نباید تفاوت های قابل توجهی داشته باشد و می خواهید تغییرات را به یکباره در همه پروژه ها منتشر کنید، استفاده مجدد از کد بیشتری را ارائه می دهد. 
گزینه 1: یک کپی از پیکربندی Terraform تهیه کنید
این گزینه بیشترین انعطاف را برای تفاوت پروژه تکراری با پروژه منبع ارائه می دهد، مانند داشتن برنامه هایی با نام های نمایشی مختلف و عرضه های مرحله ای.
-  در ریشه فهرست 
webخود، یک فایل پیکربندی Terraform جدید به نامmain_staging.tfایجاد کنید. -  تمام بلوک های منبع را از فایل 
main.tfخود کپی کنید (به جز بلوک هایterraformوprovider)، و سپس آنها را در فایلmain_staging.tfخود جایگذاری کنید. -  سپس باید هر یک از بلوک های منبع تکراری خود را در 
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
اگر می خواهید از این پیکربندی استفاده کنید، حتماً موارد زیر را انجام دهید:-  پیکربندی را از 
main_staging-copypaste.tfکپی کنید و سپس آن را در فایلmain_staging.tfخود قرار دهید. -  در فایل 
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را با مقدار خود بهروزرسانی کنید. 
 -  در بلوک منبع 
 
# 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" } -  برچسبهای منبع: برای جلوگیری از تضاد، از یک نام جدید استفاده کنید. برای مثال، نام 
 -  اجرای 
terraform applyبرای ارائه پروژه Firebase جدید "Staging" و تمام منابع آن و فعال کردن خدمات آن. - با بررسی آنها در کنسول Firebase مانند قبل، تأیید کنید که همه چیز مطابق انتظار فراهم و فعال شده است.
 
 گزینه 2: استفاده مجدد از تنظیمات با for_each
 این گزینه در صورتی که هر پروژه نباید تفاوت های قابل توجهی داشته باشد و می خواهید تغییرات را به یکباره در همه پروژه ها منتشر کنید، استفاده مجدد از کد بیشتری را ارائه می دهد. از متا آرگومان for_each در زبان Terraform استفاده می کند.
-  فایل 
main.tfخود را باز کنید. -  به هر بلوک منبعی که می خواهید تکرار کنید، یک متا آرگومان 
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
اگر می خواهید از این پیکربندی استفاده کنید، حتماً موارد زیر را انجام دهید:-  پیکربندی را از 
main-foreach.tfکپی کنید و سپس آن را در فایلmain.tfخود قرار دهید. -  در فایل 
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را با ارزش خود به روز کنید. 
 -  در بلوک منبع 
 
 -  پیکربندی را از 
 -  به جای استفاده از این پیکربندی بلافاصله ، درک و رفع چند مورد در مورد چگونگی تفسیر Terraform این پیکربندی در مقایسه با زیرساخت های موجود مهم است.
-  در حال حاضر ، اگر این پیکربندی را که 
for_eachاستفاده می کند استفاده کردید ، آدرس های منابع مانند موارد زیر به نظر می رسند: با این حال ، پروژه موجود که در قسمت اول این CodeLab ایجاد کرده اید ، به عنوان زیر به Terraform شناخته شده است: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"]google_project.default google_firebase_project.default google_firebase_android_app.default -  
terraform planاجرا کنید تا ببینید که با توجه به وضعیت فعلی ، Terraform چه اقداماتی انجام می دهد.
خروجی باید نشان دهد که Terraform پروژه ای را که در قسمت اول این CodeLab ایجاد کرده اید حذف می کند و دو پروژه جدید ایجاد می کند. این امر به این دلیل است که Terraform نمی داند که پروژه در آدرسgoogle_project.defaultبه آدرس جدیدgoogle_project.default["prod"]منتقل شده است. -  برای رفع این مشکل ، دستور 
terraform state mvاجرا کنید:terraform state mv "google_project.default" "google_project.default[\"prod\"]"
 -  به طور مشابه ، برای رفع تمام بلوک های منابع دیگر ، 
terraform state mvبرایgoogle_firebase_project،google_firebase_web_appو سایر بلوک های منابع موجود در پروندهmain.tfخود اجرا کنید. -  حال اگر مجدداً 
terraform planاجرا کنید ، نباید نشان داد که Terraform پروژه ای را که در قسمت اول این CodeLab ایجاد کرده اید حذف می کند. 
 -  در حال حاضر ، اگر این پیکربندی را که 
 -  اجرای 
terraform applyو خدمات آن را فعال کنید. - تأیید کنید که با بررسی آنها در کنسول Firebase مانند گذشته ، همه چیز تهیه و فعال شده است.
 
12. مرحله جایزه: برنامه های مرحله بندی و تولید خود را مستقر کنید
-  در قسمت کد برنامه خود ، 
firebase-config.jsرا تغییر دهید تا به جای آن از پیکربندی Firebase از پروژه مرحله بندی خود استفاده کنید.
برای یادآوری اینکه چگونه می توانید پیکربندی Firebase خود را دریافت کرده و آن را به برنامه خود اضافه کنید ، مرحله اولیه این CodeLab را ببینید ، پیکربندی Firebase خود را به برنامه خود اضافه کنید. -  در ریشه دایرکتوری 
webخود ، دستور زیر را اجرا کنید تا برنامه خود را در پروژه Firebase Staging خود مستقر کنید.firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
 -  برنامه مرحله بندی خود را در مرورگر از طریق URL که در خروجی 
firebase deployچاپ شده است ، باز کنید. وارد سیستم شوید ، پیام ارسال کنید و تصاویر را بارگذاری کنید.
هنگامی که یک برنامه را به یک پروژه Firebase مستقر می کنید ، از منابع واقعی Firebase استفاده می کند ، نه منابع شبیه سازی شده. همانطور که با برنامه مرحله بندی خود تعامل دارید ، باید داده ها را ببینید و تصاویر در پروژه مرحله بندی خود در کنسول Firebase ظاهر می شوند. -  پس از آزمایش برنامه خود در مرحله بندی ، 
firebase-config.jsبه استفاده از پیکربندی Firebase Prod Project (اولین پروژه ای که در این CodeLab ایجاد کرده اید) تغییر دهید. -  در ریشه دایرکتوری 
webخود ، دستور زیر را اجرا کنید تا برنامه خود را به پروژه Firebase تولید خود مستقر کنید.firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
 -  برنامه تولید خود را در مرورگر از طریق URL که در خروجی 
firebase deployچاپ شده است ، باز کنید. وارد سیستم شوید ، پیام ارسال کنید و تصاویر را بارگذاری کنید.
باید داده ها را ببینید و تصاویر در پروژه تولید خود در کنسول Firebase ظاهر می شوند. -  پس از اتمام تعامل با دو برنامه برای این 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 برای موارد استفاده مشترک و عیب یابی مفید و سؤالات متداول پیدا کنید.