Saat ini saya sedang mencoba membuat sumber daya AWS_ROUTE Memanfaatkan FOR_ECH FUNGSION dan mengaitkan rute-rute ini dengan sejumlah sumber daya AWS_ROUTE_TEPT yang dibangun menggunakan fungsi hitungan. Saya ...

0
TravelingLex 5 April 2021, 19:38

1 menjawab

Jawaban Terbaik

Sepertinya kebutuhan Anda adalah memiliki instance aws_route untuk setiap kombinasi instance tabel rute dan elemen var.vpn_subnets.

Pengoperasian dalam menemukan semua kombinasi elemen dua koleksi disebut produk cartesian dan terraf memiliki setproduct Fungsi untuk menghitung itu.

locals {
  route_table_vpn_subnets = [
    for pair in setproduct(aws_route_table.private, var.vpn_subnets) : {
      route_table_name       = pair[0].tags.Name
      route_table_id         = pair[0].id
      destination_cidr_block = pair[1]
    }
  ]
}

Ini menggunakan setproduct dalam kombinasi dengan for Ekspresi untuk menghasilkan serangkaian objek yang menggambarkan semua kombinasi ID Tabel Rute dan Tujuan Blok CIDR, seperti ini:

[
  {
    route_table_name       = "example-private.0"
    route_table_id         = "rtb-12323453"
    destination_cidr_block = "192.168.0.0/24"
  },
  {
    route_table_name       = "example-private.0"
    route_table_id         = "rtb-12323453"
    destination_cidr_block = "192.168.2.0/24"
  },
  # ...
  {
    route_table_name       = "example-private.1"
    route_table_id         = "rtb-abcd"
    destination_cidr_block = "192.168.0.0/24"
  },
  {
    route_table_name       = "example-private.1"
    route_table_id         = "rtb-abcd"
    destination_cidr_block = "192.168.2.0/24"
  },
  # ...
]

Struktur data ini sekarang memenuhi dua persyaratan utama untuk for_each:

  • Ada satu elemen dari koleksi ini per contoh yang ingin kami buat.

  • Setiap objek memiliki seperangkat atribut yang bersama-sama berfungsi sebagai pengidentifikasi unik yang dibangun dari Nilai yang diputuskan dalam konfigurasi , sebagai lawan dari nilai-nilai yang diputuskan oleh sistem jarak jauh.

    Dalam hal ini, yang dilayani dengan memasukkan keduanya route_table_name dan {route_table_id, karena nama dipilih dengan konfigurasi Anda saat ID dipilih oleh sistem jarak jauh, dan ID tersebut tidak akan cocok untuk digunakan sebagai Pengidentifikasi instance.

Untuk menggunakannya di for_each Kita hanya perlu melakukan satu langkah lagi untuk memproyeksikannya ke dalam peta di mana nilai atribut unik digabungkan menjadi tombol string yang unik:

resource "aws_route" "vpn" {
  for_each = {
    for obj in local.route_table_vpn_subnets :
    "${obj.route_table_name}:${obj.destination_cidr_block}" => obj
  }

  route_table_id         = each.value.route_table_id
  gateway_id             = var.vpn_gateway_id
  destination_cidr_block = each.value.route_table_id
}

Ekspresi utama dalam ekspresi for Di sini adalah memberitahu terraform untuk menetapkan alamat instance ini seperti yang berikut, yang harus memenuhi persyaratan menjadi unik di semua kasus:

  • aws_route.vpn["example-private.0:192.168.0.0/24"]

  • aws_route.vpn["example-private.0:192.168.0.2/24"]

  • ...

  • aws_route.vpn["example-private.1:192.168.0.0/24"]

  • aws_route.vpn["example-private.1:192.168.0.2/24"]

  • ...


Perhatikan bahwa, karena Anda menggunakan indeks numerik untuk tabel rute Anda, jika Anda mengubah jumlah elemen dalam split var.private_subnets maka itu kemungkinan akan menyebabkan tabel rute menjadi dinomori ulang. Karena jumlahnya adalah bagian dari nama dan namanya adalah bagian dari kunci unik dari setiap instance rute, yang juga akan menyebabkan instance rute dapat dinomori ulang, yang saya sebutkan hanya karena alasan khas menggunakan for_each adalah untuk menghindari yang menunjuk ulang.

Ada kemungkinan desain yang berbeda Anda dapat mengikuti di mana Anda menggambarkan tabel rute Anda menggunakan koleksi objek yang memenuhi dua kriteria untuk for_each Saya dijelaskan di atas, sehingga instance tabel rute juga dapat dinyatakan menggunakan for_each Dengan kunci unik yang bermakna, tetapi itu akan menjadi perubahan yang cukup signifikan di luar ruang lingkup apa yang Anda minta dan jadi saya tidak akan masuk ke detail di sini.

1
Martin Atkins 5 April 2021, 17:39