נתיבי 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 וקידומות on-premises שה-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."
}
}
}
כשהמפה לצד רשימת השיוכים, הוספת יעד מחייבת החלטה איזו תת-רשת נושאת אותו. זו השיחה שהאינדקס הסתיר.
כשל אחר מייצר ערכים חסרי משמעות במקום שגיאת אינדקס. העברת מבנה ברמה נמוכה למקום שבו מצפים לממשק ברמה גבוהה יותר משאירה את השדות שה-API קורא ריקים, וה-CIDR שנוצר אינו שמיש. Terraform מציג את אותה צורה כשמחרוזת מגיעה למקום שבו מצפים לאובייקט. בדקו את סכמת הספק לגבי סוג הארגומנט.
הוכיחו זאת מלקוח
הריצו terraform validate ותוכנית מול מצב אמיתי לפני ההחלה. לאחר מכן השוו את רשימת רשתות היעד של נקודת הקצה עם המפה במקום לסמוך על apply מוצלח.
מבחן הקבלה הוא לקוח מחובר שמגיע לכל קידומת מיועדת.
כלל ההרשאה הוא המקום שבו תצורות רבות עוצרות מוקדם. הוא מוגבל ל-CIDR יעד ולקבוצה, ונתיב בלי הרשאה מתאימה יוצר לקוח מחובר שאינו יכול להגיע לקידומת. בדקו את שני האובייקטים לכל קידומת, כי apply שיוצר את הנתיב ושוכח את הכלל נראה שלם. בדקו עם משתמש אחד בתוך הקבוצה ואחד מחוצה לה.
כשקידומת אחת נכשלת, השוו את רשומת הנתיב שלה לכלל ההרשאה. הרשאה חסרה ונתיב חסר נראים דומים ביומן הלקוח ומתוקנים במשאבים שונים.