1. Pengantar
Sasaran
Anda dapat menggunakan Terraform untuk menyiapkan dan mengelola project Firebase, termasuk konfigurasi terprogram infrastruktur dan produk Firebase.
Codelab ini terlebih dahulu menjelaskan cara mem-build file konfigurasi Terraform untuk membuat project Firebase baru, diikuti dengan cara mengonfigurasi aplikasi dan produk Firebase yang ingin Anda gunakan dalam project tersebut. Kita juga membahas dasar-dasar command line Terraform, seperti melihat pratinjau perubahan yang akan dilakukan, lalu menerapkannya.
Jika Anda ingin mempelajari cara menyiapkan serta mengelola project dan produk Firebase dengan Terraform, codelab ini tepat untuk Anda.
Yang akan Anda pelajari
- Cara membuat file konfigurasi Terraform (
*.tf
) - Cara menggunakan perintah Terraform CLI untuk mengelola infrastruktur Anda
- Cara mengubah konfigurasi untuk mengupdate resource dan layanan
- Cara menerapkan konfigurasi pada aplikasi web sungguhan (yang disebut Friendly Chat)
- Cara menentukan konfigurasi paralel (dan yang disinkronkan) di berbagai lingkungan (produksi, staging, dll.)
Yang Anda butuhkan
- Terminal/konsol
- IDE/editor teks pilihan Anda, seperti WebStorm, Atom, Sublime, atau VS Code
- Browser pilihan Anda, seperti Chrome
- Google Cloud CLI (gCloud CLI) - instal CLI ini dan login menggunakan akun pengguna atau akun layanan
Agar dapat menguasai codelab ini, Anda memerlukan kemahiran dasar dalam menggunakan Terraform dan terminologinya, termasuk prasyarat berikut:
- Menginstal Terraform dan memahami Terraform melalui tutorial resminya
Codelab ini menyediakan aplikasi contoh nyata sehingga Anda dapat menguji dan berinteraksi dengan hal yang Anda sediakan melalui Terraform. Untuk melakukannya, Anda memerlukan hal berikut:
- Kode contoh untuk aplikasi web - download kode ini di langkah codelab berikutnya
- npm pengelola paket (yang biasanya dilengkapi dengan Node.js) - instal alat ini
- Firebase CLI - instal CLI ini dan login
2. Mendapatkan kode awal
Dalam codelab ini, Anda dapat menguji apa yang Anda sediakan melalui Terraform dengan aplikasi web sungguhan. Sebaiknya lakukan hal ini agar Anda memahami semua langkah yang diperlukan untuk menggunakan resource yang disediakan Terraform.
Clone repositori GitHub codelab dari command line:
git clone https://github.com/firebase/codelab-friendlychat-web
Atau, jika belum menginstal git, Anda dapat mendownload repositori sebagai file ZIP.
3. Membuat konfigurasi Terraform
Penyiapan Terraform
- Di codebase aplikasi contoh yang didownload, buka root direktori
web
. - Di root direktori tersebut, buat file konfigurasi Terraform bernama
main.tf
dengan penyiapan awal berikut:
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 }
Setiap penyedia google-beta
memiliki atribut bernama user_project_override
yang menentukan cara pemeriksaan kuota operasi dari Terraform. Untuk menyediakan sebagian besar resource, Anda harus menggunakan user_project_override = true
, yang berarti memeriksa kuota terhadap project Firebase Anda sendiri. Namun, untuk menyiapkan project baru agar dapat menerima pemeriksaan kuota, Anda harus menggunakan user_project_override=false
terlebih dahulu. Sintaksis alias
Terraform memungkinkan Anda membedakan antara dua penyiapan penyedia pada langkah berikutnya di codelab ini.
Melakukan inisialisasi Terraform di direktori
Membuat konfigurasi baru untuk pertama kalinya memerlukan download penyedia yang ditentukan dalam konfigurasi.
Untuk melakukan inisialisasi ini, jalankan perintah berikut dari root direktori yang sama dengan file konfigurasi main.tf
Anda:
terraform init
4. Membuat project Firebase melalui Terraform
Untuk "membuat project Firebase", perlu diingat bahwa setiap project Firebase sebenarnya adalah project Google Cloud, hanya saja layanan Firebase diaktifkan untuk project tersebut.
Menambahkan blok untuk API dan project Google Cloud pokok
- Pertama, sediakan project Google Cloud pokok.
Ke file konfigurasimain.tf
, tambahkan blok resource berikut.
Anda harus menentukan nama project Anda sendiri (seperti"Terraform FriendlyChat Codelab"
) dan project ID Anda sendiri (seperti"terraform-codelab-your-initials"
). Perhatikan bahwa nilainame
hanya digunakan dalam antarmuka Firebase dan tidak terlihat oleh pengguna akhir. Namun, nilaiproject_id
secara unik mengidentifikasi project Anda ke Google, jadi pastikan Anda menentukan nilai yang unik. 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" } }
- Selanjutnya, Anda harus mengaktifkan API dasar yang diperlukan: Service Usage API dan Firebase Management API.
Pengaktifan API ini biasanya ditangani di balik layar saat Anda menggunakan Firebase console untuk membuat project Firebase, tetapi Terraform perlu diberi tahu secara eksplisit untuk melakukan pengaktifan ini.
Ke file konfigurasimain.tf
Anda (tepat di bawah blok yang membuat project Cloud baru), tambahkan blok resource berikut ke status penerimaan.
main.tf
Dengan mengaktifkan pemeriksaan kuota untuk menerima project Jadi, untuk semua penyediaan resource dan pengaktifan layanan berikutnya, Anda harus menggunakan penyedia dengan... # 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
(tidak memerlukan alias).
Tambahkan pemblokiran untuk mengaktifkan layanan Firebase
Hal terakhir yang diperlukan untuk "membuat project Firebase" adalah mengaktifkan layanan Firebase di project tersebut.
Melanjutkan di file konfigurasi main.tf
, tambahkan blok resource berikut.
Seperti yang disebutkan di atas, perhatikan bahwa blok resource ini menggunakan penyedia dengan user_project_override
(tidak perlu alias).
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,
]
}
Di blok resource di atas, Anda mungkin melihat klausa depends_on
, yang memberi tahu Terraform untuk menunggu API yang mendasarinya diaktifkan. Tanpa klausul ini, Terraform tidak mengetahui dependensi dan mungkin akan mengalami error saat menyediakan resource secara paralel.
Terapkan konfigurasi:
- Untuk menyediakan resource baru dan mengaktifkan API yang ditentukan dalam file konfigurasi, jalankan perintah berikut dari root direktori yang sama dengan file
main.tf
Anda (yang seharusnya berupaweb
):terraform apply
- Di terminal, Terraform mencetak rencana tindakan yang akan dijalankannya.
Jika semuanya terlihat seperti yang diharapkan, setujui tindakan tersebut dengan memasukkanyes
.
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 # <----
Perhatikan bahwa jika Anda hanya perlu melihat pratinjau perubahan tanpa menerapkannya, Anda dapat menggunakan perintah terraform plan
.
Memvalidasi perubahan
Setelah Terraform selesai berjalan, Anda dapat memeriksa status semua resource dan layanan yang disediakan Terraform yang diaktifkan dengan menjalankan perintah berikut:
terraform show
Berikut adalah contoh tampilan yang akan dicetak. Status Anda akan berisi nilai khusus untuk project Anda.
# 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"
}
Atau, Anda dapat memverifikasi bahwa project dibuat dengan melihatnya di Firebase console.
5. Mendaftarkan aplikasi Firebase Anda melalui Terraform
Untuk menggunakan Firebase, Anda harus mendaftarkan setiap varian platform aplikasi di project Firebase. Dalam codelab ini, Anda akan menggunakan aplikasi sungguhan untuk menguji dan berinteraksi dengan hal yang Anda sediakan melalui Terraform. Aplikasi ini adalah aplikasi web, jadi Anda harus memberi tahu Terraform untuk mendaftarkan Aplikasi Web Firebase di project Firebase yang baru dibuat.
Tambahkan blok untuk mendaftarkan aplikasi web
Untuk mendaftarkan aplikasi web Anda di project Firebase, tambahkan file main.tf
dengan blok resource berikut.
Anda harus menentukan display_name
sendiri untuk aplikasi web Anda. Perhatikan bahwa nama ini hanya digunakan dalam antarmuka Firebase dan tidak terlihat oleh pengguna akhir.
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"
}
Terapkan konfigurasi:
- Untuk menyediakan resource baru, jalankan perintah berikut dari root direktori yang sama dengan file
main.tf
Anda (yang seharusnyaweb
).terraform apply
Perhatikan bahwa perintah ini tidak akan membuat ulang project Google Cloud baru. Terraform akan mendeteksi bahwa project dengan project ID yang ditentukan sudah ada dan akan membandingkan status project saat ini dengan yang ada di file.tf
dan melakukan perubahan yang ditemukannya. - Tinjau rencana tindakan yang dicetak. Jika semuanya terlihat seperti yang diharapkan, ketik
yes
, lalu tekan Enter untuk menyetujui tindakan.
Memvalidasi perubahan
Anda dapat memeriksa status resource yang baru disediakan dengan menjalankan perintah berikut:
terraform show
Atau, Anda dapat memverifikasi bahwa aplikasi berhasil didaftarkan di project Anda dengan melihatnya di Firebase console. Buka Project settings, lalu scroll ke bawah ke bagian Your apps.
6. Menyiapkan Firebase Authentication
Authentication adalah bagian penting dari aplikasi apa pun. Untuk memungkinkan pengguna akhir login ke aplikasi web Anda dengan Akun Google mereka, Anda dapat mengaktifkan Firebase Authentication dan menyiapkan login dengan metode Google.
Perlu diperhatikan bahwa dalam codelab ini, kami menyediakan dua opsi berbeda untuk menyiapkan Firebase Authentication:
- Opsi 1 (Direkomendasikan): Menyiapkan Firebase Authentication di konsol, yang tidak memerlukan GCIP.
- Dengan menggunakan opsi ini, Anda tidak perlu mengaitkan project baru dengan akun Penagihan Cloud.
- Opsi 2: Menyiapkan Firebase Authentication melalui Terraform menggunakan API Google Cloud Identity Platform (GCIP).
- Menggunakan opsi ini berarti Anda harus mengaitkan project baru dengan akun Penagihan Cloud karena GCIP mengharuskan project menggunakan paket harga Blaze.
Opsi 1: Menyiapkan Authentication menggunakan Firebase console
Untuk menyiapkan Firebase Authentication menggunakan Firebase console, project Anda tidak perlu menggunakan paket harga Blaze.
Berikut cara menyiapkan Firebase Authentication dan login dengan Google:
- Di Firebase console, cari bagian Build di panel kiri.
- Klik Authentication, klik Mulai, lalu klik tab Metode login (atau klik di sini untuk langsung membukanya).
- Klik Tambahkan penyedia baru dan, dari bagian Penyedia tambahan, pilih Google.
- Aktifkan tombol Aktifkan.
- Setel nama aplikasi Anda yang dapat dilihat publik menjadi sesuatu seperti
FriendlyChat
(ini tidak harus unik secara global). - Pilih Email dukungan project dari menu dropdown, lalu klik Save.
- Anda akan melihat Google sebagai penyedia login yang diaktifkan.
Opsi 2: Menyiapkan Autentikasi melalui Terraform menggunakan API Google Cloud Identity Platform (GCIP)
Untuk menyiapkan Firebase Authentication melalui Terraform, Anda harus menggunakan GCIP API, yang berarti project harus menggunakan paket harga Blaze. Anda mengupgrade project Firebase agar menggunakan paket Blaze dengan mengaitkan akun Penagihan Cloud ke project tersebut.
Mengaktifkan penagihan melalui Terraform
- Jika Anda belum memiliki akun Penagihan Cloud, langkah pertama adalah membuat akun baru di Google Cloud Console. Saat Anda melakukannya, catat ID akun penagihan. ID Akun penagihan dapat ditemukan di halaman Billing di ID akun penagihan yang terkait dengan project Anda.
- Untuk mengaktifkan penagihan di project Anda melalui Terraform, tambahkan atribut
billing_account
ke resourcegoogle_project
yang ada di filemain.tf
Anda:
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" } } ...
Mengaktifkan Firebase Authentication dan login dengan Google melalui Terraform
- Untuk menyediakan Firebase Authentication dengan GCIP, tambahkan file
main.tf
dengan blok resource berikut:
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, ] }
- Mengaktifkan login dengan Google mengharuskan Anda memiliki klien OAuth. Buka bagian APIs & Services di Konsol Google Cloud untuk melakukan penyiapan ini.
- Karena ini adalah pertama kalinya Anda membuat client ID untuk project ini, Anda perlu mengonfigurasi layar izin OAuth.
- Buka halaman OAuth consent screen, lalu pilih project yang baru saja Anda buat.
- Tetapkan User Type ke External, lalu klik Create.
- Di layar berikutnya, selesaikan hal berikut, lalu klik Simpan dan lanjutkan.
- Setel Nama aplikasi aplikasi yang dapat dilihat publik menjadi sesuatu seperti
FriendlyChat
(tidak harus unik secara global). - Pilih Email dukungan pengguna dari menu dropdown.
- Masukkan email untuk Informasi kontak developer.
- Setel Nama aplikasi aplikasi yang dapat dilihat publik menjadi sesuatu seperti
- Di layar berikutnya, selesaikan langkah-langkah berikut:
- Setujui setelan default di halaman Cakupan, lalu klik Simpan dan Lanjutkan.
- Setujui setelan default di halaman Test users, lalu klik Save and Continue.
- Tinjau ringkasan, lalu klik Kembali ke dasbor.
- Siapkan klien OAuth di halaman Credentials dengan melakukan hal berikut:
- Klik Buat kredensial, lalu pilih ID klien OAuth.
- Dari drop-down Jenis aplikasi, pilih Aplikasi web.
- Di kolom Name, masukkan nama aplikasi Anda, misalnya
FriendlyChat
(ini tidak harus unik secara global). - Izinkan URL aplikasi Anda menggunakan klien OAuth ini, dengan menetapkan setelan berikut:
- Di bagian Asal JavaScript resmi, klik Tambahkan URI dan masukkan
https://<PROJECT_ID>.firebaseapp.com
, dengan<PROJECT_ID>
adalah project ID yang Anda tetapkan dimain.tf
. - Di bagian URI pengalihan yang sah, klik Tambahkan URI dan masukkan
https://<PROJECT_ID>.firebaseapp.com/__/auth/handler
, dengan<PROJECT_ID>
adalah ID project yang Anda tetapkan dimain.tf
.
- Di bagian Asal JavaScript resmi, klik Tambahkan URI dan masukkan
- Klik Save.
- Untuk mengaktifkan login dengan Google menggunakan client ID OAuth dan rahasia klien, tambahkan file
main.tf
dengan blok berikut:
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 ] }
Terapkan konfigurasi:
- Untuk menyiapkan Authentication sesuai dengan konfigurasi Anda, jalankan perintah berikut dari root direktori yang sama dengan file
main.tf
Anda (yang seharusnyaweb
):export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
terraform apply
Perhatikan bahwa menjalankanterraform apply
tidak akan membuat ulang project Google Cloud baru. Terraform akan mendeteksi bahwa project dengan ID project yang ditentukan sudah ada dan akan membandingkan status project saat ini dengan yang ada di file.tf
. {i>Database<i} akan membuat perubahan yang ditemukannya. - Tinjau rencana tindakan yang dicetak. Jika semuanya terlihat seperti yang diharapkan, ketik
yes
, lalu tekan Enter untuk menyetujui tindakan.
Memvalidasi perubahan
- Di Firebase console, cari bagian Build di panel kiri.
- Klik Authentication, lalu klik tab Sign-in method (atau klik di sini untuk langsung membukanya).
- Anda akan melihat Google sebagai penyedia login yang diaktifkan.
7. Menyiapkan database Firestore dan Aturan Keamanannya
Untuk aplikasi web codelab ini, Anda akan menyimpan pesan di antara pengguna akhir di database Firestore.
- Untuk mengaktifkan API yang diperlukan dan menyediakan instance database, tambahkan file
main.tf
dengan blok resource berikut:
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 ] }
- Ubah
<NAME_OF_DESIRED_REGION>
ke region tempat Anda ingin menyimpan database.
Saat mengembangkan aplikasi produksi, Anda ingin aplikasi ini berada di region yang dekat dengan sebagian besar pengguna dan sama dengan layanan Firebase lainnya, seperti Cloud Functions. Untuk codelab ini, Anda dapat menggunakanus-east1
(South Carolina) atau menggunakan region terdekat (lihat lokasi Cloud Firestore). - Setiap instance database Firestore yang dapat diakses Firebase harus dilindungi oleh Aturan Keamanan Firebase.
Kode contoh codelab ini menyediakan kumpulan aturan Firestore yang aman dalam filefirestore.rules
, yang dapat Anda temukan di root direktoriweb
. - Tambahkan file
main.tf
dengan blok resource berikut untuk melakukan hal berikut:- Buat kumpulan aturan Aturan Keamanan Firebase dari file
firestore.rules
lokal. - Rilis kumpulan aturan untuk instance 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 ] } }
- Buat kumpulan aturan Aturan Keamanan Firebase dari file
- Jalankan
terraform apply
untuk menyediakan database Firestore dan men-deploy aturan keamanannya. - Verifikasi bahwa database disediakan dan aturan keamanannya telah diterapkan:
- Di Firebase console, cari bagian Build di panel kiri.
- Buka bagian Firestore Database, lalu klik tab Rules.
8. Menyiapkan bucket Cloud Storage dan Aturan Keamanannya
Untuk aplikasi web codelab ini, Anda akan menyimpan gambar yang dibagikan antara pengguna akhir di bucket Cloud Storage.
- Untuk mengaktifkan API yang diperlukan dan menyediakan bucket default Cloud Storage, tambahkan file
main.tf
dengan blok resource berikut.
Perhatikan bahwa bucket Cloud Storage default untuk project Anda disediakan melalui Google App Engine dan harus memiliki lokasi yang sama dengan database Firestore Anda. Lihat lokasi App Engine untuk informasi selengkapnya.
Jika Anda menginginkan beberapa bucket di project, sediakan menggunakan resourcegoogle_storage_bucket
(tidak ditampilkan dalam codelab ini).
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 }
- Setiap bucket Cloud Storage yang dapat diakses Firebase harus dilindungi oleh Aturan Keamanan Firebase.
Kode contoh codelab ini menyediakan kumpulan aturan Firestore yang aman dalam filestorage.rules
, yang dapat Anda temukan di root direktoriweb
. - Tambahkan file
main.tf
dengan blok resource berikut untuk melakukan hal berikut:- Membuat kumpulan aturan Aturan Keamanan Firebase dari file lokal.
- Rilis kumpulan aturan untuk bucket Storage.
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 ] } }
- Jalankan
terraform apply
untuk menyediakan bucket Cloud Storage default dan men-deploy aturan keamanannya. - Verifikasi bahwa bucket telah disediakan dan aturan keamanannya telah di-deploy:
- Di Firebase console, cari bagian Build di panel kiri.
- Buka bagian Storage lalu klik tab Rules.
9. Menjalankan aplikasi secara lokal
Sekarang Anda siap menjalankan aplikasi web untuk pertama kalinya! Anda akan menggunakan emulator Firebase Hosting untuk menayangkan aplikasi secara lokal.
- Buka jendela terminal baru dan, dari direktori
web
, jalankan perintah Firebase CLI berikut untuk memulai emulator:firebase emulators:start --project=<PROJECT_ID>
- Di browser, buka aplikasi web di URL lokal yang ditampilkan oleh CLI (biasanya
http://localhost:5000
).
Anda akan melihat UI aplikasi FriendlyChat, yang (belum!) berfungsi. Aplikasi ini belum terhubung ke Firebase, tetapi dengan menyelesaikan langkah-langkah berikutnya dalam codelab ini, semuanya akan berhasil.
Perlu diperhatikan bahwa setiap kali Anda membuat perubahan pada aplikasi web (seperti yang akan Anda lakukan pada langkah-langkah berikut di codelab ini), muat ulang browser Anda untuk memperbarui URL lokal dengan perubahan tersebut.
10. Menginstal, mengonfigurasi, dan melakukan inisialisasi Firebase
Agar aplikasi dapat berfungsi dengan Firebase, aplikasi Anda memerlukan Firebase SDK dan konfigurasi Firebase untuk project Firebase Anda.
Kode contoh untuk codelab ini sudah menjadi aplikasi yang berfungsi dengan semua dependensi dan fungsi yang diperlukan untuk menggunakan berbagai produk Firebase di aplikasi. Anda dapat melihat di web/package.json
dan web/src/index.js
jika ingin melihat apa yang telah dilakukan.
Meskipun kode contoh sebagian besar sudah selesai, Anda masih perlu melakukan beberapa hal untuk menjalankan aplikasi, termasuk: menginstal Firebase SDK, memulai build, menambahkan konfigurasi Firebase ke aplikasi, dan terakhir melakukan inisialisasi Firebase.
Instal Firebase SDK dan mulai build webpack Anda
Anda perlu menjalankan beberapa perintah untuk memulai build aplikasi.
- Buka jendela terminal baru.
- Pastikan Anda berada di root direktori
web
. - Jalankan
npm install
untuk mendownload Firebase SDK. - Jalankan
npm update
untuk mengupdate dependensi apa pun. - Jalankan
npm run start
untuk memulai webpack.
Untuk codelab lainnya, webpack kini akan terus membangun ulang kode sumber Anda.
Menambahkan konfigurasi Firebase ke aplikasi
Anda juga perlu menambahkan konfigurasi Firebase ke aplikasi sehingga Firebase SDK mengetahui project Firebase yang ingin digunakan.
Untuk codelab ini, Anda memiliki dua opsi berbeda untuk mendapatkan konfigurasi Firebase:
- Opsi 1: Dapatkan konfigurasi Firebase dari Firebase console.
- Opsi 2: Dapatkan konfigurasi Firebase Anda melalui Terraform.
Opsi 1: Dapatkan konfigurasi dari Firebase console dan tambahkan ke codebase Anda
- Di Firebase console, buka Project settings.
- Scroll ke bawah ke kartu Your apps, lalu pilih aplikasi web Anda.
- Pilih Config dari panel cuplikan Firebase SDK, lalu salin cuplikan konfigurasi.
- Tempelkan konfigurasi Anda ke file
web/src/firebase-config.js
aplikasi, seperti:
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>", }; ...
Opsi 2: Dapatkan konfigurasi melalui Terraform dan tambahkan ke codebase Anda
Atau, Anda bisa mendapatkan konfigurasi Firebase melalui Terraform sebagai nilai output di CLI.
- Dalam file
main.tf
, temukan blok resourcegoogle_firebase_web_app
(blok yang mendaftarkan aplikasi web dengan project Anda). - Segera setelah blok tersebut, tambahkan blok berikut:
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", "") } } ...
- Karena blok
data
dan blokoutput
tidak dimaksudkan untuk memodifikasi infrastruktur dengan cara apa pun, Anda hanya perlu menjalankan perintah berikut.- Untuk memuat konfigurasi Firebase aplikasi web Anda ke status Terraform di direktori, jalankan perintah ini:
terraform refresh
- Untuk mencetak nilai konfigurasi Firebase, jalankan perintah ini:
terraform output –json
Berikut adalah contoh output konfigurasi. Output cetak akan berisi nilai aplikasi dan project Anda.{ "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" } } }
- Untuk memuat konfigurasi Firebase aplikasi web Anda ke status Terraform di direktori, jalankan perintah ini:
- Salin nilai dari dalam peta
value
. - Tempelkan nilai ini (konfigurasi Anda) ke dalam file
web/src/firebase-config.js
aplikasi Anda, seperti:
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", }; ...
Melakukan inisialisasi Firebase di aplikasi
Terakhir, untuk melakukan inisialisasi Firebase, tambahkan file web/src/index.js
aplikasi Anda dengan kode berikut:
...
const firebaseAppConfig = getFirebaseConfig();
initializeApp(firebaseAppConfig);
Mencoba aplikasi Anda
Setelah semuanya dikonfigurasi untuk Firebase, Anda dapat mencoba aplikasi web fungsional Anda.
- Refresh browser yang menayangkan aplikasi Anda.
- Sekarang Anda dapat login dengan Google dan mulai memposting pesan ke dalam chat. Jika Anda memiliki file gambar, Anda bahkan dapat menguploadnya!
11. Mereplikasi konfigurasi Anda di seluruh lingkungan
Terraform ahli dalam mengelola beberapa infrastruktur yang dikonfigurasi serupa (misalnya, menyiapkan project Firebase staging yang mirip dengan project produksi).
Dalam codelab ini, Anda akan membuat project Firebase kedua yang akan menjadi lingkungan staging.
Untuk mereplikasi konfigurasi yang ada guna membuat project staging ini, Anda memiliki dua opsi:
- Opsi 1: Buat salinan konfigurasi Terraform.
Opsi ini menawarkan fleksibilitas paling besar terkait seberapa besar perbedaan antara project yang direplikasi dan project sumber. - Opsi 2: Gunakan kembali konfigurasi dengan
for_each
.
Opsi ini menawarkan lebih banyak penggunaan kembali kode jika setiap project tidak berbeda secara signifikan dan Anda ingin menerapkan perubahan ke semua project sekaligus.
Opsi 1: Buat salinan konfigurasi Terraform
Opsi ini menawarkan fleksibilitas paling besar terkait seberapa besar perbedaan antara project yang direplikasi dan project sumber, seperti memiliki aplikasi dengan nama tampilan yang berbeda dan peluncuran bertahap.
- Di root direktori
web
, buat file konfigurasi Terraform baru bernamamain_staging.tf
. - Salin semua blok resource dari file
main.tf
Anda (kecuali untuk blokterraform
danprovider
), lalu tempel ke filemain_staging.tf
Anda. - Kemudian, Anda perlu memodifikasi setiap blok resource yang direplikasi di
main_staging.tf
agar dapat berfungsi dengan project staging:- Label resource: Gunakan nama baru untuk menghindari konflik. Misalnya, ganti nama
resource "google_project" "default"
menjadiresource "google_project" "staging"
. - Referensi resource: Perbarui setiap referensi. Misalnya, update
google_firebase_project.default.project
menjadigoogle_firebase_project.staging.project
.
main_staging.tf
di repositori GitHub codelab ini:web/terraform-checkpoints/replicate-config/main_staging-copypaste.tf
Jika ingin menggunakan konfigurasi ini, pastikan Anda melakukan hal berikut:- Salin konfigurasi dari
main_staging-copypaste.tf
, lalu tempel ke filemain_staging.tf
Anda. - Di file
main_staging.tf
Anda, lakukan hal berikut:- Di blok resource
google_project
, perbarui atributname
, atributproject-id
, dan (jika Anda menyiapkan Authentication melalui Terraform) atributbilling_account
dengan nilai Anda sendiri. - Di blok resource
google_firebase_web_app
, perbarui atributdisplay_name
dengan nilai Anda sendiri. - Di blok resource
google_firestore_database
dangoogle_app_engine_application
, perbarui atributlocation_id
dengan nilai Anda sendiri.
- Di blok resource
# 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" }
- Label resource: Gunakan nama baru untuk menghindari konflik. Misalnya, ganti nama
- Jalankan
terraform apply
untuk menyediakan project Firebase "staging" baru Anda beserta semua resource-nya dan mengaktifkan layanannya. - Pastikan semuanya telah disediakan dan diaktifkan seperti yang diharapkan dengan memeriksanya di Firebase console seperti sebelumnya.
Opsi 2: Menggunakan kembali konfigurasi dengan for_each
Opsi ini menawarkan lebih banyak penggunaan ulang kode jika setiap project tidak memiliki perbedaan yang signifikan dan Anda ingin menerapkan perubahan ke semua project sekaligus. Class ini menggunakan argumen meta for_each
dalam bahasa Terraform.
- Buka file
main.tf
. - Ke setiap blok resource yang ingin direplikasi, tambahkan argumen meta
for_each
, seperti berikut:
main.tf
Anda dapat menemukan konfigurasi lengkap file# 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
yang menggunakan argumen metafor_each
dalam repositori GitHub codelab ini:web/terraform-checkpoints/replicate-config/main-foreach.tf
Jika ingin menggunakan konfigurasi ini, pastikan Anda melakukan hal berikut:- Salin konfigurasi dari
main-foreach.tf
, lalu tempel ke filemain.tf
Anda. - Di file
main.tf
Anda, lakukan hal berikut:- Di blok resource
google_project
, perbarui atributname
, atributproject-id
, dan (jika Anda menyiapkan Authentication melalui Terraform) atributbilling_account
dengan nilai Anda sendiri. - Di blok resource
google_firebase_web_app
, perbarui atributdisplay_name
dengan nilai Anda sendiri. - Di blok resource
google_firestore_database
dangoogle_app_engine_application
, perbarui atributlocation_id
dengan nilai Anda sendiri.
- Di blok resource
- Salin konfigurasi dari
- Daripada langsung menerapkan konfigurasi ini, penting untuk memahami dan memperbaiki beberapa hal tentang cara Terraform menafsirkan konfigurasi ini dibandingkan dengan infrastruktur yang ada.
- Saat ini, jika Anda menerapkan konfigurasi ini yang menggunakan
for_each
, alamat resource akan terlihat seperti berikut:
Namun, project yang sudah ada yang Anda buat di bagian pertama codelab ini dikenal oleh Terraform sebagai berikut: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
- Jalankan
terraform plan
untuk melihat tindakan yang akan diambil Terraform dengan mempertimbangkan status saat ini.
Output harus menunjukkan bahwa Terraform akan menghapus project yang Anda buat di bagian pertama codelab ini dan membuat dua project baru. Hal ini karena Terraform tidak mengetahui bahwa project di alamatgoogle_project.default
telah dipindahkan ke alamat barugoogle_project.default["prod"]
. - Untuk memperbaikinya, jalankan perintah
terraform state mv
:terraform state mv "google_project.default" "google_project.default[\"prod\"]"
- Demikian pula, untuk memperbaiki semua blok resource lainnya, jalankan
terraform state mv
untukgoogle_firebase_project
,google_firebase_web_app
, dan semua blok resource lainnya dalam filemain.tf
Anda. - Sekarang, jika Anda menjalankan
terraform plan
lagi, tampilan tersebut seharusnya tidak menunjukkan bahwa Terraform akan menghapus project yang Anda buat di bagian pertama codelab ini.
- Saat ini, jika Anda menerapkan konfigurasi ini yang menggunakan
- Jalankan
terraform apply
untuk menyediakan project Firebase "staging" baru Anda beserta semua resource-nya dan mengaktifkan layanannya. - Pastikan semuanya telah disediakan dan diaktifkan seperti yang diharapkan dengan memeriksanya di Firebase console seperti sebelumnya.
12. Langkah bonus: Deploy aplikasi staging dan produksi Anda
- Di codebase aplikasi Anda, ubah
firebase-config.js
untuk menggunakan konfigurasi Firebase dari project staging.
Untuk mengingatkan diri Anda sendiri cara mendapatkan konfigurasi Firebase dan menambahkannya ke aplikasi, lihat langkah awal codelab ini, Tambahkan konfigurasi Firebase ke aplikasi Anda. - Di root direktori
web
, jalankan perintah berikut untuk men-deploy aplikasi ke project Firebase staging.firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
- Buka aplikasi staging di browser melalui URL yang dicetak dalam output
firebase deploy
. Coba login, kirim pesan, dan upload gambar.
Saat Anda men-deploy aplikasi ke project Firebase, aplikasi tersebut menggunakan resource Firebase sungguhan, bukan resource yang diemulasi. Saat berinteraksi dengan aplikasi staging, Anda akan melihat data dan gambar muncul di project staging di Firebase console. - Setelah menguji aplikasi Anda dalam staging, ubah kembali
firebase-config.js
menggunakan konfigurasi Firebase project produksi (project pertama yang Anda buat di codelab ini). - Di root direktori
web
, jalankan perintah berikut untuk men-deploy aplikasi ke project Firebase produksi Anda.firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
- Buka aplikasi produksi di browser melalui URL yang dicetak dalam output
firebase deploy
. Coba login, kirim pesan, dan upload gambar.
Anda akan melihat data dan gambar muncul di project produksi di Firebase console. - Setelah selesai berinteraksi dengan kedua aplikasi untuk codelab ini, Anda dapat menghentikan Firebase menayangkannya. Jalankan perintah berikut untuk setiap project Anda:
firebase hosting:disable --project=<STAGING_PROJECT_ID>
firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
13. Selamat!
Anda telah menggunakan Terraform untuk mengonfigurasi aplikasi web chat real-time. Anda juga telah mengikuti praktik terbaik untuk lingkungan pengembangan dengan membuat project Firebase terpisah untuk staging dan produksi.
Yang telah kita bahas
- Menggunakan Terraform CLI untuk mengelola resource cloud
- Menggunakan Terraform untuk mengonfigurasi produk Firebase (Authentication, Firestore, Cloud Storage, dan Aturan Keamanan)
- Menjalankan dan menguji aplikasi web secara lokal menggunakan Firebase Local Emulator Suite
- Mengimpor Firebase ke aplikasi web
- Menggunakan Terraform untuk mereplikasi konfigurasi di beberapa lingkungan
Untuk mengetahui informasi lebih lanjut tentang Firebase dan Terraform, buka dokumentasi kami. Anda dapat menemukan daftar semua produk Firebase yang memiliki dukungan Terraform, contoh konfigurasi Terraform untuk kasus penggunaan umum, serta pemecahan masalah dan FAQ yang bermanfaat.