1. Pengantar
Sasaran
Anda dapat menggunakan Terraform untuk menyiapkan dan mengelola project Firebase, termasuk konfigurasi infrastruktur dan produk Firebase secara terprogram.
Codelab ini pertama-tama menjelaskan cara membuat file konfigurasi Terraform untuk membuat project Firebase baru, diikuti dengan cara mengonfigurasi aplikasi dan produk Firebase yang ingin Anda gunakan dalam project tersebut. Kami juga membahas dasar-dasar command line Terraform, seperti melihat pratinjau perubahan yang akan dilakukan, lalu menerapkannya.
Jika Anda ingin mempelajari cara menyiapkan dan mengelola project dan produk Firebase dengan Terraform, codelab ini cocok 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 memperbarui resource dan layanan Anda
- Cara menerapkan konfigurasi Anda di aplikasi web sungguhan (disebut Friendly Chat)
- Cara menentukan konfigurasi paralel (dan sinkron) di lingkungan yang berbeda (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 berhasil menyelesaikan codelab ini, Anda memerlukan kemahiran dasar dalam menggunakan Terraform dan terminologinya, termasuk prasyarat berikut:
- Instal Terraform dan pahami Terraform menggunakan tutorial resminya
Codelab ini menyediakan aplikasi contoh nyata sehingga Anda dapat menguji dan berinteraksi dengan apa yang Anda sediakan melalui Terraform. Untuk melakukannya, Anda memerlukan hal berikut:
- Contoh kode untuk aplikasi web - download kode ini di langkah berikutnya dalam codelab
- Pengelola paket npm (yang biasanya disertakan 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 Anda 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 operasi dari Terraform akan diperiksa kuotanya. 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 kedua penyiapan penyedia pada langkah berikutnya dalam codelab ini.
Lakukan 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", penting untuk diingat bahwa setiap project Firebase sebenarnya adalah project Google Cloud, hanya saja layanan Firebase diaktifkan untuk project tersebut.
Menambahkan blok untuk project dan API Google Cloud yang mendasarinya
- Pertama, sediakan project Google Cloud yang mendasarinya.
Tambahkan blok resource berikut ke file konfigurasimain.tf
Anda.
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
mengidentifikasi project Anda secara unik 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 perlu mengaktifkan API pokok 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
(tepat di bawah blok yang membuat project Cloud baru), tambahkan blok resource berikut:
main.tf Dengan mengaktifkan Service Usage API, project baru Anda akan dapat menerima pemeriksaan kuota. 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).
Menambahkan blok untuk mengaktifkan layanan Firebase
Hal terakhir yang diperlukan untuk "membuat project Firebase" adalah mengaktifkan layanan Firebase di project.
Lanjutkan di file konfigurasi main.tf
Anda, tambahkan blok resource berikut.
Seperti yang disebutkan di atas, perhatikan bahwa blok resource ini menggunakan penyedia dengan user_project_override
(tidak memerlukan 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,
]
}
Dalam blok resource di atas, Anda mungkin melihat klausa depends_on
, yang memberi tahu Terraform untuk menunggu hingga API pokok diaktifkan. Tanpa klausa ini, Terraform tidak mengetahui dependensi dan dapat 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 seharusnyaweb
):terraform apply
- Di terminal, Terraform mencetak rencana tindakan yang akan dilakukannya.
Jika semuanya terlihat seperti yang diharapkan, setujui tindakan 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 menerapkan, Anda dapat menggunakan perintah terraform plan
sebagai gantinya.
Memvalidasi perubahan
Setelah Terraform selesai berjalan, Anda dapat memeriksa status semua resource yang disediakan Terraform dan layanan yang diaktifkan dengan menjalankan perintah berikut:
terraform show
Berikut adalah contoh tampilan cetakan yang akan Anda lihat. Status Anda akan berisi nilai khusus untuk proyek 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 melalui Terraform
Untuk menggunakan Firebase, Anda harus mendaftarkan setiap varian platform aplikasi di project Firebase Anda. Dalam codelab ini, Anda akan menggunakan aplikasi sungguhan untuk menguji dan berinteraksi dengan apa yang Anda sediakan melalui Terraform. Aplikasi ini adalah aplikasi web, jadi Anda perlu memberi tahu Terraform untuk mendaftarkan Aplikasi Web Firebase di project Firebase yang baru dibuat.
Menambahkan blok untuk mendaftarkan aplikasi web
Untuk mendaftarkan aplikasi web di project Firebase, tambahkan blok resource berikut ke file main.tf
Anda.
Anda harus menentukan display_name
Anda 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
). 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 dalam fileterraform apply
.tf
dan melakukan perubahan apa pun yang ditemukannya. - Tinjau rencana tindakan yang dicetak. Jika semuanya sudah sesuai, 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
Autentikasi adalah bagian penting dari aplikasi apa pun. Untuk mengizinkan pengguna akhir login ke aplikasi web Anda dengan Akun Google mereka, Anda dapat mengaktifkan Firebase Authentication dan menyiapkan metode login dengan Google.
Perhatikan bahwa dalam codelab ini, kami memberikan dua opsi berbeda untuk menyiapkan Firebase Authentication:
- Opsi 1 (Direkomendasikan): Siapkan Firebase Authentication di konsol, yang tidak memerlukan GCIP.
- Menggunakan opsi ini berarti Anda tidak perlu mengaitkan project baru dengan akun Penagihan Cloud.
- Opsi 2: Siapkan Firebase Authentication melalui Terraform menggunakan Google Cloud Identity Platform (GCIP) API.
- Jika menggunakan opsi ini, 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 harus menggunakan paket harga Blaze.
Berikut cara menyiapkan Firebase Authentication dan login dengan Google:
- Di Firebase console, temukan bagian Build di panel kiri.
- Klik Authentication, klik Get started, lalu klik tab Sign-in method (atau klik di sini untuk langsung membukanya).
- Klik Tambahkan penyedia baru, lalu pilih Google dari bagian Penyedia tambahan.
- Aktifkan tombol Aktifkan.
- Tetapkan nama aplikasi yang ditampilkan kepada publik menjadi sesuatu seperti
FriendlyChat
(nama ini tidak harus unik secara global). - Pilih Project support email dari menu dropdown, lalu klik Simpan.
- Anda akan melihat Google sebagai penyedia login yang diaktifkan.
Opsi 2: Menyiapkan Autentikasi melalui Terraform menggunakan Google Cloud Identity Platform (GCIP) API
Untuk menyiapkan Firebase Authentication melalui Terraform, Anda harus menggunakan GCIP API, yang berarti project harus menggunakan paket harga Blaze. Anda mengupgrade project Firebase untuk menggunakan paket Blaze dengan mengaitkan akun Penagihan Cloud dengan project.
Mengaktifkan penagihan melalui Terraform
- Jika Anda belum memiliki akun Penagihan Cloud, langkah pertama adalah membuat akun baru di Konsol Google Cloud. Saat Anda melakukannya, catat ID akun penagihan-nya. ID Akun penagihan dapat ditemukan di halaman Penagihan 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
Anda 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 ID klien untuk project ini, Anda perlu mengonfigurasi layar izin OAuth.
- Buka halaman Layar persetujuan OAuth, lalu pilih project yang baru saja Anda buat.
- Tetapkan User Type ke External, lalu klik Create.
- Di layar berikutnya, lengkapi hal berikut, lalu klik Simpan dan lanjutkan.
- Tetapkan Nama aplikasi yang ditampilkan kepada publik untuk aplikasi Anda menjadi seperti
FriendlyChat
(nama ini tidak harus unik secara global). - Pilih Email dukungan pengguna dari menu dropdown.
- Masukkan email untuk Informasi kontak developer.
- Tetapkan Nama aplikasi yang ditampilkan kepada publik untuk aplikasi Anda menjadi seperti
- Di layar berikutnya, selesaikan langkah-langkah berikut:
- Terima nilai default di halaman Cakupan, lalu klik Simpan dan Lanjutkan.
- Terima nilai default di halaman Pengguna uji, lalu klik Simpan dan Lanjutkan.
- Tinjau ringkasan, lalu klik Kembali ke dasbor.
- Siapkan klien OAuth di halaman Kredensial 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
(nama ini tidak harus unik secara global). - Izinkan URL aplikasi Anda menggunakan klien OAuth ini, dengan menetapkan hal berikut:
- Di bagian Authorized JavaScript origins, klik Add URI, lalu masukkan
https://<PROJECT_ID>.firebaseapp.com
, dengan<PROJECT_ID>
adalah project ID yang Anda tetapkan dimain.tf
. - Di bagian URI pengalihan yang diberi otorisasi, klik Tambahkan URI, lalu masukkan
https://<PROJECT_ID>.firebaseapp.com/__/auth/handler
, dengan<PROJECT_ID>
adalah ID project yang Anda tetapkan dimain.tf
.
- Di bagian Authorized JavaScript origins, klik Add URI, lalu masukkan
- Klik Save.
- Untuk mengaktifkan login dengan Google menggunakan client ID dan rahasia klien OAuth Anda, tambahkan blok berikut ke file
main.tf
Anda:
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 Autentikasi 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>"
Perhatikan bahwa menjalankanterraform apply
terraform apply
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
. Kemudian, alat ini akan membuat perubahan apa pun yang ditemukannya. - Tinjau rencana tindakan yang dicetak. Jika semuanya sudah sesuai, ketik
yes
, lalu tekan Enter untuk menyetujui tindakan.
Memvalidasi perubahan
- Di Firebase console, temukan 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 antar-pengguna akhir dalam database Firestore.
- Untuk mengaktifkan API yang diperlukan dan menyediakan instance database, tambahkan blok resource berikut ke file
main.tf
Anda:
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 database berada.
Saat mengembangkan aplikasi produksi, sebaiknya pilih 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 dengan Anda (lihat lokasi Cloud Firestore). - Setiap instance database Firestore yang dapat diakses oleh Firebase harus dilindungi oleh Aturan Keamanan Firebase.
Kode contoh codelab ini menyediakan serangkaian aturan Firestore yang aman dalam filefirestore.rules
, yang dapat Anda temukan di root direktoriweb
. - Tambahkan blok resource berikut ke file
main.tf
Anda untuk melakukan hal berikut:- Buat kumpulan aturan Aturan Keamanan Firebase dari file
firestore.rules
lokal. - Rilis set 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. - Pastikan database telah disediakan dan aturan keamanannya di-deploy:
- Di Firebase console, temukan 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 antar-pengguna akhir dalam bucket Cloud Storage.
- Untuk mengaktifkan API yang diperlukan dan menyediakan bucket default Cloud Storage, tambahkan file
main.tf
Anda 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 mengetahui informasi selengkapnya.
Jika Anda menginginkan beberapa bucket dalam project, sediakan bucket tersebut 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 oleh Firebase harus dilindungi oleh Aturan Keamanan Firebase.
Kode contoh codelab ini menyediakan serangkaian aturan Firestore yang aman dalam filestorage.rules
, yang dapat Anda temukan di root direktoriweb
. - Tambahkan blok resource berikut ke file
main.tf
Anda untuk melakukan hal berikut:- Buat kumpulan aturan Aturan Keamanan Firebase dari file lokal.
- Rilis ruleset 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. - Pastikan bucket disediakan dan aturan keamanannya di-deploy:
- Di Firebase console, temukan 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 Anda di URL lokal yang ditampilkan oleh CLI (biasanya
http://localhost:5000
).
Anda akan melihat UI aplikasi FriendlyChat, yang belum (masih!) berfungsi. Aplikasi belum terhubung ke Firebase, tetapi dengan menyelesaikan langkah-langkah berikutnya dalam codelab ini, aplikasi akan terhubung.
Perhatikan bahwa setiap kali Anda membuat perubahan pada aplikasi web (seperti yang akan Anda lakukan pada langkah-langkah berikut dalam codelab ini), muat ulang browser 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 berupa 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 sudah dilakukan.
Meskipun kode contoh sebagian besar sudah selesai, Anda masih perlu melakukan beberapa hal agar aplikasi Anda berjalan, termasuk: menginstal Firebase SDK, memulai build, menambahkan konfigurasi Firebase ke aplikasi, dan terakhir menginisialisasi 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 memperbarui dependensi. - Jalankan
npm run start
untuk memulai webpack.
Untuk bagian codelab lainnya, webpack kini akan terus membangun ulang kode sumber Anda.
Menambahkan konfigurasi Firebase ke aplikasi Anda
Anda juga perlu menambahkan konfigurasi Firebase ke aplikasi agar Firebase SDK mengetahui project Firebase mana yang ingin Anda gunakan.
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 config.
- Tempelkan konfigurasi Anda ke file
web/src/firebase-config.js
aplikasi, seperti berikut:
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 mengubah infrastruktur dengan cara apa pun, Anda hanya perlu menjalankan perintah berikut.- Untuk memuat konfigurasi Firebase aplikasi web Anda ke status Terraform direktori Anda, jalankan perintah ini:
terraform refresh
- Untuk mencetak nilai konfigurasi Firebase, jalankan perintah ini:
Berikut adalah contoh output konfigurasi. Output yang dicetak akan berisi nilai project dan aplikasi Anda.terraform output –json
{ "friendlychat_web_app_config": { "sensitive": false, "type": [ "object", { "apiKey": "string", "appId": "string", "authDomain": "string", "measurementId": "string", "messagingSenderId": "string", "projectId": "string", "storageBucket": "string" } ], "value": { "apiKey": "<API_KEY>", "appId": "<APP_ID>", "authDomain": "<PROJECT_ID>.firebaseapp.com", "measurementId": "<G-MEASUREMENT_ID>", "messagingSenderId": "<SENDER_ID>", "projectId": "<PROJECT_ID>", "storageBucket": "<PROJECT_ID>.appspot.com" } } }
- Untuk memuat konfigurasi Firebase aplikasi web Anda ke status Terraform direktori Anda, jalankan perintah ini:
- Salin nilai dari dalam peta
value
. - Tempel nilai ini (konfigurasi Anda) ke file
web/src/firebase-config.js
aplikasi Anda, seperti berikut:
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.
- Muat ulang browser yang menayangkan aplikasi Anda.
- Sekarang Anda dapat login dengan Google dan mulai memposting pesan ke dalam chat. Jika memiliki file gambar, Anda bahkan dapat menguploadnya.
11. Mereplikasi konfigurasi Anda di berbagai lingkungan
Terraform unggul dalam mengelola beberapa infrastruktur yang dikonfigurasi serupa (misalnya, menyiapkan project Firebase staging yang serupa dengan project produksi).
Dalam codelab ini, Anda akan membuat project Firebase kedua sebagai lingkungan staging.
Untuk mereplikasi konfigurasi yang ada guna membuat project penyiapan ini, Anda memiliki dua opsi:
- Opsi 1: Buat salinan konfigurasi Terraform.
Opsi ini menawarkan fleksibilitas terbesar untuk seberapa besar project yang direplikasi dapat berbeda dari project sumber. - Opsi 2: Menggunakan kembali konfigurasi dengan
for_each
.
Opsi ini menawarkan lebih banyak penggunaan ulang kode jika setiap project tidak boleh berbeda secara signifikan dan Anda ingin menyebarkan perubahan ke semua project sekaligus.
Opsi 1: Buat salinan konfigurasi Terraform
Opsi ini menawarkan fleksibilitas terbesar untuk seberapa besar project yang direplikasi dapat berbeda dari project sumber, seperti memiliki aplikasi dengan nama tampilan dan peluncuran bertahap yang berbeda.
- Di root direktori
web
, buat file konfigurasi Terraform baru bernamamain_staging.tf
. - Salin semua blok resource dari file
main.tf
Anda (kecuali blokterraform
danprovider
), lalu tempelkan ke filemain_staging.tf
Anda. - Kemudian, Anda perlu mengubah setiap blok resource yang direplikasi di
main_staging.tf
agar berfungsi dengan project penyiapan:- 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, perbarui
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 tempelkan ke filemain_staging.tf
Anda. - Dalam file
main_staging.tf
Anda, lakukan hal berikut:- Di blok resource
google_project
, perbarui atributname
, atributproject-id
, dan (jika Anda menyiapkan Authentication via 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 dan semua resource-nya serta 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 boleh berbeda secara signifikan dan Anda ingin menyebarkan perubahan ke semua project sekaligus. Hal ini menggunakan meta-argumen for_each
dalam bahasa Terraform.
- Buka file
main.tf
. - Ke setiap blok resource yang ingin Anda replikasi, 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 meta-argumenfor_each
di 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 tempelkan ke filemain.tf
Anda. - Dalam file
main.tf
Anda, lakukan hal berikut:- Di blok resource
google_project
, perbarui atributname
, atributproject-id
, dan (jika Anda menyiapkan Authentication via 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 menerapkan konfigurasi ini secara langsung, penting untuk memahami dan memperbaiki beberapa hal tentang cara Terraform menafsirkan konfigurasi ini dibandingkan dengan infrastruktur yang ada.
- Saat ini, jika Anda menerapkan konfigurasi yang menggunakan
for_each
ini, 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 dilakukan Terraform berdasarkan status saat ini.
Output akan 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, Terraform tidak akan menghapus project yang Anda buat di bagian pertama codelab ini.
- Saat ini, jika Anda menerapkan konfigurasi yang menggunakan
- Jalankan
terraform apply
untuk menyediakan project Firebase "staging" baru dan semua resource-nya serta 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, ubah
firebase-config.js
untuk menggunakan konfigurasi Firebase dari project staging Anda.
Untuk mengingatkan diri Anda tentang cara mendapatkan konfigurasi Firebase dan menambahkannya ke aplikasi, lihat langkah sebelumnya dalam codelab ini, Tambahkan konfigurasi Firebase ke aplikasi Anda. - Di root direktori
web
, jalankan perintah berikut untuk men-deploy aplikasi ke project Firebase staging Anda.firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
- Buka aplikasi pementasan 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 akan menggunakan resource Firebase sungguhan, bukan resource yang diemulasi. Saat berinteraksi dengan aplikasi penyiapan, Anda akan melihat data dan gambar muncul di project penyiapan di Firebase console. - Setelah menguji aplikasi di staging, ubah
firebase-config.js
kembali ke penggunaan konfigurasi Firebase project prod (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 Anda 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 Anda di Firebase console. - Setelah selesai berinteraksi dengan kedua aplikasi untuk codelab ini, Anda dapat menghentikan Firebase agar tidak 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. Selain itu, Anda 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 selengkapnya tentang Firebase dan Terraform, buka dokumentasi kami. Anda dapat menemukan daftar semua produk Firebase yang mendukung Terraform, contoh konfigurasi Terraform untuk kasus penggunaan umum, serta pemecahan masalah dan FAQ yang bermanfaat.