مسارات Terraform Client VPN بعدد CIDR أكبر من الشبكات الفرعية
الربط والمسار والتفويض كائنات منفصلة. اربط كل CIDR وجهة بشبكة فرعية مرتبطة بدل فهرسة قائمة شبكات فرعية أقصر.
يتصل حاسوب محمول بنقطة نهاية Client VPN، ويظل terraform apply يفشل على مورد مسار. يحتوي الإعداد عادةً على CIDR وجهة أكثر من الشبكات الفرعية المرتبطة، ويختار كتلة المسار هدفًا بفهرس. يفترض ذلك أن المجموعتين متوازيتان. وهما ليستا كذلك، ويظهر الفشل وقت التطبيق بدلًا من وقت المراجعة.
سمِّ الكائن الذي يفشل
هناك ثلاثة موارد معنية، وكل منها يجيب عن سؤال مختلف. يضع الربط واجهة شبكة نقطة النهاية في شبكة فرعية. يحدد المسار بادئة الوجهة التي تُسلَّم إلى شبكة فرعية هدف. تحدد قاعدة التفويض المستخدمين الذين يجوز لهم الوصول إلى أي بادئة. المسار الذي يشير إلى شبكة فرعية لم تُربط قط يفشل حتى لو وُجد الكائنان، لأن الهدف يجب أن ينتمي إلى نقطة النهاية هذه.
اسرد عمليات الربط أولًا: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.
تذكّر مسار VPC المحلي
يضيف الربط الأول مسارًا محليًا لكامل VPC، لذا كل شبكة فرعية في ذلك VPC يمكن الوصول إليها بالفعل دون مورد مسار. توجد مسارات إضافية لشبكات VPC المترابطة ومرفقات Transit Gateway والبادئات المحلية التي لا يملكها VPC. لهذا يمكن لنقطة نهاية بثلاث عمليات ربط أن تحمل سبعة إدخالات وجهة بشكل مشروع.
احسب الوجهات الواقعة خارج VPC قبل إضافة المسارات. إذا كان هذا العدد أصغر من قائمة CIDR، فالقائمة تصف شبكات فرعية لا تحتاج إلى مسار إطلاقًا.
استبدل الفهرس بخريطة
إحاطة الفهرس بعامل باقٍ تُسكت الخطأ وتحتفظ بخطأ النمذجة. الوجهة التي لا يمكن الوصول إليها عبر الهدف المختار تظل بلا حركة مرور، مهما كان تطبيق الخطة نظيفًا. خزّن العلاقة بدلًا من ذلك، ودع Terraform يتحقق منها قبل إنشاء أي شيء. الكتلة أدناه توضيحية وتستخدم وسائط مسار نقطة النهاية الخاصة بالمزوّد.
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."
}
}
}
مع وجود الخريطة بجانب قائمة الربط، فإن إضافة وجهة تفرض قرارًا بشأن الشبكة الفرعية التي تحملها. هذا هو الحوار الذي كان الفهرس يخفيه.
ينتج فشل مختلف قيمًا غير معقولة بدلًا من خطأ فهرس. تمرير بنية منخفضة المستوى حيث يُتوقع واجهة أعلى مستوى يترك الحقول التي تقرأها الواجهة البرمجية غير معبأة، ويصبح CIDR الناتج غير صالح. يعرض Terraform الشكل نفسه عندما تصل سلسلة نصية حيث يُتوقع كائن. افحص مخطط المزوّد لمعرفة نوع الوسيط.
أثبت ذلك من عميل
شغّل terraform validate وخطة مقابل حالة حقيقية قبل التطبيق. بعد ذلك، قارن قائمة الشبكات الهدف لنقطة النهاية بالخريطة بدلًا من الثقة بتطبيق ناجح.
اختبار القبول هو عميل متصل يصل إلى كل بادئة مقصودة.
قاعدة التفويض هي حيث تتوقف إعدادات كثيرة مبكرًا. وهي محددة النطاق بـ CIDR وجهة ومجموعة، والمسار بدون تفويض مطابق ينتج عميلًا متصلًا لا يستطيع الوصول إلى البادئة. افحص الكائنين لكل بادئة، لأن تطبيقًا ينشئ المسار وينسى القاعدة يبدو مكتملًا. اختبر بمستخدم واحد داخل المجموعة وآخر خارجها.
عندما تفشل بادئة واحدة، قارن إدخال مسارها بقاعدة التفويض. التفويض الناقص والمسار الناقص يبدوان متشابهين في سجل العميل ويُصلحان في موارد مختلفة.