Rute Terraform Client VPN dengan CIDR Lebih Banyak daripada Subnet
Asosiasi, rute, dan otorisasi adalah objek terpisah. Petakan setiap CIDR tujuan ke subnet yang terkait alih-alih mengindeks daftar subnet yang lebih pendek.
Sebuah laptop terhubung ke endpoint Client VPN, dan terraform apply tetap gagal pada resource rute. Konfigurasi biasanya memiliki lebih banyak CIDR tujuan daripada subnet terkait, dan blok rute memilih target dengan indeks. Itu mengasumsikan kedua koleksi sejajar. Keduanya tidak, dan kegagalan muncul saat penerapan, bukan saat peninjauan.
Namai objek yang gagal
Tiga resource terlibat dan masing-masing menjawab pertanyaan berbeda. Asosiasi menempatkan antarmuka jaringan endpoint di sebuah subnet. Rute menyatakan prefix tujuan mana yang dikirim ke subnet target. Aturan otorisasi menyatakan pengguna mana yang boleh mencapai prefix mana. Rute yang menunjuk ke subnet yang tidak pernah diasosiasikan gagal meskipun kedua objek ada, karena target harus menjadi milik endpoint ini.
Daftarkan asosiasinya terlebih dahulu: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.
Ingat rute lokal VPC
Asosiasi pertama menambahkan rute lokal untuk seluruh VPC, jadi setiap subnet di VPC itu sudah dapat dijangkau tanpa resource rute. Rute tambahan ada untuk VPC yang di-peer, lampiran Transit Gateway, dan prefix on-premises yang tidak dimiliki VPC. Itulah sebabnya endpoint dengan tiga asosiasi dapat secara sah membawa tujuh entri tujuan.
Hitung tujuan yang berada di luar VPC sebelum menambahkan rute. Jika hitungan itu lebih kecil dari daftar CIDR, daftar tersebut menjelaskan subnet yang tidak memerlukan rute sama sekali.
Ganti indeks dengan peta
Membungkus indeks dalam operator modulo membungkam kesalahan dan mempertahankan kesalahan pemodelan. Tujuan yang tidak dapat dicapai melalui target yang dipilih tetap tidak membawa lalu lintas, sebersih apa pun rencananya diterapkan. Simpan hubungannya sebagai gantinya, dan biarkan Terraform memeriksanya sebelum membuat apa pun. Blok di bawah ini bersifat ilustratif dan menggunakan argumen rute endpoint dari penyedia.
variable "client_vpn_destinations" {
description = "Destination CIDR mapped to an associated subnet key"
type = map(string)
}
resource "aws_ec2_client_vpn_route" "this" {
for_each = var.client_vpn_destinations
client_vpn_endpoint_id = aws_ec2_client_vpn_endpoint.this.id
destination_cidr_block = each.key
target_vpc_subnet_id = aws_subnet.private[each.value].id
lifecycle {
precondition {
condition = contains(keys(aws_subnet.private), each.value)
error_message = "Route target must be a subnet key in the associated map."
}
}
}
Dengan peta di samping daftar asosiasi, menambahkan tujuan memaksa keputusan tentang subnet mana yang membawanya. Itulah percakapan yang disembunyikan oleh indeks.
Kegagalan lain menghasilkan nilai tidak masuk akal alih-alih kesalahan indeks. Meneruskan konstruksi tingkat rendah di tempat antarmuka tingkat tinggi diharapkan membuat bidang yang dibaca API tidak terisi, dan CIDR yang dihasilkan tidak dapat digunakan. Terraform menunjukkan bentuk yang sama ketika string tiba di tempat objek diharapkan. Periksa skema penyedia untuk tipe argumen.
Buktikan dari klien
Jalankan terraform validate dan rencana terhadap keadaan nyata sebelum menerapkan. Setelah itu, bandingkan daftar jaringan target endpoint dengan peta alih-alih memercayai apply yang berhasil.
Uji penerimaan adalah klien terhubung yang mencapai setiap prefix yang dimaksud.
Aturan otorisasi adalah tempat banyak penyiapan berhenti lebih awal. Cakupannya adalah CIDR tujuan dan grup, dan rute tanpa otorisasi yang cocok menghasilkan klien terhubung yang tidak dapat mencapai prefix. Periksa kedua objek untuk setiap prefix, karena apply yang membuat rute dan melupakan aturan tampak lengkap. Uji dengan satu pengguna di dalam grup dan satu di luarnya.
Ketika satu prefix gagal, bandingkan entri rutenya dengan aturan otorisasi. Otorisasi yang hilang dan rute yang hilang terlihat serupa di log klien dan diperbaiki di resource yang berbeda.