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 bernilainull
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
:
$ 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
:
$ terraform apply -var-file="testing.tfvars"
File definisi variabel menggunakan sintaks dasar yang sama dengan file bahasa Terraform, tetapi hanya berisi penugasan nama variabel:
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:
{
"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:
$ 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