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.

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: String ini ditambahkan ke nama bucket Cloud Storage untuk memastikan nama bucket Cloud Storage unik.
    • google_storage_bucket: Bucket Cloud Storage untuk menyimpan file status. Bucket ini dikonfigurasi untuk 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 disetel ke true untuk mengizinkan kontrol akses ke bucket dan isinya menggunakan izin IAM, bukan daftar kontrol akses.
      • versioning diaktifkan untuk memastikan bahwa versi status sebelumnya dipertahankan dalam bucket.
    • local_file: File lokal. Isi file ini menginstruksikan 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 di 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. Konfigurasi ini juga membuat file lokal; konten file ini 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.