Traffine I/O

Bahasa Indonesia

2022-10-09

For-Each dan Dynamic Blocks di Terraform

Ikhtisar For-Each dan Dynamic Blocks

Salah satu fitur utama Terraform adalah kemampuannya untuk menggunakan for-each dan dynamic blocks untuk membuat beberapa instance dari resource atau modul dalam satu blok kode.

For-each adalah fungsi bawaan di Terraform yang memungkinkan Anda untuk mengulang melalui daftar nilai dan membuat beberapa instance dari resource atau modul. Misalnya, jika Anda ingin membuat beberapa instance AWS EC2, Anda dapat menggunakan fungsi for-each untuk mengulang melalui daftar nama instance dan membuat sebuah instance untuk setiap nama dalam daftar.

Dynamic blocks, di sisi lain, memungkinkan Anda untuk membuat beberapa instance dari resource atau modul berdasarkan konfigurasi dinamis. Ini berarti bahwa Anda dapat menggunakan dynamic blocks untuk membuat resource atau modul berdasarkan input dari variabel atau resource lainnya. Misalnya, Anda dapat menggunakan dynamic block untuk membuat beberapa subnet di AWS berdasarkan jumlah zona ketersediaan di wilayah tertentu.

Baik for-each maupun dynamic blocks memberikan pengembang dan tim operasi dengan alat yang kuat untuk mengelola resource infrastruktur secara besar-besaran. Dengan memungkinkan pembuatan beberapa instance dari resource atau modul dalam satu blok kode, fitur ini membantu menyederhanakan proses mengelola lingkungan infrastruktur yang besar dan kompleks.

For-Each

Fungsi for-each memungkinkan Anda untuk mengulang melalui daftar nilai dan membuat beberapa instance dari resource atau modul berdasarkan nilai-nilai tersebut. Ini berguna ketika Anda perlu membuat beberapa instance dari resource atau modul yang sama, tetapi dengan atribut atau konfigurasi yang berbeda.

Fungsi for-each mengambil peta atau daftar sebagai input, dan mengulang setiap elemen dalam peta atau daftar tersebut. Untuk setiap iterasi, itu membuat sebuah instance baru dari resource atau modul, menggunakan nilai iterasi saat ini sebagai input untuk atribut yang dapat dikonfigurasi.

Syntax untuk menggunakan for-each di Terraform adalah sebagai berikut:

resource "<resource_type>" "<resource_name>" {
  for_each = <map_or_list>
  <attribute_1> = <value_1>
  <attribute_2> = <value_2>
  ...
}

Dalam sintaks ini, <resource_type> adalah jenis resource yang ingin Anda buat, <resource_name> adalah nama resource, <map_or_list> adalah peta atau daftar yang ingin Anda iterasi, dan <attribute_1>, <attribute_2>, dll. adalah atribut yang dapat dikonfigurasi untuk resource.

Berikut adalah contoh penggunaan for-each untuk membuat beberapa instance AWS EC2:

resource "aws_instance" "ec2_instances" {
  for_each = {
    "instance-1" = "ami-0c55b159cbfafe1f0"
    "instance-2" = "ami-0c55b159cbfafe1f0"
    "instance-3" = "ami-0c55b159cbfafe1f0"
  }

  instance_type = "t2.micro"
  ami = each.value
}

Dalam contoh ini, kita membuat tiga instance resource aws_instance, menggunakan AMI yang sama tetapi dengan nama instance yang berbeda. Fungsi for-each mengiterasi peta yang berisi nama instance dan ID AMI yang sesuai. Atribut instance_type diatur ke t2.micro untuk semua instance, sedangkan atribut ami diatur ke nilai iterasi saat ini menggunakan sintaks each.value.

Dynamic Blocks

Dynamic block memungkinkan Anda untuk membuat beberapa instance dari resource atau modul berdasarkan konfigurasi dinamis. Ini berguna ketika Anda perlu membuat resource atau modul berdasarkan input dari variabel atau resource lain, seperti jumlah availability zone di sebuah region AWS.

Dynamic block didefinisikan menggunakan sintaks khusus yang memungkinkan Anda untuk menentukan jenis resource atau modul, bersama dengan konfigurasi dynamic block yang menentukan atribut untuk setiap instance dari resource atau modul. Konfigurasi ini dinilai secara dinamis pada runtime, memungkinkan Anda untuk membuat resource atau modul berdasarkan input dari variabel atau resource lain.

Sintaks untuk menggunakan dynamic block di Terraform adalah sebagai berikut:

resource "<resource_type>" "<resource_name>" {
  dynamic "<block_name>" {
    for_each = <expression>

    <attribute_1> = <value_1>
    <attribute_2> = <value_2>
    ...
  }
}

