Firebase เริ่มรองรับ Terraform แล้ว หากคุณอยู่ในทีมที่ต้องการสร้างโปรเจ็กต์ Firebase ให้เป็นอัตโนมัติและสร้างมาตรฐานด้วยการจัดเตรียมทรัพยากรเฉพาะและเปิดใช้งานบริการ การใช้ Terraform กับ Firebase อาจเหมาะกับคุณ
ขั้นตอนการทำงานพื้นฐานสำหรับการใช้ Terraform กับ Firebase มีดังต่อไปนี้:
การสร้างและปรับแต่งไฟล์การกำหนดค่า Terraform (ไฟล์
.tf
) ซึ่งระบุโครงสร้างพื้นฐานที่คุณต้องการจัดเตรียม (นั่นคือ ทรัพยากรที่คุณต้องการจัดเตรียมและบริการที่คุณต้องการเปิดใช้งาน)การใช้คำสั่ง gCloud CLI ที่อินเทอร์เฟซกับ Terraform เพื่อจัดเตรียมโครงสร้างพื้นฐานที่ระบุในไฟล์
.tf
คุณสามารถทำอะไรกับ Terraform และ Firebase ได้บ้าง?
ตัวอย่างขั้นตอนการทำงานทั่วไปในคู่มือนี้ คือการสร้างโปรเจ็กต์ Firebase ใหม่ด้วยแอป Android แต่คุณสามารถทำอะไรได้มากกว่านั้นด้วย Terraform เช่น:
ลบและแก้ไขโครงสร้างพื้นฐานที่มีอยู่โดยใช้ Terraform
จัดการการกำหนดค่าและงานเฉพาะผลิตภัณฑ์โดยใช้ Terraform เช่น:
- การเปิดใช้งานผู้ให้บริการลงชื่อเข้าใช้ Firebase Authentication
- การสร้างที่เก็บข้อมูล Cloud Storage หรืออินสแตนซ์ฐานข้อมูลและปรับใช้กฎความปลอดภัย Firebase สำหรับสิ่งเหล่านี้
คุณสามารถใช้ไฟล์กำหนดค่า Terraform มาตรฐานและคำสั่งเพื่อทำงานทั้งหมดนี้ให้สำเร็จได้ และเพื่อช่วยคุณในเรื่องนี้ เราได้จัดเตรียม ไฟล์การกำหนดค่า Terraform ตัวอย่างไว้ สำหรับการใช้งานทั่วไปหลายกรณี
ขั้นตอนการทำงานทั่วไปสำหรับการใช้ Terraform กับ Firebase
ข้อกำหนดเบื้องต้น
คู่มือนี้เป็นข้อมูลเบื้องต้นเกี่ยวกับการใช้ Terraform กับ Firebase ดังนั้นจึงถือว่ามีความเชี่ยวชาญขั้นพื้นฐานกับ Terraform ตรวจสอบให้แน่ใจว่าคุณได้เสร็จสิ้นข้อกำหนดเบื้องต้นต่อไปนี้ก่อนที่จะเริ่มเวิร์กโฟลว์นี้
ติดตั้ง Terraform และทำความคุ้นเคยกับ Terraform โดยใช้บทช่วยสอนอย่างเป็นทางการ
ติดตั้ง Google Cloud CLI (gCloud CLI) เข้าสู่ระบบโดยใช้ บัญชีผู้ใช้ หรือ บัญชีบริการ
- หากใช้บัญชีผู้ใช้ คุณต้องยอมรับข้อกำหนดในการให้บริการของ Firebase (Firebase ToS) คุณได้ยอมรับ Firebase ToS หากคุณสามารถดูโปรเจ็กต์ Firebase ใน คอนโซล Firebase ได้
- เพื่อให้ Terraform ดำเนินการบางอย่าง (เช่น สร้างโปรเจ็กต์) สิ่งต่อไปนี้จะต้องเป็นจริง:
- ผู้ใช้หรือบัญชีบริการต้องมีสิทธิ์การเข้าถึง IAM ที่เกี่ยวข้องสำหรับการดำเนินการเหล่านั้น
- หากผู้ใช้หรือบัญชีบริการเป็นส่วนหนึ่งขององค์กร Google Cloud นโยบายองค์กรจะต้องอนุญาตให้บัญชีดำเนินการเหล่านั้น
ขั้นตอนที่ 1: สร้างและปรับแต่งไฟล์กำหนดค่า Terraform
ไฟล์กำหนดค่า Terraform ต้องการสองส่วนหลัก (ซึ่งอธิบายไว้ในรายละเอียดด้านล่าง):
- ส่วนการตั้งค่า
provider
ซึ่งกำหนดว่าทรัพยากร Terraform ใดที่สามารถเข้าถึงได้ - ส่วนของบล็อก
resource
แต่ละรายการที่ระบุโครงสร้างพื้นฐานที่จะสร้าง
ตั้งค่า provider
ของคุณ
จำเป็นต้องมีการตั้งค่า provider
ไม่ว่าจะเกี่ยวข้องกับผลิตภัณฑ์หรือบริการของ Firebase ใดก็ตาม
สร้างไฟล์กำหนดค่า Terraform (เช่นไฟล์
main.tf
) ในไดเร็กทอรีในเครื่องของคุณในคู่มือนี้ คุณจะใช้ไฟล์กำหนดค่านี้เพื่อระบุทั้งการตั้งค่า
provider
และโครงสร้างพื้นฐานทั้งหมดที่คุณต้องการให้ Terraform สร้าง โปรดทราบว่าคุณมีตัวเลือกในการรวมการตั้งค่าผู้ให้บริการไว้ด้วยคุณมีตัวเลือกต่อไปนี้สำหรับวิธีรวมการตั้งค่า
provider
เข้ากับการกำหนดค่า Terraform ที่เหลือของคุณ:ตัวเลือกที่ 1: รวมไว้ที่ด้านบนของไฟล์กำหนดค่า Terraform
.tf
ไฟล์เดียว (ดังที่แสดงในคู่มือนี้)- ใช้ตัวเลือกนี้หากคุณเพิ่งเริ่มต้นใช้งาน Terraform หรือเพียงลองใช้ Terraform กับ Firebase
ตัวเลือกที่ 2: รวมไว้ในไฟล์
.tf
แยกต่างหาก (เช่น ไฟล์provider.tf
) นอกเหนือจากไฟล์.tf
ที่คุณระบุโครงสร้างพื้นฐานที่จะสร้าง (เช่น ไฟล์main.tf
)- ใช้ตัวเลือกนี้หากคุณเป็นส่วนหนึ่งของทีมขนาดใหญ่ที่ต้องการสร้างมาตรฐานในการตั้งค่า
- เมื่อรันคำสั่ง Terraform ทั้งไฟล์
provider.tf
และไฟล์main.tf
จะต้องอยู่ในไดเร็กทอรีเดียวกัน
รวมการตั้งค่า
provider
ต่อไปนี้ไว้ที่ด้านบนของไฟล์main.tf
คุณต้องใช้ผู้ให้บริการ
google-beta
เนื่องจากนี่เป็นรุ่นเบต้าของการใช้ Firebase กับ Terraform ใช้ความระมัดระวังเมื่อใช้ในการผลิต# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 4.0" } } } # Configures the provider to use the resource block's specified project for quota checks. provider "google-beta" { user_project_override = true } # Configures the provider to not use the resource block's specified project for quota checks. # This provider should only be used during project creation and initializing services. provider "google-beta" { alias = "no_user_project_override" user_project_override = false }
เรียนรู้เพิ่มเติมเกี่ยวกับ แอตทริบิวต์ที่เกี่ยวข้องกับโปรเจ็กต์ประเภทต่างๆ (รวมถึงสิ่งที่คู่มือนี้เรียกว่า "โปรเจ็กต์ตรวจสอบโควต้า") เมื่อใช้ Terraform กับ Firebase
ดำเนินการต่อไปยังส่วนถัดไปเพื่อกรอกไฟล์กำหนดค่าของคุณ และระบุโครงสร้างพื้นฐานที่จะสร้าง
ระบุโครงสร้างพื้นฐานที่จะสร้างโดยใช้บล็อก resource
ในไฟล์กำหนดค่า Terraform ของคุณ (สำหรับคู่มือนี้ ไฟล์ main.tf
ของคุณ) คุณต้องระบุโครงสร้างพื้นฐานทั้งหมดที่คุณต้องการให้ Terraform สร้าง (หมายถึงทรัพยากรทั้งหมดที่คุณต้องการจัดเตรียมและบริการทั้งหมดที่คุณต้องการเปิดใช้งาน) ในคู่มือนี้ ค้นหารายการ ทรัพยากร Firebase ทั้งหมดที่รองรับ Terraform
เปิดไฟล์
main.tf
ของคุณภายใต้การตั้งค่า
provider
ให้รวมการกำหนดค่าบล็อกresource
ต่อไปนี้ตัวอย่างพื้นฐานนี้สร้างโปรเจ็กต์ Firebase ใหม่ จากนั้นสร้างแอป Firebase Android ภายในโปรเจ็กต์นั้น
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { provider = google-beta.no_user_project_override name = "Project Display Name" project_id = "project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "default" { provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "default" { provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" package_name = "awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
หากคุณไม่คุ้นเคยกับโครงสร้างพื้นฐานของโปรเจ็กต์และแอปที่เป็นทรัพยากร โปรดตรวจสอบเอกสารประกอบต่อไปนี้:
- ทำความเข้าใจโปรเจ็กต์ Firebase
- เอกสารอ้างอิง สำหรับการจัดการโครงการ Firebase
# Terraform configuration to set up providers by version. ... # Configures the provider to use the resource block's specified project for quota checks. ... # Configures the provider to not use the resource block's specified project for quota checks. ... # Creates a new Google Cloud project. resource "google_project" "default" { # Use the provider that enables the setup of quota checks for a new project provider = google-beta.no_user_project_override name = "Project Display Name" // learn more about the project name project_id = "project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP) billing_account = "000000-000000-000000" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" // learn more about the Firebase-enabled label } } # Enables required APIs. resource "google_project_service" "default" { # Use the provider without quota checks for enabling APIS provider = google-beta.no_user_project_override project = google_project.default.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on. "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. # This action essentially "creates a Firebase project" and allows the project to use # Firebase services (like Firebase Authentication) and # Firebase tooling (like the Firebase console). # Learn more about the relationship between Firebase projects and Google Cloud. resource "google_firebase_project" "default" { # Use the provider that performs quota checks from now on provider = google-beta project = google_project.default.project_id # Waits for the required APIs to be enabled. depends_on = [ google_project_service.default ] } # Creates a Firebase Android App in the new project created above. # Learn more about the relationship between Firebase Apps and Firebase projects. resource "google_firebase_android_app" "default" { provider = google-beta project = google_project.default.project_id display_name = "My Awesome Android app" # learn more about an app's display name package_name = "awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.default, ] }
ขั้นตอนที่ 2: เรียกใช้คำสั่ง Terraform เพื่อสร้างโครงสร้างพื้นฐานที่ระบุ
หากต้องการจัดเตรียมทรัพยากรและเปิดใช้งานบริการที่ระบุในไฟล์ main.tf
ของคุณ ให้รันคำสั่งต่อไปนี้จากไดเร็กทอรีเดียวกันกับไฟล์ main.tf
ของคุณ สำหรับข้อมูลโดยละเอียดเกี่ยวกับคำสั่งเหล่านี้ โปรดดู เอกสารประกอบของ Terraform
หากนี่เป็นครั้งแรกที่คุณใช้คำสั่ง Terraform ในไดเร็กทอรี คุณจะต้องเริ่มต้นไดเร็กทอรีการกำหนดค่าและติดตั้งผู้ให้บริการ Google Terraform ทำสิ่งนี้ได้โดยการรันคำสั่งต่อไปนี้:
terraform init
สร้างโครงสร้างพื้นฐานที่ระบุในไฟล์
main.tf
ของคุณโดยการรันคำสั่งต่อไปนี้:terraform apply
ยืนยันว่าทุกอย่างได้รับการจัดเตรียมหรือเปิดใช้งานตามที่คาดไว้:
ตัวเลือกที่ 1: ดูการกำหนดค่าที่พิมพ์ในเทอร์มินัลของคุณโดยการรันคำสั่งต่อไปนี้:
terraform show
ตัวเลือกที่ 2: ดูโครงการ Firebase ของคุณใน คอนโซล Firebase
ทรัพยากร Firebase พร้อมรองรับ Terraform
ทรัพยากร Firebase และ Google ต่อไปนี้รองรับ Terraform และเรากำลังเพิ่มทรัพยากรมากขึ้นตลอดเวลา! ดังนั้น หากคุณไม่เห็นทรัพยากรที่คุณต้องการจัดการด้วย Terraform ให้กลับมาตรวจสอบอีกครั้งเร็วๆ นี้เพื่อดูว่าทรัพยากรนั้นพร้อมใช้งานหรือไม่ หรือขอทรัพยากรโดย ยื่นปัญหาใน GitHub repo
การจัดการโปรเจ็กต์ Firebase และแอป
google_firebase_project
— เปิดใช้งานบริการ Firebase บนโปรเจ็กต์ Google Cloud ที่มีอยู่google_firebase_project_location
- ตั้งค่าตำแหน่งสำหรับทรัพยากร Google Cloud เริ่มต้นของโปรเจ็กต์แอป Firebase
-
google_firebase_apple_app
— สร้างหรือจัดการแอปแพลตฟอร์ม Firebase Apple -
google_firebase_android_app
— สร้างหรือจัดการแอป Firebase Android -
google_firebase_web_app
— สร้างหรือจัดการ Firebase Web App
-
การรับรองความถูกต้องของ Firebase
google_identity_platform_config
— เปิดใช้งาน Google Cloud Identity Platform (GCIP) (ซึ่งเป็นแบ็กเอนด์สำหรับ Firebase Authentication) และจัดเตรียมการตั้งค่าการตรวจสอบสิทธิ์ระดับโครงการการกำหนดค่าการตรวจสอบสิทธิ์ Firebase ผ่าน Terraform จำเป็นต้องเปิดใช้ GCIP อย่าลืมตรวจสอบ ไฟล์
.tf
ตัวอย่างเพื่อดูวิธีตั้งค่า Firebase Authenticationโปรเจ็กต์ที่ Terraform จะเปิดใช้ GCIP และ/หรือ Firebase Authentication จะต้องอยู่ในแผนการกำหนดราคา Blaze (นั่นคือ โปรเจ็กต์ต้องมีบัญชี Cloud Billing ที่เชื่อมโยง) คุณดำเนินการนี้โดยทางโปรแกรมได้โดยตั้งค่าแอตทริบิวต์
billing_account
ในทรัพยากรgoogle_project
ทรัพยากรนี้ยังเปิดใช้งานการกำหนดค่าเพิ่มเติม เช่น วิธีการลงชื่อเข้าใช้ในเครื่อง เช่น การไม่ระบุชื่อ อีเมล/รหัสผ่าน และการตรวจสอบสิทธิ์ทางโทรศัพท์ รวมถึงฟังก์ชันการบล็อกและโดเมนที่ได้รับอนุญาต
google_identity_platform_default_supported_idp_config
— กำหนดค่าผู้ให้บริการข้อมูลประจำตัวส่วนกลางทั่วไป เช่น Google, Facebook หรือ Appleidentity_platform_oauth_idp_config
- กำหนดค่าแหล่งที่มาของผู้ให้บริการข้อมูลประจำตัว OAuth (IdP) ที่กำหนดเองgoogle_identity_platform_inbound_saml_config
— กำหนดค่าการรวม SAML
ยังไม่รองรับ:
- การกำหนดค่าการรับรองความถูกต้องแบบหลายปัจจัย (MFA) ผ่าน Terraform
ฐานข้อมูลเรียลไทม์ Firebase
-
google_firebase_database_instance
— สร้างอินสแตนซ์ฐานข้อมูลเรียลไทม์
ยังไม่รองรับ:
- การปรับใช้กฎการรักษาความปลอดภัยของฐานข้อมูลเรียลไทม์ Firebase ผ่าน Terraform (เรียนรู้วิธี ปรับใช้กฎเหล่านี้ โดยใช้เครื่องมืออื่น รวมถึงตัวเลือกทางโปรแกรม)
คลาวด์ไฟร์สโตร์
google_firestore_database
— สร้างอินสแตนซ์ Cloud Firestoregoogle_firestore_index
— เปิดใช้งานการสืบค้นที่มีประสิทธิภาพสำหรับ Cloud Firestoregoogle_firestore_document
- สร้างอินสแตนซ์ Cloud Firestore ด้วยเอกสารเฉพาะในคอลเลกชันสำคัญ: อย่าใช้ข้อมูลผู้ใช้จริงหรือข้อมูลการผลิตในเอกสารตั้งต้นนี้
ที่เก็บข้อมูลบนคลาวด์สำหรับ Firebase
google_firebase_storage_bucket
— ทำให้ที่เก็บข้อมูล Cloud Storage ที่มีอยู่สามารถเข้าถึงได้สำหรับ Firebase SDK, การตรวจสอบสิทธิ์ และกฎความปลอดภัยของ Firebase- การตั้งค่าที่เก็บข้อมูล Cloud Storage เริ่มต้นสำหรับโปรเจ็กต์ Firebase ต้องมีการจัดสรร
google_app_engine_application
ก่อน อย่าลืมตรวจสอบ ไฟล์.tf
ตัวอย่างเพื่อดูวิธีจัดสรรที่เก็บข้อมูล Cloud Storage
- การตั้งค่าที่เก็บข้อมูล Cloud Storage เริ่มต้นสำหรับโปรเจ็กต์ Firebase ต้องมีการจัดสรร
google_storage_bucket_object
— เพิ่มออบเจ็กต์ลงในที่เก็บข้อมูล Cloud Storageสิ่งสำคัญ: ห้ามใช้ข้อมูลผู้ใช้จริงหรือข้อมูลการผลิตในไฟล์นี้
กฎความปลอดภัยของ Firebase (สำหรับ Cloud Firestore และ Cloud Storage)
โปรดทราบว่าฐานข้อมูลเรียลไทม์ของ Firebase ใช้ระบบการจัดเตรียมที่แตกต่างกันสำหรับกฎความปลอดภัยของ Firebase
google_firebaserules_ruleset
— กำหนดกฎความปลอดภัยของ Firebase ที่ใช้กับอินสแตนซ์ Cloud Firestore หรือที่เก็บข้อมูล Cloud Storagegoogle_firebaserules_release
— ปรับใช้ชุดกฎเฉพาะกับอินสแตนซ์ Cloud Firestore หรือที่เก็บข้อมูล Cloud Storage
ตรวจสอบแอป Firebase
-
google_firebase_app_check_service_config
— เปิดใช้งานการบังคับใช้ App Check สำหรับบริการ -
google_firebase_app_check_app_attest_config
— ลงทะเบียนแอปแพลตฟอร์ม Apple กับผู้ให้บริการ App Attest -
google_firebase_app_check_device_check_config
— ลงทะเบียนแอปแพลตฟอร์ม Apple กับผู้ให้บริการ DeviceCheck -
google_firebase_app_check_play_integrity_config
— ลงทะเบียนแอป Android กับผู้ให้บริการ Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
— ลงทะเบียนเว็บแอปกับผู้ให้บริการ reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
- ลงทะเบียนเว็บแอปกับผู้ให้บริการ reCAPTCHA v3 -
google_firebase_app_check_debug_token
— ใช้โทเค็นการแก้ไขข้อบกพร่องสำหรับการทดสอบ
ส่วนขยาย Firebase
-
google_firebase_extensions_instance
— ติดตั้งหรืออัปเดตอินสแตนซ์ของ Firebase Extension
ตัวอย่างไฟล์การกำหนดค่า Terraform สำหรับกรณีการใช้งานทั่วไป
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เชื่อมโยงโปรเจ็กต์กับบัญชี Cloud Billing (ต้องใช้แผนราคา Blaze สำหรับการตรวจสอบสิทธิ์ Firebase ด้วย GCIP) เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ ตั้งค่าการตรวจสอบสิทธิ์ Firebase ด้วย GCIP และลงทะเบียนแอปที่แตกต่างกัน 3 แอป ประเภทกับโครงการ
โปรดทราบว่าจำเป็นต้องเปิดใช้ GCIP เพื่อตั้งค่า Firebase Authentication ผ่าน Terraform
# Creates a new Google Cloud project. resource "google_project" "auth" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "auth" { provider = google-beta.no_user_project_override project = google_project.auth.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "identitytoolkit.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "auth" { provider = google-beta project = google_project.auth.project_id depends_on = [ google_project_service.auth, ] } # Creates an Identity Platform config. # Also enables Firebase Authentication with Identity Platform in the project if not. resource "google_identity_platform_config" "auth" { provider = google-beta project = google_project.auth.project_id # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_phone_numbers = { "+11231231234" = "000000" } } } # Sets an SMS region policy. sms_region_config { allowlist_only { allowed_regions = [ "US", "CA", ] } } # Configures blocking functions. blocking_functions { triggers { event_type = "beforeSignIn" function_uri = "https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in" } forward_inbound_credentials { refresh_token = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_time = "" quota_duration = "7200s" } } # Configures authorized domains. authorized_domains = [ "localhost", "${google_project.auth.project_id}.firebaseapp.com", "${google_project.auth.project_id}.web.app", ] # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "auth" { provider = google-beta project = google_project.auth.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.auth, ] }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ จัดเตรียมอินสแตนซ์ฐานข้อมูลเรียลไทม์เริ่มต้นของโปรเจ็กต์ และลงทะเบียนแอป 3 ประเภทที่แตกต่างกันกับโปรเจ็กต์
# Creates a new Google Cloud project. resource "google_project" "rtdb" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb" { provider = google-beta.no_user_project_override project = google_project.rtdb.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb" { provider = google-beta project = google_project.rtdb.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_project.rtdb.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb" { provider = google-beta project = google_project.rtdb.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb, ] }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เชื่อมโยงโปรเจ็กต์กับบัญชี Cloud Billing (ต้องใช้แผนราคา Blaze สำหรับอินสแตนซ์ฐานข้อมูลเรียลไทม์หลายรายการ) เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ จัดเตรียมอินสแตนซ์ฐานข้อมูลเรียลไทม์หลายรายการ (รวมถึงฐานข้อมูลเรียลไทม์เริ่มต้นของโปรเจ็กต์ด้วย อินสแตนซ์) และลงทะเบียนแอปสามประเภทที่แตกต่างกันกับโปรเจ็กต์
# Creates a new Google Cloud project. resource "google_project" "rtdb-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "rtdb-multi" { provider = google-beta.no_user_project_override project = google_project.rtdb-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebasedatabase.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "${google_project.rtdb-multi.project_id}-default-rtdb" type = "DEFAULT_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Provisions an additional Realtime Database instance. resource "google_firebase_database_instance" "database-additional" { provider = google-beta project = google_project.rtdb-multi.project_id # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance. region = "name-of-region" # This value will become the first segment of the database's URL. instance_id = "name-of-additional-database-instance" type = "USER_DATABASE" # Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "rtdb-multi" { provider = google-beta project = google_project.rtdb-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.rtdb-multi, ] }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ จัดเตรียมอินสแตนซ์ Cloud Firestore ของโปรเจ็กต์ และลงทะเบียนแอปสามประเภทที่แตกต่างกันกับโปรเจ็กต์
นอกจากนี้ยังจัดเตรียมกฎความปลอดภัย Firebase สำหรับอินสแตนซ์ Cloud Firestore สร้างดัชนี Cloud Firestore และเพิ่มเอกสาร Cloud Firestore พร้อมข้อมูลเริ่มต้น
# Creates a new Google Cloud project. resource "google_project" "firestore" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "firestore" { provider = google-beta.no_user_project_override project = google_project.firestore.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "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 } # Enables Firebase services for the new project created above. resource "google_firebase_project" "firestore" { provider = google-beta project = google_project.firestore.project_id } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_project.firestore.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.firestore, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_project.firestore.project_id 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.firestore, ] } # Releases 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_project.firestore.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" query_scope = "COLLECTION" fields { field_path = "question" order = "ASCENDING" } fields { field_path = "answer" order = "ASCENDING" } # Wait for Firestore to be provisioned before adding this index. depends_on = [ google_firestore_database.firestore, ] } # Adds a new Firestore document with seed data. # Don't use real end-user or production data in this seed document. resource "google_firestore_document" "doc" { provider = google-beta project = google_project.firestore.project_id collection = "quiz" document_id = "question-1" fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}" # Wait for Firestore to be provisioned before adding this document. depends_on = [ google_firestore_database.firestore, ] } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "firestore" { provider = google-beta project = google_project.firestore.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.firestore, ] }
นี่คือชุดกฎของกฎความปลอดภัยของ Cloud Firestore ที่ควรอยู่ในไฟล์ในเครื่องชื่อ firestore.rules
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ จัดเตรียมที่เก็บข้อมูล Cloud Storage เริ่มต้นของโปรเจ็กต์ และลงทะเบียนแอป 3 ประเภทที่แตกต่างกันกับโปรเจ็กต์
นอกจากนี้ยังจัดเตรียมกฎความปลอดภัย Firebase สำหรับที่เก็บข้อมูล Cloud Storage และอัปโหลดไฟล์ไปยังที่เก็บข้อมูล
# Creates a new Google Cloud project. resource "google_project" "storage" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage" { provider = google-beta.no_user_project_override project = google_project.storage.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "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 } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage" { provider = google-beta project = google_project.storage.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default" { provider = google-beta project = google_project.storage.project_id # 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-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Makes 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_project.storage.project_id bucket_id = google_app_engine_application.default.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "storage" { provider = google-beta project = google_project.storage.project_id 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_project.storage, ] } # Releases 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_project.storage.project_id}/rulesets/${google_firebaserules_ruleset.storage.name}" project = google_project.storage.project_id } # Uploads a new file to the default Storage bucket. # Don't use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage" { provider = google-beta project = google_project.storage.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage, ] }
นี่คือชุดกฎของกฎการรักษาความปลอดภัยของ Cloud Storage ที่ควรอยู่ในไฟล์ในเครื่องชื่อ storage.rules
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เชื่อมโยงโปรเจ็กต์กับบัญชี Cloud Billing (ต้องใช้แผนราคา Blaze สำหรับที่เก็บข้อมูลหลายรายการ) เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ จัดเตรียมที่เก็บข้อมูล Cloud Storage หลายรายการ (รวมถึงที่เก็บข้อมูล Cloud Storage เริ่มต้นของโปรเจ็กต์) และลงทะเบียนแอปสามประเภทที่แตกต่างกันกับโปรเจ็กต์
นอกจากนี้ยังจัดเตรียมกฎความปลอดภัยของ Firebase สำหรับที่เก็บข้อมูล Cloud Storage และอัปโหลดไฟล์ไปยังที่เก็บข้อมูล Cloud Storage เริ่มต้น
# Creates a new Google Cloud project. resource "google_project" "storage-multi" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "storage-multi" { provider = google-beta.no_user_project_override project = google_project.storage-multi.project_id for_each = toset([ "cloudbilling.googleapis.com", "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "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 } # Enables Firebase services for the new project created above. resource "google_firebase_project" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id } # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-multi" { provider = google-beta project = google_project.storage-multi.project_id # 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-region-for-default-bucket" # If you use Firestore, uncomment this to make sure Firestore is provisioned first. # depends_on = [ # google_firestore_database.firestore # ] } # Provisions an additional Cloud Storage bucket. # Additional Cloud Storage buckets are not provisioned via App Engine. resource "google_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id name = "name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the default Storage bucket. location = "name-of-region-for-additional-bucket" } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_app_engine_application.default-multi.default_bucket } # Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "bucket-multi" { provider = google-beta project = google_project.storage-multi.project_id bucket_id = google_storage_bucket.bucket-multi.name } # Creates a ruleset of Firebase Security Rules from a local file. resource "google_firebaserules_ruleset" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id 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 Storage buckets to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.storage-multi, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-multi" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-multi.default_bucket}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Releases the ruleset to the additional Storage bucket. resource "google_firebaserules_release" "bucket-multi" { provider = google-beta name = "firebase.storage/${google_storage_bucket.bucket-multi.name}" ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}" project = google_project.storage-multi.project_id } # Uploads a new file to the default Storage bucket. # Do not use real end-user or production data in this file. resource "google_storage_bucket_object" "cat-picture-multi" { provider = google-beta name = "cat.png" source = "path/to/cat.png" bucket = google_app_engine_application.default-multi.default_bucket } # Creates a Firebase Android App in the new project created above. resource "google_firebase_android_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Android app" package_name = "android.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Apple-platforms App in the new project created above. resource "google_firebase_apple_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Apple app" bundle_id = "apple.app.12345" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] } # Creates a Firebase Web App in the new project created above. resource "google_firebase_web_app" "storage-multi" { provider = google-beta project = google_project.storage-multi.project_id display_name = "My Web app" # The other App types (Android and Apple) use "DELETE" by default. # Web apps don't use "DELETE" by default due to backward-compatibility. deletion_policy = "DELETE" # Wait for Firebase to be enabled in the Google Cloud project before creating this App. depends_on = [ google_firebase_project.storage-multi, ] }
นี่คือชุดกฎของกฎการรักษาความปลอดภัยของ Cloud Storage ที่ควรอยู่ในไฟล์ในเครื่องชื่อ storage.rules
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ จัดเตรียมอินสแตนซ์ Cloud Firestore จากนั้นจัดเตรียมที่เก็บข้อมูล Cloud Storage เริ่มต้น
นอกจากนี้ยังจัดเตรียมกฎความปลอดภัยของ Firebase สำหรับอินสแตนซ์ Cloud Firestore และที่เก็บข้อมูล Cloud Storage เริ่มต้นอีกด้วย
# Creates a new Google Cloud project. resource "google_project" "fs" { # fs = Firestore + Storage provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "fs" { provider = google-beta.no_user_project_override project = google_project.fs.project_id for_each = toset([ "serviceusage.googleapis.com", "cloudresourcemanager.googleapis.com", "firebaserules.googleapis.com", "firebasestorage.googleapis.com", "storage.googleapis.com", "firestore.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "fs" { provider = google-beta project = google_project.fs.project_id } #### Set up Firestore before default Cloud Storage bucket #### # Provisions the Firestore database instance. resource "google_firestore_database" "firestore-fs" { provider = google-beta project = google_project.fs.project_id name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.fs, ] } # Creates a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore-fs" { provider = google-beta project = google_project.fs.project_id source { files { # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started name = "firestore.rules" content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.firestore-fs ] } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore-fs" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore-fs.name project = google_project.fs.project_id # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.firestore-fs, ] } #### Set up default Cloud Storage default bucket after Firestore #### # Provisions the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id # 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-region" # Must be in the same location as Firestore (above) # Wait for Firestore to be provisioned first. # Otherwise, the Firestore instance will be provisioned in Datastore mode (unusable by Firebase). depends_on = [ google_firestore_database.firestore-fs, ] } # Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules. resource "google_firebase_storage_bucket" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id bucket_id = google_app_engine_application.default-bucket-fs.default_bucket } # Creates a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "default-bucket-fs" { provider = google-beta project = google_project.fs.project_id 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 Cloud Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_project.fs, ] } # Releases the ruleset to the default Storage bucket. resource "google_firebaserules_release" "default-bucket-fs" { provider = google-beta name = "firebase.storage/${google_app_engine_application.default-bucket-fs.default_bucket}" ruleset_name = "projects/${google_project.fs.project_id}/rulesets/${google_firebaserules_ruleset.default-bucket-fs.name}" project = google_project.fs.project_id }
นี่คือชุดกฎของกฎความปลอดภัยของ Cloud Firestore ที่ควรอยู่ในไฟล์ในเครื่องชื่อ firestore.rules
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { allow read: if request.auth != null; allow create: if request.auth != null; allow update: if request.auth != null; } }
นี่คือชุดกฎของกฎการรักษาความปลอดภัยของ Cloud Storage ที่ควรอยู่ในไฟล์ในเครื่องชื่อ storage.rules
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เปิดใช้งานบริการ Firebase สำหรับโปรเจ็กต์ รวมถึงตั้งค่าและเปิดใช้การบังคับใช้ Firebase App Check สำหรับ Cloud Firestore เพื่อให้สามารถเข้าถึงได้จากแอป Android ของคุณเท่านั้น
# Creates a new Google Cloud project. resource "google_project" "appcheck" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "services" { provider = google-beta.no_user_project_override project = google_project.appcheck.project_id for_each = toset([ "cloudresourcemanager.googleapis.com", "firebase.googleapis.com", "firebaseappcheck.googleapis.com", "firestore.googleapis.com", "serviceusage.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created earlier. resource "google_firebase_project" "appcheck" { provider = google-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_id = "name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" # Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore. depends_on = [ google_firebase_project.appcheck, ] } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project display_name = "Play Integrity app" package_name = "package.name.playintegrity" sha256_hashes = [ # TODO: insert your Android app's SHA256 certificate ] } # It takes a while for App Check to recognize the new app # If your app already exists, you don't have to wait 30 seconds. resource "time_sleep" "wait_30s" { depends_on = [google_firebase_android_app.appcheck] create_duration = "30s" } # Register the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [time_sleep.wait_30s, google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
การกำหนดค่านี้จะสร้างโปรเจ็กต์ Google Cloud ใหม่ เปิดใช้บริการ Firebase สำหรับโปรเจ็กต์ และติดตั้งอินสแตนซ์ใหม่ของ Firebase Extension ในโปรเจ็กต์ หากมีอินสแตนซ์อยู่แล้ว พารามิเตอร์ของอินสแตนซ์จะได้รับการอัปเดตตามค่าที่ระบุในการกำหนดค่า
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_id = "folder-id-for-new-project" name = "Project Display Name" project_id = "project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions). billing_account = "000000-000000-000000" # Required for the project to display in a list of Firebase projects. labels = { "firebase" = "enabled" } } # Enables required APIs. resource "google_project_service" "extensions" { provider = google-beta.no_user_project_override project = google_project.extensions.project_id for_each = toset([ "cloudbilling.googleapis.com", "cloudresourcemanager.googleapis.com", "serviceusage.googleapis.com", "firebase.googleapis.com", "firebaseextensions.googleapis.com", ]) service = each.key # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables Firebase services for the new project created above. resource "google_firebase_project" "extensions" { provider = google-beta project = google_project.extensions.project_id depends_on = [ google_project_service.extensions, ] } # Installs an instance of the "Translate Text in Firestore" extension. # Or updates the extension if the specified instance already exists. resource "google_firebase_extensions_instance" "translation" { provider = google-beta project = google_project.extensions.project_id instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "ar,en,es,de,fr" INPUT_FIELD_NAME = "input" LANGUAGES_FIELD_NAME = "languages" OUTPUT_FIELD_NAME = "translated" } system_params = { "firebaseextensions.v1beta.function/location" = "us-central1" "firebaseextensions.v1beta.function/memory" = "256" "firebaseextensions.v1beta.function/minInstances" = "0" "firebaseextensions.v1beta.function/vpcConnectorEgressSettings" = "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED" } } }
การแก้ไขปัญหาและคำถามที่พบบ่อย
คู่มือนี้ใช้แอตทริบิวต์ Terraform ต่อไปนี้เมื่อทำงานกับ "โครงการ"
-
project
ภายในบล็อกresource
แนะนำ: ทุกครั้งที่เป็นไปได้ ให้รวมคุณลักษณะ
project
ไว้ในแต่ละบล็อกresource
ด้วยการรวมแอตทริบิวต์ของโครงการ Terraform จะสร้างโครงสร้างพื้นฐานที่ระบุในบล็อกทรัพยากรภายในโครงการที่ระบุ คู่มือนี้และไฟล์กำหนดค่าตัวอย่างของเราล้วนใช้แนวปฏิบัตินี้
ดูเอกสาร Terraform อย่างเป็นทางการเกี่ยวกับ
project
-
user_project_override
ภายในบล็อกprovider
สำหรับการจัดสรรทรัพยากรส่วนใหญ่ คุณควรใช้
user_project_override = true
ซึ่งหมายถึงการตรวจสอบโควต้ากับโปรเจ็กต์ Firebase ของคุณเอง อย่างไรก็ตาม หากต้องการตั้งค่าโปรเจ็กต์ใหม่ให้สามารถรับการตรวจสอบโควต้าได้ คุณต้องใช้user_project_override = false
ก่อนดูเอกสาร Terraform อย่างเป็นทางการเกี่ยวกับ
user_project_override
ตรวจสอบให้แน่ใจว่าบัญชีผู้ใช้ที่คุณใช้เพื่อเรียกใช้คำสั่ง gCloud CLI ได้ยอมรับข้อกำหนดในการให้บริการของ Firebase (Firebase ToS) แล้ว
คุณสามารถตรวจสอบได้โดยใช้เบราว์เซอร์ที่ลงชื่อเข้าใช้บัญชีผู้ใช้และพยายามดูโครงการ Firebase ที่มีอยู่ใน คอนโซล Firebase หากคุณสามารถดูโปรเจ็กต์ Firebase ที่มีอยู่ได้ แสดงว่าบัญชีผู้ใช้ได้ยอมรับ Firebase ToS แล้ว
หากคุณไม่สามารถดูโปรเจ็กต์ Firebase ที่มีอยู่ได้ แสดงว่าบัญชีผู้ใช้อาจไม่ยอมรับ Firebase ToS หากต้องการแก้ไขปัญหานี้ ให้สร้างโปรเจ็กต์ Firebase ใหม่ผ่าน คอนโซล Firebase และยอมรับ Firebase ToS เป็นส่วนหนึ่งของการสร้างโปรเจ็กต์ คุณสามารถลบโปรเจ็กต์นี้ได้ทันทีผ่าน การตั้งค่าโปรเจ็กต์ ในคอนโซล
รอสักครู่ แล้วลองเรียกใช้ terraform apply
อีกครั้ง
อาจเนื่องมาจากความล่าช้าในการแพร่กระจายในระบบต่างๆ ลองแก้ไขปัญหานี้โดยการนำเข้าทรัพยากรเข้าสู่สถานะ Terraform โดยการเรียกใช้ terraform import
จากนั้นลองรัน terraform apply
อีกครั้ง
คุณสามารถเรียนรู้วิธีนำเข้าทรัพยากรแต่ละรายการได้ในส่วน "นำเข้า" ของเอกสาร Terraform (เช่น เอกสาร "นำเข้า" สำหรับ Cloud Firestore )
ตามข้อผิดพลาดที่แนะนำ Terraform อาจพยายามจัดเตรียมดัชนีหลายรายการและ/หรือสร้างเอกสารพร้อมกันและพบข้อผิดพลาดที่เกิดขึ้นพร้อมกัน ลองรัน terraform apply
อีกครั้ง
ข้อผิดพลาดนี้หมายความว่า Terraform ไม่ทราบว่าควรตรวจสอบโควต้ากับโปรเจ็กต์ใด หากต้องการแก้ไขปัญหา ให้ตรวจสอบสิ่งต่อไปนี้ในบล็อก resource
:
- ตรวจสอบให้แน่ใจว่าคุณได้ระบุค่าสำหรับแอตทริบิวต์
project
- ตรวจสอบให้แน่ใจว่าคุณใช้ผู้ให้บริการที่มี
user_project_override = true
(ไม่มีนามแฝง) ซึ่งในตัวอย่าง Firebase คือgoogle-beta
สาเหตุที่เป็นไปได้ที่รหัสโปรเจ็กต์อาจมีอยู่แล้วมีดังนี้
โครงการที่เกี่ยวข้องกับ ID นั้นเป็นของบุคคลอื่น
- วิธีแก้ไข: เลือกรหัสโปรเจ็กต์อื่น
โครงการที่เกี่ยวข้องกับ ID นั้นถูกลบไปเมื่อเร็วๆ นี้ (อยู่ในสถานะ soft-delete)
- วิธีแก้ไข: หากคุณคิดว่าโปรเจ็กต์ที่เกี่ยวข้องกับ ID เป็นของคุณ ให้ตรวจสอบสถานะของโปรเจ็กต์โดยใช้
projects.get
REST API
- วิธีแก้ไข: หากคุณคิดว่าโปรเจ็กต์ที่เกี่ยวข้องกับ ID เป็นของคุณ ให้ตรวจสอบสถานะของโปรเจ็กต์โดยใช้
โครงการที่เกี่ยวข้องกับ ID นั้นมีอยู่อย่างถูกต้องภายใต้ผู้ใช้ปัจจุบัน สาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดอาจเป็นเพราะ
terraform apply
ก่อนหน้านี้ถูกขัดจังหวะ- วิธีแก้ไข: รันคำสั่งต่อไปนี้:
terraform import google_project.default PROJECT_ID
แล้ว
terraform import google_firebase_project.default PROJECT_ID
- วิธีแก้ไข: รันคำสั่งต่อไปนี้:
แอปพลิเคชัน App Engine ต้องมีอินสแตนซ์ Cloud Firestore แต่คุณสามารถมีอินสแตนซ์ Cloud Firestore ได้เพียง 1 รายการต่อโปรเจ็กต์ ดังนั้น ตามที่ข้อความแสดงข้อผิดพลาดแนะนำ หากคุณได้จัดเตรียมอินสแตนซ์ Cloud Firestore ของโปรเจ็กต์ไว้ในที่เดียวแล้ว App Engine จะเกิดข้อผิดพลาดหากคุณพยายามจัดเตรียมอินสแตนซ์ Cloud Firestore ในตำแหน่งอื่น App Engine คิดว่าคุณกำลังพยายาม "จัดสรรใหม่" อินสแตนซ์ Cloud Firestore ที่มีอยู่แล้ว
หากต้องการแก้ไขข้อผิดพลาดนี้ ให้ใช้ตำแหน่งเดียวกันสำหรับทั้ง Cloud Firestore และแอปพลิเคชัน App Engine หากคุณต้องการที่เก็บข้อมูล Cloud Storage ในตำแหน่งอื่นจาก Cloud Firestore คุณสามารถจัดเตรียมที่เก็บข้อมูลเพิ่มเติมได้ (ดู การกำหนดค่าตัวอย่างสำหรับการสร้างที่เก็บข้อมูล Cloud Storage หลายรายการ )
เมื่อคุณจัดสรรที่เก็บข้อมูล Cloud Storage เริ่มต้นของโปรเจ็กต์ (ผ่าน google_app_engine_application
) และโปรเจ็กต์ยังไม่มีอินสแตนซ์ Cloud Firestore ดังนั้น google_app_engine_application
จะจัดเตรียมอินสแตนซ์ Cloud Firestore ของโปรเจ็กต์โดยอัตโนมัติ
ดังนั้น หากอินสแตนซ์ Cloud Firestore ของโปรเจ็กต์ของคุณได้รับการจัดสรรแล้ว google_firestore_database
จะเกิดข้อผิดพลาดหากคุณพยายามจัดเตรียมอินสแตนซ์ Cloud Firestore อย่างชัดเจน
เมื่อจัดสรรอินสแตนซ์ Cloud Firestore ของโปรเจ็กต์แล้ว คุณจะ "จัดสรรใหม่" หรือเปลี่ยนตำแหน่งของอินสแตนซ์ไม่ได้ หากต้องการหยุดไม่ให้ข้อผิดพลาดเกิดขึ้น ให้ลบบล็อกทรัพยากร google_firestore_database
ออกจากไฟล์กำหนดค่าของคุณ อย่างไรก็ตาม โปรดทราบว่าเราแนะนำให้จัดสรร Cloud Firestore ก่อนที่เก็บข้อมูล Cloud Storage เริ่มต้นของโปรเจ็กต์ (ดูสาเหตุด้านล่างด้านล่าง)