Menyimpan status Terraform di bucket Cloud Storage


Dalam tutorial ini, Anda akan mempelajari cara menyimpan status Terraform di bucket Cloud Storage.

Secara default, Terraform menyimpan status secara lokal dalam file bernama terraform.tfstate. Konfigurasi default ini dapat mempersulit penggunaan Terraform oleh tim ketika beberapa pengguna menjalankan Terraform secara bersamaan dan setiap mesin memiliki pemahamannya sendiri tentang infrastruktur saat ini.

Untuk membantu Anda menghindari masalah tersebut, halaman ini menunjukkan cara mengonfigurasi status jarak jauh yang mengarah ke bucket Cloud Storage. Status jarak jauh adalah fitur backend Terraform.

Tujuan

Tutorial ini menunjukkan cara melakukan hal berikut:

  • Gunakan Terraform untuk menyediakan bucket Cloud Storage guna menyimpan status Terraform.
  • Tambahkan template di file konfigurasi Terraform untuk memigrasikan status dari backend lokal ke bucket Cloud Storage.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

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.

Cloud Storage menimbulkan biaya untuk penyimpanan, operasi baca dan tulis, traffic keluar jaringan, dan replikasi.

Bucket Cloud Storage dalam tutorial ini mengaktifkan Pembuatan Versi Objek untuk menyimpan histori deployment Anda. Mengaktifkan Pembuatan Versi Objek akan meningkatkan biaya penyimpanan, yang dapat Anda kurangi dengan mengonfigurasi Pengelolaan Siklus Proses Objek untuk menghapus versi status lama.

Sebelum memulai

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Cloud Shell telah diinstal sebelumnya dengan Terraform.

  2. Jika Anda menggunakan shell lokal, lakukan langkah-langkah berikut:

    • Instal Terraform.
    • Buat kredensial autentikasi lokal untuk Akun Google Anda:

      gcloud auth application-default login
  3. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  4. Make sure that billing is enabled for your Google Cloud project.

  5. Aktifkan API Cloud Storage:

    gcloud services enable storage.googleapis.com
  6. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/storage.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Atau, Anda dapat membuat peran IAM khusus yang berisi izin berikut:

    • storage.buckets.create
    • storage.buckets.list
    • storage.objects.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.update

    Sebagai praktik terbaik, sebaiknya kontrol akses ke bucket dan file status yang disimpan di sana. Hanya sekelompok kecil pengguna (misalnya, administrator cloud utama dan orang yang bertindak sebagai administrator alternatif atau cadangan) yang boleh memiliki izin admin untuk bucket. Developer lain harus memiliki izin untuk hanya menulis dan membaca objek di bucket.

Menyiapkan lingkungan

  1. Clone repositori GitHub yang berisi contoh Terraform:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  2. Ubah ke direktori kerja:

    cd terraform-docs-samples/storage/remote_terraform_backend_template
    

Meninjau file Terraform

  1. Tinjau file main.tf:

    cat main.tf
    

    Outputnya mirip dengan yang berikut ini

    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name     = "${random_id.default.hex}-terraform-remote-backend"
      location = "US"
    
      force_destroy               = false
      public_access_prevention    = "enforced"
      uniform_bucket_level_access = true
    
      versioning {
        enabled = true
      }
    }
    
    resource "local_file" "default" {
      file_permission = "0644"
      filename        = "${path.module}/backend.tf"
    
      # You can store the template in a file and use the templatefile function for
      # more modularity, if you prefer, instead of storing the template inline as
      # we do here.
      content = <<-EOT
      terraform {
        backend "gcs" {
          bucket = "${google_storage_bucket.default.name}"
        }
      }
      EOT
    }

    File ini menjelaskan resource berikut:

    • random_id: Ini ditambahkan ke nama bucket Cloud Storage untuk memastikan nama yang unik untuk bucket Cloud Storage.
    • google_storage_bucket: Bucket Cloud Storage untuk menyimpan file status. Bucket ini dikonfigurasi agar memiliki properti berikut:
      • force_destroy ditetapkan ke false untuk memastikan bahwa bucket tidak dihapus jika ada objek di dalamnya. Hal ini memastikan bahwa informasi status dalam bucket tidak terhapus secara tidak sengaja.
      • public_access_prevention ditetapkan ke enforced untuk memastikan konten bucket tidak terekspos ke publik secara tidak sengaja.
      • uniform_bucket_level_access ditetapkan ke true untuk mengizinkan kontrol akses ke bucket dan kontennya menggunakan izin IAM, bukan daftar kontrol akses.
      • versioning diaktifkan untuk memastikan bahwa versi status sebelumnya dipertahankan di bucket.
    • local_file: File lokal. Konten file ini memerintahkan Terraform untuk menggunakan bucket Cloud Storage sebagai backend jarak jauh setelah bucket dibuat.

Menyediakan bucket Cloud Storage

  1. Lakukan inisialisasi Terraform:

    terraform init
    

    Saat Anda menjalankan terraform init untuk pertama kalinya, bucket Cloud Storage yang Anda tentukan dalam file main.tf belum ada, sehingga Terraform menginisialisasi backend lokal untuk menyimpan status dalam sistem file lokal.

  2. Terapkan konfigurasi untuk menyediakan resource yang dijelaskan dalam file main.tf:

    terraform apply
    

    Saat diminta, masukkan yes.

    Saat Anda menjalankan terraform apply untuk pertama kalinya, Terraform akan menyediakan bucket Cloud Storage untuk menyimpan status. Tindakan ini juga akan membuat file lokal; konten file ini akan menginstruksikan Terraform untuk menggunakan bucket Cloud Storage sebagai backend jarak jauh untuk menyimpan status.

Memigrasikan status ke bucket Cloud Storage

  1. Migrasikan status Terraform ke backend Cloud Storage jarak jauh:

    terraform init -migrate-state
    

    Terraform mendeteksi bahwa Anda sudah memiliki file status secara lokal dan meminta Anda untuk memigrasikan status ke bucket Cloud Storage yang baru. Saat diminta, masukkan yes.

Setelah menjalankan perintah ini, status Terraform Anda akan disimpan di bucket Cloud Storage. Terraform mengambil status terbaru dari bucket ini sebelum menjalankan perintah, dan mengirim status terbaru ke bucket setelah menjalankan perintah.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan pada halaman ini, ikuti langkah-langkah berikut.

  1. Buka file main.tf.

  2. Di resource google_storage_bucket.default, perbarui nilai force_destroy menjadi true.

  3. Terapkan konfigurasi yang telah diperbarui:

    terraform apply
    

    Saat diminta, masukkan yes.

  4. Hapus file status:

    rm backend.tf
    
  5. Konfigurasi ulang backend menjadi lokal:

    terraform init -migrate-state
    

    Saat diminta, masukkan yes.

  6. Jalankan perintah berikut untuk menghapus resource Terraform:

    terraform destroy
    

    Saat diminta, masukkan yes.

Langkah selanjutnya