Traffine I/O

Bahasa Indonesia

2022-10-10

Variabel Terraform

Variabel Terraform

Variabel Terraform menyediakan pendekatan yang fleksibel dan dinamis untuk mengkodekan infrastruktur. Mereka menawarkan cara untuk menyesuaikan modul tanpa mengubah kode sumber, sehingga modul Anda dapat digunakan kembali dalam konfigurasi yang berbeda. Variabel dapat dideklarasikan di modul root, di mana mereka dapat diberi nilai menggunakan opsi CLI dan variabel lingkungan.

Mendeklarasikan Variabel

Variabel dalam Terraform dideklarasikan menggunakan blok variable. Blok ini membutuhkan label unik, yang berfungsi sebagai nama variabel. Label digunakan untuk memberikan nilai dari luar modul dan untuk merujuk nilai di dalam modul.

Berikut adalah contoh yang menunjukkan berbagai jenis deklarasi variabel:

variable "account_id" {}

variable "instance_id" {
  type = string
}

variable "subnet_ids" {
  type    = list(string)
  default = ["subnet-0a4b1f2c3d4e5f6g"]
}

variable "security_group_settings" {
  type = list(object({
    rule       = number
    port_range = number
    protocol   = string
  }))
  default = [
    {
      rule       = 22
      port_range = 22
      protocol   = "tcp"
    }
  ]
}

Argumen Variabel

Terraform CLI mendefinisikan argumen opsional berikut untuk deklarasi variabel:

  • default: Nilai default yang membuat variabel menjadi opsional.
  • type: Argumen ini menentukan tipe nilai yang diterima oleh variabel.
  • description: Menjelaskan dokumentasi variabel.
  • validation: Blok untuk mendefinisikan aturan validasi khusus, biasanya ditambahkan dengan batasan tipe.
  • sensitive: Membatasi tampilan UI Terraform saat variabel digunakan dalam konfigurasi.
  • nullable: Menentukan apakah variabel dapat bernilai null dalam modul.

Nilai Default

Deklarasi variabel dapat mencakup argumen default, yang membuat variabel menjadi opsional. Jika tidak ada nilai yang diatur saat memanggil modul atau menjalankan Terraform, nilai default digunakan. Argumen default membutuhkan nilai literal dan tidak dapat merujuk objek konfigurasi lainnya.

variable "instance_type" {
  type    = string
  default = "t2.micro"
}

Batasan Tipe

Argumen type dalam blok variable membatasi tipe nilai yang dapat diterima oleh variabel. Jika tidak ada batasan tipe yang ditetapkan, nilai dengan tipe apa pun diterima. Batasan tipe tidak wajib, tetapi disarankan untuk memberikan kejelasan bagi pengguna dan memungkinkan pesan kesalahan yang berguna dari Terraform.

Batasan tipe dibuat dari campuran kata kunci tipe dan konstruktor tipe. Kata kunci tipe yang didukung adalah:

  • string
  • number
  • bool

Konstruktor tipe memungkinkan Anda untuk menentukan tipe kompleks seperti koleksi:

  • list(<TYPE>)
  • set(<TYPE>)
  • map(<TYPE>)
  • object({<ATTR NAME> = <TYPE>, ... })
  • tuple([<TYPE>, ...])

Kata kunci any dapat digunakan untuk menunjukkan bahwa tipe apa pun diterima. Jika kedua argumen type dan default ditentukan, nilai default harus dapat dikonversi ke tipe yang ditentukan.

Dokumentasi Variabel

Untuk memberikan kejelasan kepada pengguna modul, argumen description dapat digunakan untuk menjelaskan tujuan variabel dan nilai yang diharapkan. Deskripsi ini mungkin dimasukkan dalam dokumentasi tentang modul dan harus ditulis dari perspektif pengguna.

variable "image_id" {
  type        = string
  description = "The id of the machine image (AMI) to use for the server."
}

Aturan Validasi Khusus

Blok validation dapat ditambahkan dalam blok variable untuk menentukan aturan validasi khusus untuk variabel.

Contoh aturan validasi untuk memeriksa sintaks ID instance:

variable "instance_id" {
  type        = string
  description = "The ID of the EC2 instance to manage."

  validation {
    condition     = length(var.instance_id) > 4 && substr(var.instance_id, 0, 4) == "i-"
    error_message = "The instance_id value must be a valid instance ID, starting with \"i-\"."
  }
}

Menyembunyikan Nilai dalam Output CLI

Argumen sensitive dapat digunakan untuk mencegah Terraform menampilkan nilai variabel dalam output plan atau apply. Argumen ini berguna ketika Anda ingin menyembunyikan data yang sensitif dari tampilan konsol.

