Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Memahami fungsi, ekspresi, dan meta-argumen Terraform
Salah satu kritik terhadap alat IAC yang menggunakan file konfigurasi deklaratif daripada bahasa pemrograman umum adalah bahwa mereka membuatnya lebih sulit untuk mengimplementasikan logika programatik khusus. Dalam konfigurasi Terraform, masalah ini diatasi dengan menggunakan fungsi, ekspresi, dan meta-argumen.
Fungsi
Salah satu keuntungan besar menggunakan kode untuk menyediakan infrastruktur Anda adalah kemampuan untuk menyimpan alur kerja umum dan menggunakannya kembali dan lagi, sering kali melewati argumen yang berbeda setiap kali. Fungsi Terraform mirip dengan fungsi AWS CloudFormation intrinsik, meskipun sintaksnya lebih mirip dengan bagaimana fungsi dipanggil dalam bahasa terprogram. Anda mungkin telah memperhatikan beberapa fungsi Terraform, seperti seperti substrfile
fungsi mengembalikan isi file dalam bentuk string, dan kemudian jsondecode
fungsi mengubahnya menjadi tipe objek.
resource "example_resource" "example_resource_name" { json_object = jsondecode(file("/path/to/file.json")) }
Ekspresi
Terraform juga memungkinkan ekspresi bersyaratcondition
fungsi kecuali bahwa mereka menggunakan sintaks operator ternaryid
properti setiap item.
resource "example_resource" "example_resource_name" { boolean_value = var.value ? true : false numeric_value = var.value > 0 ? 1 : 0 string_value = var.value == "change_me" ? "New value" : var.value string_value_2 = var.value != "change_me" ? var.value : "New value" } There are two ways to express for loops in a Terraform configuration: resource "example_resource" "example_resource_name" { list_value = [for object in var.ids : object.id] list_value_2 = var.ids[*].id }
Meta-argumen
Dalam contoh kode sebelumnya, list_value
dan list_value_2
disebut sebagai argumen. Anda mungkin sudah akrab dengan beberapa meta-argumen ini. Terraform juga memiliki beberapa meta-argumen, yang bertindak seperti argumen tetapi dengan beberapa fungsionalitas tambahan:
-
Meta-argument depends_on
sangat mirip dengan atribut. CloudFormation DependsOn -
Meta-argument penyedia
memungkinkan Anda menggunakan beberapa konfigurasi penyedia sekaligus. -
Meta-argumen siklus hidup
memungkinkan Anda untuk menyesuaikan setelan sumber daya, mirip dengan kebijakan penghapusan dan penghapusan di. CloudFormation
Meta-argumen lain memungkinkan fungsi dan ekspresi fungsionalitas ditambahkan langsung ke sumber daya. Misalnya, hitungancount
meta-argumen.
resource "aws_eks_cluster" "example_0" { name = "example_0" role_arn = aws_iam_role.cluster_role.arn vpc_config { endpoint_private_access = true endpoint_public_access = true subnet_ids = var.subnet_ids[0] } } resource "aws_eks_cluster" "example_1" { name = "example_1" role_arn = aws_iam_role.cluster_role.arn vpc_config { endpoint_private_access = true endpoint_public_access = true subnet_ids = var.subnet_ids[1] } }
Contoh berikut menunjukkan cara menggunakan count
meta-argumen untuk membuat dua cluster Amazon EKS.
resource "aws_eks_cluster" "clusters" { count = 2 name = "cluster_${count.index}" role_arn = aws_iam_role.cluster_role.arn vpc_config { endpoint_private_access = true endpoint_public_access = true subnet_ids = var.subnet_ids[count.index] } }
Untuk memberikan masing-masing nama unit, Anda dapat mengakses indeks daftar dalam blok sumber daya dicount.index
. Tetapi bagaimana jika Anda ingin membuat beberapa sumber daya serupa yang sedikit lebih kompleks? Di situlah meta-argumen for_eachfor_each
Meta-argumen sangat mirip dengancount
, kecuali bahwa Anda meneruskan daftar atau objek bukan angka. Terraform membuat sumber daya baru untuk setiap anggota daftar atau objek. Ini mirip dengan jika Anda mengaturcount = length(list)
, kecuali Anda dapat mengakses isi daftar daripada indeks loop.
Ini berfungsi untuk daftar item atau objek tunggal. Contoh berikut akan membuat dua sumber daya yang memiliki id-0
dan id-1
sebagai ID mereka.
variable "ids" { default = [ { id = "id-0" }, { id = "id-1" }, ] } resource "example_resource" "example_resource_name" { # If your list fails, you might have to call "toset" on it to convert it to a set for_each = toset(var.ids) id = each.value }
Contoh berikut akan menciptakan dua sumber daya juga, satu untuk Sparky, pudel, dan satu untuk Fluffy, chihuahua.
variable "dogs" { default = { poodle = "Sparky" chihuahua = "Fluffy" } } resource "example_resource" "example_resource_name" { for_each = var.dogs breed = each.key name = each.value }
Sama seperti Anda dapat mengakses indeks loop dalam hitungan dengan menggunakan count.index, Anda dapat mengakses kunci dan nilai setiap item dalam loop for_each dengan menggunakan setiap objek. Karena for_each mengulangi daftar dan objek, setiap kunci dan nilai bisa sedikit membingungkan untuk dilacak. Tabel berikut menunjukkan berbagai cara yang dapat Anda gunakan meta-argumen for_each dan bagaimana Anda dapat mereferensikan nilai pada setiap iterasi.
Contoh | for_each jenis |
Iterasi pertama | Iterasi kedua |
---|---|---|---|
A |
|
|
|
B |
|
|
|
C |
|
|
|
D |
|
|
|
E |
|
|
|
Jadi jika var.animals
sama dengan baris E, maka Anda bisa membuat satu sumber daya per hewan dengan menggunakan kode berikut.
resource "example_resource" "example_resource_name" { for_each = var.animals type = each.key breeds = each.value[*].type names = each.value[*].name }
Atau, Anda dapat membuat dua sumber daya per hewan dengan menggunakan kode berikut.
resource "example_resource" "example_resource_name" { for_each = var.animals.dogs type = "dogs" breeds = each.value.type names = each.value.name } resource "example_resource" "example_resource_name" { for_each = var.animals.cats type = "cats" breeds = each.value.type names = each.value.name }