1. Pengantar
Sasaran
Anda dapat menggunakan Terraform untuk menyiapkan dan mengelola project Firebase, termasuk konfigurasi infrastruktur terprogram dan produk Firebase.
Codelab ini pertama menjelaskan cara membangun 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 dibuat, 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 CLI Terraform untuk mengelola infrastruktur
- Cara mengubah konfigurasi untuk mengupdate resource dan layanan
- Cara menerapkan konfigurasi Anda di aplikasi web sungguhan (disebut Friendly Chat)
- Cara menentukan konfigurasi paralel (dan sinkron) 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 berhasil menyelesaikan codelab ini, Anda memerlukan kecakapan dasar dalam Terraform dan terminologinya, termasuk prasyarat berikut:
- Instal Terraform dan pelajari Terraform melalui tutorial resminya
Codelab ini menyediakan aplikasi contoh yang sebenarnya sehingga Anda dapat menguji dan berinteraksi dengan apa yang Anda sediakan melalui Terraform. Untuk melakukannya, Anda memerlukan hal berikut:
- Kode contoh untuk aplikasi web - download kode ini pada langkah codelab berikutnya
- 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 dapat 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 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 antara dua penyiapan penyedia di langkah berikutnya dalam 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", penting untuk diingat bahwa setiap project Firebase sebenarnya adalah project Google Cloud, hanya dengan layanan Firebase yang diaktifkan.
Menambahkan blok untuk project dan API Google Cloud yang mendasarinya
- Pertama, sediakan project Google Cloud yang mendasarinya.
Pada file konfigurasimain.tf
, tambahkan blok resource berikut.
Anda harus menentukan nama project 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 perlu 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 harus 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 perlu alias).
Menambahkan blok untuk mengaktifkan layanan Firebase
Hal terakhir yang diperlukan untuk "membuat project Firebase" adalah mengaktifkan layanan Firebase di project.
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 diperlukan 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 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 akan 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 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 yang akan Anda lihat dicetak. Status Anda akan berisi nilai spesifik 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 telah dibuat dengan melihatnya di Firebase console.
5. Mendaftarkan aplikasi Firebase melalui Terraform
Untuk menggunakan Firebase, Anda harus mendaftarkan setiap varian platform aplikasi Anda di project Firebase. 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 dalam project Firebase yang baru dibuat.
Menambahkan blok untuk mendaftarkan aplikasi web
Untuk mendaftarkan aplikasi web di project Firebase, tambahkan file main.tf
dengan blok resource berikut.
Anda perlu 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 dalam file.tf
dan membuat perubahan apa pun 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
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 menyediakan dua opsi berbeda untuk menyiapkan Firebase Authentication:
- Opsi 1 (Direkomendasikan): Siapkan Firebase Authentication di konsol, yang tidak memerlukan GCIP.
- Dengan menggunakan opsi ini, Anda tidak perlu mengaitkan project baru dengan akun Penagihan Cloud.
- Opsi 2: Siapkan 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 mewajibkan 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, temukan bagian Build di panel kiri.
- Klik Autentikasi, klik Mulai, lalu klik tab Metode login (atau klik di sini untuk langsung membukanya).
- Klik Tambahkan penyedia baru, lalu dari bagian Penyedia tambahan, pilih Google.
- Aktifkan tombol Aktifkan.
- Tetapkan nama aplikasi yang ditampilkan kepada publik ke sesuatu seperti
FriendlyChat
(nama ini tidak harus unik secara global). - Pilih Email dukungan project dari menu dropdown, lalu klik Simpan.
- 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 untuk menggunakan paket Blaze dengan mengaitkan akun Penagihan Cloud dengan project.
Mengaktifkan penagihan melalui Terraform
- Jika Anda belum memiliki akun Layanan Penagihan Cloud, langkah pertamanya adalah membuat akun baru di Konsol Google Cloud. Saat Anda melakukannya, catat ID Akun penagihannya. 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, ] }
- Untuk mengaktifkan login dengan Google, Anda harus 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 Jenis Pengguna ke Eksternal, lalu klik Buat.
- Di layar berikutnya, selesaikan langkah-langkah berikut, lalu klik Simpan dan lanjutkan.
- Tetapkan Nama aplikasi aplikasi Anda yang ditampilkan kepada publik menjadi sesuatu seperti
FriendlyChat
(tidak perlu unik secara global). - Pilih Email dukungan pengguna dari menu dropdown.
- Masukkan email untuk Informasi kontak developer.
- Tetapkan Nama aplikasi aplikasi Anda yang ditampilkan kepada publik menjadi sesuatu seperti
- Pada layar berikutnya, selesaikan langkah-langkah berikut:
- Terima setelan default di halaman Cakupan, lalu klik Simpan dan Lanjutkan.
- Terima 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 Create credentials, lalu pilih OAuth client ID.
- Dari drop-down Application type, pilih Web application.
- 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 Asal JavaScript resmi, klik Tambahkan URI, lalu masukkan
https://<PROJECT_ID>.firebaseapp.com
, dengan<PROJECT_ID>
adalah ID project yang Anda tetapkan dimain.tf
. - Di bagian Authorized redirect URIs, klik Add URI dan masukkan
https://<PROJECT_ID>.firebaseapp.com/__/auth/handler
, dengan<PROJECT_ID>
adalah project ID yang Anda tetapkan dimain.tf
.
- Di bagian Asal JavaScript resmi, klik Tambahkan URI, lalu masukkan
- Klik Save.
- Untuk mengaktifkan login dengan Google menggunakan client ID OAuth dan rahasia klien, tambahkan file
main.tf
Anda 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 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>"
terraform apply
Perhatikan bahwa menjalankanterraform 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 ditemukan. - 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 Autentikasi, lalu klik tab Metode login (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 dalam 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 database berada.
Saat mengembangkan aplikasi produksi, sebaiknya tempatkan aplikasi 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 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 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. - Pastikan database telah disediakan dan aturan keamanannya telah 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 di antara pengguna akhir dalam 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, penyediakan 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 kumpulan aturan Firestore yang aman dalam filestorage.rules
, yang dapat Anda temukan di root direktoriweb
. - Tambahkan file
main.tf
Anda dengan blok resource berikut untuk melakukan hal berikut:- Buat kumpulan aturan Aturan Keamanan Firebase dari file lokal.
- Merilis 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. - 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
Kini 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 belum terhubung ke Firebase, tetapi dengan menyelesaikan langkah-langkah berikutnya di codelab ini, aplikasi akan terhubung.
Perhatikan bahwa setiap kali Anda membuat perubahan pada aplikasi web (seperti yang akan Anda lakukan pada 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 berfungsi dengan Firebase, aplikasi Anda memerlukan Firebase SDK dan konfigurasi Firebase untuk project Firebase.
Kode contoh untuk codelab ini sudah merupakan aplikasi yang berfungsi dengan semua dependensi dan fungsi yang diperlukan untuk menggunakan berbagai produk Firebase di aplikasi. Anda dapat melihat web/package.json
dan web/src/index.js
jika ingin mengetahui hal yang telah dilakukan.
Meskipun sebagian besar kode contoh sudah lengkap, 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.
Menginstal Firebase SDK dan memulai build webpack
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 mem-build ulang kode sumber Anda.
Menambahkan konfigurasi Firebase ke aplikasi
Anda juga perlu menambahkan konfigurasi Firebase ke aplikasi agar Firebase SDK mengetahui project Firebase yang Anda inginkan untuk digunakan oleh mereka.
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 dalam file
web/src/firebase-config.js
aplikasi, seperti ini:
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
danoutput
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 direktori Anda, jalankan perintah ini:
terraform refresh
- Untuk mencetak nilai konfigurasi Firebase, jalankan perintah ini:
terraform output –json
Berikut adalah contoh output konfigurasi. Hasil cetak akan berisi nilai project dan aplikasi 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 direktori Anda, jalankan perintah ini:
- Salin nilai dari dalam peta
value
. - Tempelkan nilai ini (konfigurasi Anda) ke dalam file
web/src/firebase-config.js
aplikasi, 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
Sekarang setelah semuanya dikonfigurasi untuk Firebase, Anda dapat mencoba aplikasi web fungsional Anda.
- Muat ulang browser yang menayangkan aplikasi Anda.
- Sekarang Anda dapat login dengan Google dan mulai memposting pesan ke chat. Jika memiliki file gambar, Anda bahkan dapat menguploadnya.
11. Mereplikasi konfigurasi Anda di seluruh lingkungan
Terraform unggul 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 sebagai 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 terbesar terkait seberapa besar perbedaan antara project replika dan project sumber. - Opsi 2: Menggunakan kembali konfigurasi dengan
for_each
.
Opsi ini menawarkan lebih banyak penggunaan kembali 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 paling besar untuk seberapa banyak 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
(kecuali blokterraform
danprovider
), lalu tempelkan ke dalam filemain_staging.tf
. - Anda kemudian perlu memodifikasi setiap blok resource replika di
main_staging.tf
agar dapat berfungsi dengan project staging Anda:- 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
kegoogle_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. - Di file
main_staging.tf
Anda, lakukan hal berikut:- Di blok resource
google_project
, perbarui atributname
, atributproject-id
, dan (jika Anda menyiapkan Autentikasi 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 "staging" baru Project Firebase 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 kembali kode jika setiap project tidak akan berbeda secara signifikan dan Anda ingin menerapkan perubahan ke semua project sekaligus. Fungsi ini menggunakan argumen meta for_each
dalam bahasa Terraform.
- Buka file
main.tf
. - Tambahkan meta-argumen
for_each
ke setiap blok resource yang ingin direplikasi, seperti ini:
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. - Di file
main.tf
Anda, lakukan hal berikut:- Di blok resource
google_project
, perbarui atributname
, atributproject-id
, dan (jika Anda menyiapkan Autentikasi 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, sebaiknya pahami dan perbaiki 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 ada yang Anda buat di bagian pertama codelab ini diketahui 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 menampilkan 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 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, ubah
firebase-config.js
untuk menggunakan konfigurasi Firebase dari project staging Anda.
Untuk mengingat cara mendapatkan konfigurasi Firebase dan menambahkannya ke aplikasi, lihat langkah sebelumnya di codelab ini, Menambahkan konfigurasi Firebase ke aplikasi. - Di root direktori
web
Anda, 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
agar menggunakan konfigurasi Firebase project produksi (project pertama yang Anda buat di codelab ini). - Di root direktori
web
Anda, jalankan perintah berikut untuk men-deploy aplikasi ke project Firebase produksi.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 tersebut untuk codelab ini, Anda dapat menghentikan Firebase agar tidak menyajikannya. 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. Dan 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 Security Rules)
- 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 dengan dukungan Terraform, contoh konfigurasi Terraform untuk kasus penggunaan umum, serta pemecahan masalah dan FAQ yang bermanfaat.