Memahami fungsi, ekspresi, dan meta-argumen Terraform - AWS Panduan Preskriptif

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 substr, concat, length, dan base64decode, dalam contoh dalam panduan ini. CloudFormation Seperti fungsi intrinsik, Terraform memiliki serangkaian fungsi bawaan yang tersedia untuk digunakan dalam konfigurasi Anda. Misalnya, jika atribut sumber daya tertentu mengambil objek JSON yang sangat besar yang tidak efisien untuk ditempelkan langsung ke file, Anda dapat meletakkan objek tersebut dalam file.json dan menggunakan fungsi Terraform untuk mengaksesnya. Dalam contoh berikut, file 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 bersyarat, yang mirip dengan CloudFormation condition fungsi kecuali bahwa mereka menggunakan sintaks operator ternary yang lebih tradisional. Dalam contoh berikut, kedua ekspresi mengembalikan hasil yang sama persis. Contoh kedua adalah apa yang disebut Terraform sebagai ekspresi percikan. Tanda bintang menyebabkan Terraform mengulang daftar dan membuat daftar baru hanya dengan menggunakan id 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-argumen lain memungkinkan fungsi dan ekspresi fungsionalitas ditambahkan langsung ke sumber daya. Misalnya, hitungan meta-argumen adalah mekanisme yang berguna untuk membuat beberapa sumber daya serupa pada saat yang bersamaan. Contoh berikut menunjukkan cara membuat dua cluster Amazon Elastic Container Service (Amazon EKS) tanpa menggunakan count 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_each masuk. for_eachMeta-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_eachjenis Iterasi pertama Iterasi kedua
A
[“poodle”, “chihuahua”]
each.key = "poodle" each.value = null
each.key = "chihuahua" each.value = null
B
[ { type = "poodle", name = "Sparky" }, { type = "chihuahua", name = "Fluffy" } ]
each.key = { type = “poodle”, name = “Sparky” } each.value = null
each.key = { type = “chihuahua”, name = “Fluffy” } each.value = null
C
{ poodle = “Sparky”, chihuahua = “Fluffy” }
each.key = “poodle” each.value = “Sparky”
each.key = “chihuahua” each.value = “Fluffy”
D
{ dogs = { poodle = “Sparky”, chihuahua = “Fluffy” }, cats = { persian = “Felix”, burmese = “Morris” } }
each.key = “dogs” each.value = { poodle = “Sparky”, chihuahua = “Fluffy” }
each.key = “cats” each.value = { persian = “Felix”, burmese = “Morris” }
E
{ dogs = [ { type = “poodle”, name = “Sparky” }, { type = “chihuahua”, name = “Fluffy” } ], cats = [ { type = “persian”, name = “Felix” }, { type = “burmese”, name = “Morris” } ] }
each.key = “dogs” each.value = [ { type = “poodle”, name = “Sparky” }, { type = “chihuahua”, name = “Fluffy” } ]
each.key = “cats” each.value = [ { type = “persian”, name = “Felix” }, { type = “burmese”, name = “Morris” } ]

 

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 }