variable "database_password" {
  type       = string
  sensitive  = true
}

Menolak Nilai Input Null

Argumen nullable dapat digunakan untuk menentukan apakah variabel dapat menerima null sebagai nilainya. Jika nullable diatur ke false, nilai variabel tidak dapat menjadi null dalam modul. Nilai default untuk nullable adalah true.

variable "subnet_id" {
  type     = string
  nullable = false
}

Menggunakan dan Memberikan Nilai Variabel

Setelah dideklarasikan, nilai variabel dapat diakses dan dimanipulasi dengan berbagai cara dalam konfigurasi Terraform Anda.

Mengakses Nilai Variabel

Di dalam modul yang mendeklarasikan variabel, Anda dapat menggunakan sintaks var.<NAMA> untuk mengakses nilai variabel dalam ekspresi. <NAMA> harus sesuai dengan label yang diberikan dalam blok deklarasi. Contohnya:

resource "aws_instance" "example" {
  instance_type = "t2.micro"
  ami           = var.ami_id
}

Akses ini terbatas pada modul di mana variabel dideklarasikan.

Memberikan Nilai pada Variabel Modul Root

Untuk variabel yang dideklarasikan di modul root konfigurasi Anda, nilai dapat diatur melalui berbagai metode:

  • Ruang kerja Terraform Cloud
  • Opsi baris perintah -var
  • File definisi variabel (.tfvars)
  • Variabel lingkungan
  • Variabel pada Baris Perintah

Variabel pada Baris Perintah

Untuk menentukan variabel individu pada baris perintah, gunakan opsi -var saat menjalankan perintah terraform plan dan terraform apply:

bash
$ terraform apply -var="image_id=ami-abc123"
$ terraform apply -var='image_id_list=["ami-abc123","ami-def456"]' -var="instance_type=t2.micro"
$ terraform apply -var='image_id_map={"us-east-1":"ami-abc123","us-east-2":"ami-def456"}'

File Definisi Variabel (.tfvars)

Untuk mengatur banyak variabel sekaligus, Anda dapat menentukan nilainya dalam file definisi variabel (berakhiran .tfvars atau .tfvars.json) dan kemudian menentukan file tersebut pada baris perintah dengan -var-file:

bash
$ terraform apply -var-file="testing.tfvars"

File definisi variabel menggunakan sintaks dasar yang sama dengan file bahasa Terraform, tetapi hanya berisi penugasan nama variabel:

terraform.tfvars
image_id = "ami-abc123"
availability_zone_names = [
  "us-east-1a",
  "us-west-1c",
]

Terraform juga secara otomatis memuat sejumlah file definisi variabel jika ada:

  • File dengan nama persis terraform.tfvars atau terraform.tfvars.json.
  • File apa pun dengan nama yang diakhiri dengan .auto.tfvars atau .auto.tfvars.json.

File yang nama akhirnya berakhir dengan .json diparsing sebagai objek JSON, dengan properti objek utama sesuai dengan nama variabel:

terraform.tfvars.json
{
  "image_id": "ami-abc123",
  "availability_zone_names": ["us-west-1a", "us-west-1c"]
}

Variabel Lingkungan

Terraform memungkinkan Anda untuk mengatur nilai variabel menggunakan variabel lingkungan. Setiap variabel lingkungan yang mewakili variabel Terraform harus dimulai dengan TF_VAR_ diikuti oleh nama variabel:

bash
$ export TF_VAR_image_id=ami-abc123
$ terraform plan
...

Ini sangat berguna saat menjalankan Terraform di lingkungan yang otomatis, atau ketika perlu menyimpan informasi sensitif di luar konfigurasi Anda.

Urutan Definisi Variabel

Mekanisme di atas untuk mengatur variabel dapat digunakan bersama dalam kombinasi apa pun. Jika variabel yang sama ditugaskan beberapa nilai, Terraform akan menggunakan nilai terakhir yang ditemukan, menggantikan nilai sebelumnya. Perlu diperhatikan bahwa variabel yang sama tidak dapat ditugaskan beberapa nilai dalam satu sumber.

Terraform memuat variabel dalam urutan berikut, dengan sumber yang lebih baru mendapatkan prioritas daripada yang sebelumnya:

  • Variabel lingkungan
  • File terraform.tfvars, jika ada.
  • File terraform.tfvars.json, jika ada.
  • File *.auto.tfvars atau *.auto.tfvars.json, diproses sesuai dengan urutan leksikal nama file mereka.
  • Opsi -var dan -var-file pada baris perintah, sesuai dengan urutan yang diberikan.

Referensi

https://developer.hashicorp.com/terraform/language/values/variables

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!