Dalam sintaks ini, <resource_type> adalah jenis resource yang ingin Anda buat, <resource_name> adalah nama dari resource, <block_name> adalah nama dynamic block, dan <expression> adalah ekspresi yang menentukan jumlah instance yang ingin dibuat. <attribute_1>, <attribute_2>, dll adalah atribut yang dapat dikonfigurasi untuk setiap instance dari resource.

Berikut adalah contoh penggunaan dynamic block untuk membuat beberapa subnet AWS berdasarkan jumlah availability zone di sebuah region:

resource "aws_subnet" "subnet" {
  dynamic "subnet" {
    for_each = var.availability_zones

    content {
      cidr_block = cidrsubnet(var.vpc_cidr_block, 8, each.key)
      availability_zone = each.value
    }
  }
}

Dalam contoh ini, kita menggunakan dynamic blocks untuk membuat beberapa subnet AWS, satu untuk setiap zona ketersediaan di wilayah tersebut. Ekspresi for_each adalah variabel yang disebut availability_zones yang berisi daftar zona ketersediaan di wilayah tersebut. Konfigurasi dynamic block menentukan atribut untuk setiap subnet, termasuk atribut cidr_block dan availability_zone.

Dynamic blocks memungkinkan Anda membuat beberapa instance dari resource atau modul berdasarkan input yang dinamis, sehingga memudahkan pengelolaan lingkungan infrastruktur yang kompleks. Dengan menggunakan dynamic blocks secara efektif, Anda dapat membuat kode Terraform yang scalable, maintainable, dan efisien yang dapat menyesuaikan dengan kebutuhan infrastruktur yang berubah.

Perbedaan antara For-Each dan Dynamic Blocks

Baik for-each maupun dynamic blocks memungkinkan pembuatan beberapa instance dari resource atau modul dalam satu blok kode, tetapi ada beberapa perbedaan kunci antara keduanya.

Perbandingan For-Each dan Dynamic Blocks

For-each adalah fungsi bawaan dalam Terraform yang memungkinkan Anda membuat beberapa instance dari resource atau modul berdasarkan daftar atau peta nilai. For-each paling cocok untuk situasi di mana Anda perlu membuat jumlah instance resource atau modul yang tetap, tetapi dengan atribut atau konfigurasi yang berbeda. For-each adalah konstruksi statis, yang berarti jumlah instance didefinisikan pada saat pembuatan kode dan tidak dapat diubah pada saat runtime.

Dynamic blocks, di sisi lain, memungkinkan Anda membuat beberapa instance dari resource atau modul berdasarkan konfigurasi yang dinamis. Dynamic blocks paling cocok untuk situasi di mana jumlah instance bergantung pada input eksternal, seperti jumlah zona ketersediaan di wilayah AWS. Dynamic blocks dievaluasi pada saat runtime, memungkinkan Anda membuat resource atau modul berdasarkan input dari variabel atau resource lain.

Penggunaan untuk For-Each dan Dynamic Blocks

For-each dan dynamic blocks memiliki penggunaan yang berbeda dalam Terraform, dan paling cocok digunakan untuk situasi yang berbeda.

Beberapa penggunaan untuk for-each meliputi:

  • Membuat beberapa instance dari resource atau modul dengan atribut atau konfigurasi yang berbeda-beda.
  • Membuat jumlah tetap dari instance resource atau modul.
  • Mempermudah kode dengan menghindari kebutuhan untuk beberapa salinan dari resource atau modul dengan konfigurasi yang mirip.

Beberapa penggunaan untuk dynamic blocks meliputi:

  • Membuat beberapa instance dari resource atau modul berdasarkan konfigurasi dinamis, seperti jumlah availability zone di sebuah wilayah AWS.
  • Membuat resource atau modul berdasarkan input dari variabel atau resource lain.
  • Mengizinkan kode untuk beradaptasi dengan persyaratan infrastruktur yang berubah.

Secara umum, for-each paling cocok digunakan dalam situasi di mana jumlah instance diketahui pada saat pembuatan kode, sedangkan dynamic blocks paling cocok digunakan dalam situasi di mana jumlah instance tergantung pada input eksternal. Dengan menggunakan for-each dan dynamic blocks secara efektif, Anda dapat membuat kode Terraform yang scalable, mudah dipelihara, dan efisien yang dapat beradaptasi dengan persyaratan infrastruktur yang berubah.

Referensi

https://www.middlewareinventory.com/blog/terraform-for-each-examples/
https://brendanthompson.com/posts/2022/11/terraform-dynamic-blocks

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!