Tutorial ini menjelaskan cara mengelola infrastruktur sebagai kode dengan Terraform dan Cloud Build menggunakan metodologi GitOps yang populer. Istilah GitOps pertama kali diciptakan oleh Weaveworks, dan konsep utamanya adalah menggunakan repositori Git untuk menyimpan status lingkungan yang Anda inginkan. Terraform adalah alat open source HashiCorp yang memungkinkan Anda membuat, mengubah, dan meningkatkan infrastruktur cloud secara tepat menggunakan kode. Dalam tutorial ini, Anda menggunakan Cloud Build, layanan continuous integration, untuk menerapkan manifes Terraform secara otomatis ke lingkungan Anda. Google Cloud
Tutorial ini ditujukan bagi developer dan operator yang mencari strategi elegan untuk membuat perubahan pada infrastruktur yang dapat diprediksi. Artikel ini mengasumsikan bahwa Anda sudah memahami Google Cloud, dan Linux.
Laporan State of DevOps mengidentifikasi kemampuan yang mendorong performa pengiriman software. Tutorial ini akan membantu Anda dengan kemampuan berikut:
Arsitektur
Tutorial ini menerapkan praktik GitOps untuk mengelola eksekusi Terraform. Perhatikan
bahwa metode ini menggunakan cabang Secure Source Manager dev
dan prod
untuk mewakili
lingkungan yang sebenarnya. Lingkungan ini ditentukan oleh
jaringan Virtual Private Cloud (VPC) dev
dan prod
, masing-masing, dalam
projectGoogle Cloud .
Proses ini dimulai saat Anda mengirim kode Terraform ke cabang dev
atau prod
. Dalam skenario ini, Cloud Build akan memicu, lalu menerapkan manifes Terraform untuk mencapai status yang Anda inginkan di lingkungannya masing-masing.
Di sisi lain, saat Anda mengirim kode Terraform ke cabang lain—misalnya, ke cabang fitur—Cloud Build akan beroperasi untuk menjalankan terraform plan
, tetapi tidak ada yang diterapkan ke lingkungan apa pun.
Idealnya, developer atau operator harus membuat proposal infrastruktur ke cabang pengembangan atau fitur, lalu mengirimkannya melalui permintaan pull. Dengan cara ini, Anda dapat membahas dan meninjau potensi perubahan dengan kolaborator dan menambahkan commit tindak lanjut sebelum perubahan digabungkan ke cabang dasar.
Jika tidak ada masalah yang diajukan, Anda harus menggabungkan perubahan ke cabang
dev
terlebih dahulu. Penggabungan ini memicu deployment infrastruktur ke lingkungan dev
, sehingga Anda dapat menguji lingkungan ini. Setelah menguji dan yakin dengan apa yang di-deploy, Anda harus menggabungkan cabang dev
ke cabang prod
untuk memicu penginstalan infrastruktur ke lingkungan produksi.
Tujuan
- Siapkan instance dan repositori Secure Source Manager Anda.
- Konfigurasi Terraform untuk menyimpan status di bucket Cloud Storage.
- Berikan izin ke akun layanan Cloud Build Anda.
- Hubungkan Cloud Build ke repositori Secure Source Manager Anda.
- Ubah konfigurasi lingkungan Anda di cabang fitur.
- Dorong perubahan pada lingkungan pengembangan.
- Mendorong perubahan pada lingkungan produksi.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Di Cloud Shell, dapatkan ID project yang baru saja Anda pilih:
Jika perintah ini tidak menampilkan project ID, konfigurasikan Cloud Shell untuk menggunakan project Anda. Gantigcloud config get-value project
PROJECT_ID
dengan project ID Anda.gcloud config set project PROJECT_ID
- Aktifkan API yang diperlukan:
Langkah ini mungkin memerlukan waktu beberapa menit hingga selesai.gcloud services enable cloudbuild.googleapis.com compute.googleapis.com securesourcemanager.googleapis.com
- Jika Anda belum pernah menggunakan Git di Cloud Shell, konfigurasikan dengan nama dan alamat email Anda:
Git menggunakan informasi ini untuk mengidentifikasi Anda sebagai penulis commit yang Anda buat di Cloud Shell.git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_NAME"
- Cabang
dev
berisi perubahan terbaru yang diterapkan ke lingkungan pengembangan. - Cabang
prod
berisi perubahan terbaru yang diterapkan ke lingkungan produksi. - Cabang fitur yang mirip dengan
feature_x
digunakan untuk melakukan perubahan sebelum melakukan push ke cabangdev
atauprod
. - Buat repositori Secure Source Manager kosong - jangan lakukan inisialisasi repositori.
Tambahkan helper autentikasi Secure Source Manager ke
git config
global Anda dengan menjalankan perintah berikut:git config --global credential.'https://*.*.sourcemanager.dev'.helper gcloud.sh
Helper autentikasi menggunakan gcloud CLI untuk mengambil kredensialGoogle Cloud Anda saat menggunakan perintah Git dengan Secure Source Manager.
Untuk melakukan autentikasi ulang setelah penyiapan kredensial awal, jalankan perintah gcloud CLI berikut:
gcloud auth login
Clone repositori solutions-terraform-cloudbuild-gitops ke shell lokal atau lingkungan kerja Anda:
git clone https://github.com/GoogleCloudPlatform/solutions-terraform-cloudbuild-gitops.git
Tambahkan repositori Secure Source Manager Anda sebagai upstream.
git remote add google HTTPS_REPO_URL
Dengan
HTTPS_REP_URL
adalah URL HTTPS untuk repositori Secure Source Manager Anda. Anda dapat menemukan URL di bagian atas halaman repositori di antarmuka web Secure Source Manager.Buat dan beralih ke cabang
dev
Anda.git checkout dev
Kirim repositori yang di-clone ke repositori Anda dengan perintah berikut:
git push -u google --all
Ulangi dua langkah sebelumnya untuk cabang
prod
Anda.Folder
environments/
berisi subfolder yang merepresentasikan lingkungan, sepertidev
danprod
, yang masing-masing memberikan pemisahan logis antara workload pada berbagai tahap kematangan, pengembangan, dan produksi. Meskipun memiliki lingkungan yang semirip mungkin dengan ini merupakan praktik yang baik, setiap subfolder memiliki konfigurasi Terraform-nya sendiri untuk memastikan bahwa lingkungan tersebut dapat memiliki setelan unik sesuai kebutuhan.Folder
modules/
berisi modul Terraform inline. Modul ini mewakili pengelompokan logis resource terkait dan digunakan untuk berbagi kode di berbagai lingkungan.File
cloudbuild.yaml
adalah file konfigurasi build yang berisi petunjuk untuk Cloud Build, seperti cara menjalankan tugas berdasarkan serangkaian langkah. File ini menentukan eksekusi bersyarat yang bergantung pada cabang yang digunakan Cloud Build untuk mengambil kode, misalnya:Untuk cabang
dev
danprod
, langkah-langkah berikut dijalankan:terraform init
terraform plan
terraform apply
Untuk cabang lain, langkah-langkah berikut dijalankan:
terraform init
untuk semua subfolderenvironments
terraform plan
untuk semua subfolderenvironments
- Tambahkan langkah untuk meng-clone repositori Anda.
- Tambahkan langkah untuk mendapatkan nama cabang dan tetapkan ke variabel.
Pindah ke cabang
dev
:git checkout dev
Buka file
cloudbuild.yaml
dan ganti isinya dengan kode berikut:# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. steps: - id: 'clone repository' name: 'gcr.io/cloud-builders/git' args: - clone - '${_REPO_URL}' - . - id: 'branch name' name: gcr.io/cloud-builders/git entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") git checkout ${branch} echo "***********************" git branch --show-current echo "***********************" - id: 'tf init' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform init else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFORM INIT ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform init || exit 1 cd ../../ done fi - id: 'tf plan' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform plan else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFOM PLAN ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform plan || exit 1 cd ../../ done fi - id: 'tf apply' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform apply -auto-approve else echo "***************************** SKIPPING APPLYING *******************************" echo "Branch '${branch}' does not represent an official environment." echo "*******************************************************************************" fi
Periksa apakah file telah diubah.
git status
Commit dan kirim perubahan Anda:
git add --all git commit -m "Modify build config file." git push google dev
Buka permintaan pull untuk mempromosikan perubahan Anda dengan cepat ke cabang
prod
.- Di antarmuka web Secure Source Manager, buka repositori Anda.
- Klik tab Pull requests.
- Klik New pull request.
- Di kolom merge into:, pilih cabang
prod
. - Di kolom pull from:, pilih cabang
dev
. - Tinjau perubahan, lalu klik New pull request.
- Klik Create pull request.
- Klik Merge pull request.
Klik Merge pull request lagi.
Perubahan akan digabungkan ke cabang
prod
Anda.
Di Cloud Shell, buat bucket Cloud Storage.
PROJECT_ID=$(gcloud config get-value project) gcloud storage buckets create gs://${PROJECT_ID}-tfstate
Aktifkan Pembuatan Versi Objek untuk menyimpan histori deployment Anda:
gcloud storage buckets update gs://${PROJECT_ID}-tfstate --versioning
Mengaktifkan Pembuatan Versi Objek akan meningkatkan biaya penyimpanan, yang dapat Anda kurangi dengan mengonfigurasi Object Lifecycle Management untuk menghapus versi status sebelumnya.
Buat cabang
cloud-storage-bucket
baru untuk melakukan perubahan:cd ~/solutions-terraform-cloudbuild-gitops git checkout -b cloud-storage-bucket
Ganti placeholder
PROJECT_ID
dengan ID project di fileterraform.tfvars
danbackend.tf
:sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
Di OS X atau macOS, Anda mungkin perlu menambahkan dua tanda kutip (
""
) setelahsed -i
, sebagai berikut:sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
Periksa apakah semua file telah diperbarui:
git status
Outputnya akan terlihat seperti ini:
On branch cloud-storage-bucket Changes not staged for commit: (use "git add
..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: environments/dev/backend.tf modified: environments/dev/terraform.tfvars modified: environments/prod/backend.tf modified: environments/prod/terraform.tfvars no changes added to commit (use "git add" and/or "git commit -a") Commit dan kirim perubahan Anda:
git add --all git commit -m "Update project IDs and buckets" git push google -u cloud-storage-bucket
Cabang
cloud-storage-bucket
baru Anda dikirim ke repositori Anda.Gabungkan perubahan
cloud-storage-bucket
ke dalam cabangdev
danprod
dengan membuka dan mengirimkan permintaan penggabungan untuk setiap cabang.Untuk menemukan email akun layanan Cloud Build, dari halaman Cloud Build, buka Settings.
Salin nilai Email akun layanan.
Berikan akses yang diperlukan ke akun layanan Cloud Build Anda:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:CLOUDBUILD_SA --role roles/editor
Ganti kode berikut:
- PROJECT_ID dengan ID project Anda.
- CLOUDBUILD_SA dengan email akun layanan Cloud Build.
Aktifkan dan siapkan Cloud Build di project Anda.
Buka halaman Pemicu di konsol Google Cloud .
Pilih project Anda dari menu drop-down pemilih project di bagian atas halaman.
Klik Buka.
Klik Create trigger.
Masukkan setelan pemicu berikut:
Nama:
trigger-on-push
Region: pilih region untuk pemicu Anda. Jika file konfigurasi build yang terkait dengan pemicu Anda menentukan private pool, region yang Anda pilih untuk pemicu harus cocok dengan region private pool.
Jika Anda memilih
global
sebagai region, Cloud Build akan menggunakan region yang ditentukan dalam file konfigurasi build untuk menjalankan build Anda. Ini dapat berupa region kumpulan pribadi, jika Anda menentukan kumpulan pribadi dalam file konfigurasi build, atau kumpulan default global jika Anda tidak menentukan kumpulan pribadi.Deskripsi (opsional): Masukkan deskripsi untuk pemicu Anda.
Peristiwa: Pilih Peristiwa webhook sebagai peristiwa repositori untuk memanggil pemicu.
Jika Secret Manager belum diinstal, Anda akan diminta untuk mengaktifkan Secret Manager.
URL Webhook: pilih salah satu opsi berikut:
- Gunakan secret baru jika Anda ingin membuat secret baru menggunakan Cloud Build. Klik Create secret untuk membuat secret.
- Gunakan secret yang ada atau buat secret Anda sendiri jika Anda ingin menggunakan secret yang ada. Masukkan secret dan versi di kotak pilihan drop-down.
Jika menggunakan secret yang sudah ada, Anda mungkin perlu memberikan peran Secret Manager Secret Accessor secara manual ke agen layanan Cloud Build
service-PROJECT_NUMBER@gcp-sa-cloudbuild.
.Untuk mempelajari lebih lanjut, lihat Memberikan peran kepada agen layanan Cloud Build.
Klik Tampilkan pratinjau URL dan catat URL-nya. Anda memerlukan URL ini untuk menyiapkan webhook di Secure Source Manager.
- Konfigurasi: untuk Jenis, pilih File konfigurasi Cloud Build (YAML atau JSON) dan untuk Lokasi, pilih Inline.
Klik tombol Open Editor untuk mengedit file konfigurasi build Anda.
Salin konten file
cloudbuild.yaml
Anda ke editor.Seperti yang telah dibahas sebelumnya, pipeline ini memiliki perilaku yang berbeda bergantung pada cabang yang diambil. Build akan memeriksa apakah variabel
${branch}
cocok dengan folder lingkungan mana pun. Jika demikian, Cloud Build akan menjalankanterraform plan
untuk lingkungan tersebut. Jika tidak, Cloud Build akan mengeksekusiterraform plan
untuk semua lingkungan guna memastikan perubahan yang diusulkan sesuai untuk semua lingkungan. Jika salah satu rencana ini gagal dijalankan, build akan gagal.- id: 'tf plan' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform plan else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFOM PLAN ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform plan || exit 1 cd ../../ done fi
Perintah
terraform apply
berjalan untuk cabang lingkungan, tetapi sepenuhnya diabaikan dalam kasus lainnya.Klik + Tambahkan variabel, lalu tambahkan dua variabel substitusi berikut:
- Variabel:
_REPO_URL
, Nilai:$(body.repository.clone_url)
- Variabel:
_REF
, Nilai:$(body.ref)
- Variabel:
Klik Buat.
- Di antarmuka web Secure Source Manager, buka repositori yang ingin Anda buat webhook-nya.
- Klik Setelan.
- Klik Webhook, lalu klik Tambahkan webhook.
Di kolom Hook ID, masukkan ID untuk webhook.
Di kolom Target URL, masukkan URL Webhook yang Anda salin saat menyiapkan pemicu webhook di Cloud Build.
Untuk menemukan URL Webhook:
Buka halaman Pemicu di konsol Google Cloud .
Klik pemicu Anda.
Di bagian Webhook URL, klik Tampilkan pratinjau URL, lalu salin URL.
URL Webhook berisi nilai kunci dan rahasia yang dimasukkan saat Anda membuat pemicu Cloud Build. Untuk mencegah kebocoran nilai ini, hapus nilai tersebut dari akhir URL target dan salin ke kolom String Kueri Sensitif.
Untuk menemukan kunci dan rahasia di URL webhook, cari teks yang dimulai dengan
key=
Misalnya, dengan URL berikut:
https://cloudbuild.googleapis.com/v1/projects/my-project/triggers/test-trigger:webhook?key=eitIfKhYnv0LrkdsyHqIros8fbsheKRIslfsdngf&secret=Hello%20Secret%20Manager
Salin dan hapus bagian yang dimulai dengan tanda tanya
?key=...
dari kolom URL Target. Kemudian, hapus tanda tanya awal, pindahkan bagiankey=...
yang tersisa ke kolom String Kueri Sensitif.Klik Tambahkan webhook.
Webhook ditampilkan di halaman Webhook.
Pastikan Anda berada di cabang
dev
:cd ~/solutions-terraform-cloudbuild-gitops git checkout dev
Tarik perubahan terbaru:
git pull
Buat cabang
bug-fix
untuk mengubah konfigurasi lingkungan.git checkout -b bug-fix
Buka
modules/firewall/main.tf
untuk mengedit.Di baris 30, perbaiki kesalahan ketik
"http-server2"
di kolomtarget_tags
.Nilai harus berupa
"http-server"
.Commit dan kirim perubahan Anda:
git add --all git commit -m "Fix typo." git push google -u bug-fix
Buka halaman History Cloud Build di konsol Google Cloud :
Klik Build untuk melihat informasi selengkapnya, termasuk output
terraform plan
.- Di antarmuka web Secure Source Manager, buka repositori Anda.
- Klik New pull request.
- Di kolom merge into:, pilih cabang
dev
Anda. - Di kolom pull from:, pilih cabang
bug-fix
Anda. - Klik New pull request.
- Klik Create pull request.
- Klik Merge pull request, lalu klik Merge pull request lagi.
Periksa apakah Cloud Build baru telah dipicu:
Buka build dan periksa log.
Setelah build selesai, Anda akan melihat tampilan seperti ini:
Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE Step #3 - "tf apply": firewall_rule = dev-allow-http Step #3 - "tf apply": instance_name = dev-apache2-instance Step #3 - "tf apply": network = dev Step #3 - "tf apply": subnet = dev-subnet-01
Salin
EXTERNAL_IP_VALUE
dan buka alamat di browser web.http://EXTERNAL_IP_VALUE
Penyediaan ini mungkin memerlukan waktu beberapa detik untuk mem-boot VM dan menyebarkan aturan firewall. Terakhir, Anda akan melihat Environment: dev di browser web.
Buka Cloud Storage:
Pilih project Anda.
Klik bucket penyimpanan status Terraform Anda. Nama bucket akan terlihat seperti berikut:
PROJECT_ID-tfstate
Klik env, lalu dev untuk melihat file status Terraform Anda.
- Di antarmuka web Secure Source Manager, buka repositori Anda.
- Klik tab Pull requests.
- Klik New pull request.
- Untuk merge into:, pilih cabang
prod
repositori Anda. - Untuk pull from:, pilih cabang
dev
repositori Anda. - Klik New pull request.
- Untuk title, masukkan judul seperti "Promoting networking changes", lalu klik Create pull request.
Tinjau perubahan yang diusulkan, lalu klik Merge pull request.
Tanggal dan URL repositori ditambahkan di kolom komentar.
Klik Merge pull request lagi untuk mengonfirmasi.
Di konsol Google Cloud , buka halaman Build History untuk melihat perubahan yang Anda terapkan ke lingkungan produksi:
Tunggu hingga build selesai, lalu periksa log.
Di akhir log, Anda akan melihat sesuatu seperti ini:
Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE Step #3 - "tf apply": firewall_rule = prod-allow-http Step #3 - "tf apply": instance_name = prod-apache2-instance Step #3 - "tf apply": network = prod Step #3 - "tf apply": subnet = prod-subnet-01
Salin
EXTERNAL_IP_VALUE
dan buka alamat di browser web.http://EXTERNAL_IP_VALUE
Penyediaan ini mungkin memerlukan waktu beberapa detik untuk mem-boot VM dan menyebarkan aturan firewall. Terakhir, Anda akan melihat Environment: prod di browser web.
Buka Cloud Storage:
Pilih project Anda.
Klik bucket penyimpanan status Terraform Anda. Nama bucket akan terlihat seperti berikut:
PROJECT_ID-tfstate
Klik env, lalu prod untuk melihat file status Terraform Anda.
- Tambahkan deployment untuk kasus penggunaan terpisah.
- Buat lingkungan tambahan untuk mencerminkan kebutuhan Anda.
- Gunakan project per lingkungan, bukan VPC per lingkungan.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Pertimbangkan untuk menggunakan template Cloud Foundation Toolkit untuk membangun dengan cepat fondasi yang dapat diulang dan siap digunakan perusahaan di Google Cloud.
- Tonton Lingkungan Google Cloud yang Dapat Berulang dalam Skala Besar dengan Pipeline Infrastruktur sebagai Kode Cloud Build dari Next' 19 tentang alur kerja GitOps yang dijelaskan dalam tutorial ini.
- Lihat tutorial Continuous delivery bergaya GitOps dengan Cloud Build.
- Lihat fitur Cloud Build yang lebih canggih: Mengonfigurasi urutan langkah membangun, Membangun, Menguji, dan Men-deploy Artefak, Membuat Langkah Build Kustom
- Lihat blog tentang Memastikan skala dan kepatuhan Deployment Terraform Anda dengan Cloud Build.
- Baca referensi kami tentang DevOps.
- Pelajari lebih lanjut kapabilitas DevOps terkait tutorial ini:
- Lakukan pemeriksaan cepat DevOps untuk memahami posisi Anda dibandingkan dengan industri lainnya.
Menyiapkan repositori Secure Source Manager
Dalam tutorial ini, Anda menggunakan satu repositori Secure Source Manager untuk menentukan infrastruktur cloud. Anda mengorkestrasi infrastruktur ini dengan memiliki cabang yang berbeda yang sesuai dengan lingkungan yang berbeda:
Dengan infrastruktur ini, Anda dapat mereferensikan repositori untuk mengetahui konfigurasi yang diharapkan di setiap lingkungan dan mengusulkan perubahan baru dengan menggabungkannya ke dalam lingkungan dev
terlebih dahulu. Selanjutnya, promosikan perubahan tersebut dengan
menggabungkan cabang dev
ke cabang prod
berikutnya.
Kode dalam repositori ini disusun sebagai berikut:
Untuk memastikan bahwa perubahan yang diusulkan sesuai untuk setiap lingkungan,
terraform init
dan terraform plan
dijalankan untuk semua subfolder
environments
. Sebelum menggabungkan permintaan pull, Anda dapat meninjau paket
untuk memastikan bahwa, misalnya, akses tidak diberikan kepada
entitas yang tidak sah.
Ubah file konfigurasi build
Agar file konfigurasi build contoh berfungsi dengan Secure Source Manager, Anda perlu melakukan pengeditan berikut:
Edit file konfigurasi build di cabang dev
:
Mengonfigurasi Terraform untuk menyimpan status di bucket Cloud Storage
Secara default, Terraform menyimpan
status
secara lokal dalam file bernama terraform.tfstate
. Konfigurasi default ini dapat menyulitkan tim untuk menggunakan Terraform, terutama ketika banyak pengguna menjalankan
Terraform secara bersamaan dan setiap mesin memiliki pemahamannya sendiri tentang infrastruktur saat ini.
Untuk membantu Anda menghindari masalah tersebut, bagian ini mengonfigurasi
status jarak jauh
yang mengarah ke bucket Cloud Storage. Status jarak jauh adalah fitur
backend
dan, dalam tutorial ini, dikonfigurasi dalam file backend.tf
—misalnya:
Pada langkah-langkah berikut, Anda akan membuat bucket Cloud Storage dan mengubah beberapa file agar mengarah ke bucket baru dan project Google Cloud Anda.
Memberikan izin ke akun layanan Cloud Build Anda
Agar akun layanan Cloud Build dapat menjalankan skrip Terraform dengan tujuan mengelola Google Cloud resource, Anda perlu memberinya akses yang sesuai ke project Anda. Untuk mempermudah, akses editor project diberikan dalam tutorial ini. Untuk lingkungan produksi, ikuti praktik terbaik keamanan IT perusahaan Anda, biasanya dengan memberikan akses dengan hak istimewa terendah.
Menghubungkan ke Cloud Build
Untuk memicu Cloud Build saat mengirim ke cabang mana pun, siapkan webhook Secure Source Manager. File konfigurasi build akan memeriksa
nama cabang untuk menentukan apakah perubahan perlu dilakukan pada lingkungan dev
atau prod
.
Menyiapkan webhook di Secure Source Manager
Buat webhook untuk memicu build saat melakukan push ke cabang dev
atau prod
.
Mengubah konfigurasi lingkungan Anda di cabang fitur baru
Perhatikan bahwa tugas Cloud Build menjalankan pipeline yang ditentukan dalam file cloudbuild.yaml
. Seperti yang telah dibahas sebelumnya, pipeline ini memiliki perilaku yang berbeda bergantung pada cabang yang diambil. Build akan memeriksa apakah
variabel ${branch}
cocok dengan folder lingkungan mana pun. Jika demikian, Cloud Build akan menjalankan terraform plan
untuk lingkungan tersebut.
Jika tidak, Cloud Build akan mengeksekusi terraform plan
untuk semua lingkungan guna memastikan perubahan yang diusulkan sesuai untuk semua lingkungan. Jika salah satu
rencana ini gagal dijalankan, build akan gagal.
- id: 'tf plan' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform plan else for dir in environments/*/ do cd ${dir} env=${dir%*/} env=${env#*/} echo "" echo "*************** TERRAFOM PLAN ******************" echo "******* At environment: ${env} ********" echo "*************************************************" terraform plan || exit 1 cd ../../ done fi
Demikian pula, perintah terraform apply
yang akan berjalan untuk cabang lingkungan, tetapi
sepenuhnya diabaikan dalam kasus lainnya. Di bagian ini, Anda telah mengirimkan perubahan kode ke cabang baru, sehingga tidak ada deployment infrastruktur yang diterapkan ke project Google Cloud Anda.
Mendorong perubahan pada lingkungan pengembangan
Kini saatnya menerapkan status yang Anda inginkan ke lingkungan dev
.
Mendorong perubahan pada lingkungan produksi
Setelah lingkungan pengembangan sudah diuji sepenuhnya, Anda dapat mempromosikan kode infrastruktur ke produksi.
Anda telah berhasil mengonfigurasi pipeline infrastruktur sebagai kode tanpa server di Cloud Build. Di masa mendatang, Anda dapat mencoba hal berikut:
Pembersihan
Setelah menyelesaikan tutorial, bersihkan resource yang dibuat di Google Cloud sehingga Anda tidak akan ditagih di masa mendatang.