Menyimpan status Terraform di Azure Storage

Terraform memungkinkan definisi, pratinjau, dan penyebaran infrastruktur cloud. Menggunakan Terraform, Anda membuat file konfigurasi menggunakan sintaksis HCL. Sintaksis HCL memungkinkan Anda menentukan penyedia cloud - seperti Azure - dan elemen yang membentuk infrastruktur cloud Anda. Setelah membuat file konfigurasi, Anda membuat rencana eksekusi yang memungkinkan Anda untuk melihat pratinjau perubahan infrastruktur Anda sebelum disebarkan. Setelah memverifikasi perubahan, Anda menerapkan rencana eksekusi untuk menyebarkan infrastruktur.

Status Terraform digunakan untuk merekonsiliasi sumber daya yang disebarkan dengan konfigurasi Terraform. Negara bagian memungkinkan Terraform untuk mengetahui sumber daya Azure apa yang akan ditambahkan, diperbarui, atau dihapus.

Secara default, status Terraform disimpan secara lokal, dan hal ini tidak ideal karena alasan berikut:

  • Status lokal tidak bekerja dengan baik dalam tim atau lingkungan kolaboratif.
  • Status Terraform dapat menyertakan informasi sensitif.
  • Menyimpan status secara lokal meningkatkan kemungkinan penghapusan yang tidak disengaja.

Dalam artikel ini, Anda akan mempelajari cara:

  • Membuat akun Azure Storage
  • Gunakan penyimpanan Azure untuk menyimpan status Terraform jarak jauh.
  • Memahami penguncian status
  • Memahami enkripsi saat tidak aktif

1. Mengonfigurasi lingkungan Anda

  • Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.

2. Konfigurasikan akun penyimpanan status jarak jauh

Sebelum menggunakan Azure Storage sebagai backend, Anda harus membuat akun penyimpanan.

Jalankan perintah atau konfigurasi berikut untuk membuat akun penyimpanan dan kontainer Azure:

#!/bin/bash

RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate

# Create resource group
az group create --name $RESOURCE_GROUP_NAME --location eastus

# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob

# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME

Poin utama:

  • Akun penyimpanan Azure memerlukan nama yang unik secara global. Untuk mempelajari selengkapnya tentang pemecahan masalah nama akun penyimpanan, lihat Mengatasi kesalahan untuk nama akun penyimpanan.
  • Status terraform disimpan dalam teks biasa dan mungkin berisi rahasia. Jika status salah diamankan, akses tidak sah ke sistem dan kehilangan data dapat diakibatkan.
  • Dalam contoh ini, Terraform mengautentikasi ke akun penyimpanan Azure menggunakan Kunci Akses. Dalam penyebaran produksi, disarankan untuk mengevaluasi opsi autentikasi yang tersedia yang didukung oleh backend azurerm dan menggunakan opsi paling aman untuk kasus penggunaan Anda.
  • Dalam contoh ini, akses jaringan publik diizinkan ke akun penyimpanan Azure ini. Dalam penyebaran produksi, disarankan untuk membatasi akses ke akun penyimpanan ini menggunakan firewall penyimpanan, titik akhir layanan, atau titik akhir privat.

3. Konfigurasikan status backend terraform

Untuk mengonfigurasi status backend, Anda memerlukan informasi penyimpanan Azure berikut ini:

  • storage_account_name: Nama akun Azure Storage.
  • container_name: Nama kontainer blob.
  • kunci: Nama file penyimpanan status yang akan dibuat.
  • access_key: Kunci akses penyimpanan.

Setiap nilai ini dapat ditentukan dalam file konfigurasi Terraform atau pada baris perintah. Kami sarankan agar Anda menggunakan variabel lingkungan untuk nilai access_key. Menggunakan variabel lingkungan mencegah kunci ditulis ke disk.

Jalankan perintah berikut untuk mendapatkan kunci akses penyimpanan dan menyimpannya sebagai variabel lingkungan:

ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
export ARM_ACCESS_KEY=$ACCOUNT_KEY

Poin utama:

  • Untuk lebih melindungi kunci akses akun Azure Storage, simpan di Azure Key Vault. Variabel lingkungan kemudian dapat diatur menggunakan perintah yang mirip dengan hal berikut. Untuk informasi selengkapnya tentang Azure Key Fault, lihat dokumentasi Azure Key Vault.

    export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
    

Buat konfigurasi Terraform dengan blok konfigurasi backend.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
  backend "azurerm" {
      resource_group_name  = "tfstate"
      storage_account_name = "<storage_account_name>"
      container_name       = "tfstate"
      key                  = "terraform.tfstate"
  }

}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "state-demo-secure" {
  name     = "state-demo"
  location = "eastus"
}

Ganti <storage_account_name> dengan nama akun penyimpanan Azure Anda.

Jalankan perintah berikut untuk menginisialisasi konfigurasi:

terraform init

Jalankan perintah berikut untuk menjalankan konfigurasi:

terraform apply

Kini Anda dapat menemukan file status di blob Azure Storage.

4. Memahami penguncian status

Azure Storage blob terkunci secara otomatis sebelum operasi apa pun yang menuliskan status. Pola ini mencegah operasi status bersamaan, yang dapat menyebabkan kerusakan.

Untuk informasi selengkapnya, lihat penguncian Status pada dokumentasi Terraform.

Anda dapat melihat kunci saat memeriksa blob melalui portal Azure atau peralatan manajemen Azure lainnya.

Azure blob with lock

5. Memahami enkripsi saat tidak aktif

Data yang disimpan dalam blob Azure dienkripsi sebelum disimpan. Saat diperlukan, Terraform mengambil status dari backend dan menyimpannya dalam memori lokal. Jika Anda menggunakan pola ini, status tidak pernah ditulis ke disk lokal Anda.

Untuk informasi lengkap tentang enkripsi Azure Storage, lihat Enkripsi Azure Storage untuk data tidak aktif.

Memecahkan masalah Terraform pada Azure

Memecahkan masalah umum saat menggunakan Terraform di Azure

Langkah berikutnya