กำไร:
- Ability to understand the IaC concept and Terraform's working cycle (init, plan, apply, state, module) and have artificial intelligence produce safe HCL drafts
- ความสามารถในการตรวจสอบการเปลี่ยนแปลงแต่ละครั้งด้วยแผนก่อนที่จะนำไปใช้และตรวจจับเส้นทำลาย/แทนที่ที่ไม่คาดคิด
- ความสามารถในการใช้หลักการรักษาความลับไม่ให้โค้ด รักษาสถานะให้ปลอดภัย และลดสิทธิ์ IAM ให้เหลือน้อยที่สุด
ในอดีต การตั้งค่าเซิร์ฟเวอร์เป็นเรื่องของการคลิกผ่านแผงคลาวด์: สร้างเครื่องเสมือน ตั้งค่าเครือข่าย เพิ่มกฎความปลอดภัย วิธีการนี้ช้า ผิดพลาดได้ง่าย และไม่สามารถทำซ้ำได้ แทบจะเป็นไปไม่ได้เลยที่จะตั้งค่าสภาพแวดล้อมเดิมเป็นครั้งที่สอง ปัจจุบันโครงสร้างพื้นฐานได้รับการจัดการในรูปแบบโค้ด IaC (โครงสร้างพื้นฐานเป็นโค้ด) เป็นแนวทางในการอธิบายทรัพยากรระบบคลาวด์ เช่น เซิร์ฟเวอร์ เครือข่าย และฐานข้อมูลในไฟล์ข้อความแทนที่จะอธิบายด้วยตนเอง ไฟล์เหล่านี้อยู่ในการควบคุมเวอร์ชัน (Git); คุณสามารถเห็นได้ว่าใครเปลี่ยนแปลงอะไร เมื่อใด และอะไร; คุณสามารถตั้งค่าโครงสร้างพื้นฐานเดียวกันได้หลายครั้งในลักษณะเดียวกันทุกประการด้วยคำสั่งเดียว
เครื่องมือ IaC ที่พบบ่อยที่สุดคือ Terraform Terraform ใช้คำจำกัดความที่คุณเขียนในภาษาที่อ่านได้ที่เรียกว่า HCL (HashiCorp Configuration Language — ภาษาการกำหนดค่าของ Terraform) แปลเป็น API ของผู้ให้บริการคลาวด์ (AWS, Azure, GCP) และสร้างทรัพยากร AI รู้จัก HCL เป็นอย่างดีและสร้างบล็อกที่ซับซ้อนได้อย่างรวดเร็ว แต่ใน IaC ความผิดพลาดมีค่าใช้จ่ายสูง คำจำกัดความที่ผิดเพียงคำเดียวสามารถล้างฐานข้อมูลที่ใช้งานจริงทั้งหมดได้ นั่นเป็นเหตุผลว่าทำไมกฎทองใน Terraform คือการเห็นทุกการเปลี่ยนแปลงด้วย 'แผน' ก่อนที่จะนำไปใช้
รันไทม์ของ Terraform
Terraform ทำงานร่วมกับคำสั่งพื้นฐานสามคำสั่ง การรู้ว่าสิ่งเหล่านี้เป็นข้อกำหนดเบื้องต้นสำหรับการควบคุมเอาต์พุต AI:
- `terraform init`: เริ่มโปรเจ็กต์ ดาวน์โหลดปลั๊กอินของผู้ให้บริการที่จำเป็น
- `แผนพื้นผิว`: เปรียบเทียบสถานการณ์ปัจจุบันกับสถานการณ์ที่ต้องการ และแสดงสิ่งที่ควรเพิ่ม สิ่งที่ต้องเปลี่ยนแปลง สิ่งที่ควรลบ ไม่ได้ปฏิบัติอะไรเลย เป็นขั้นตอนการรักษาความปลอดภัยที่สำคัญที่สุด
- `ใช้พื้นผิว`: ใช้แผนจริงโดยสร้าง/แก้ไขทรัพยากร
นอกจากนี้ แนวคิดสองประการยังมีความสำคัญอีกด้วย สถานะ (ไฟล์สถานะ): นี่คือไฟล์ที่ Terraform เก็บสถานะปัจจุบันของทรัพยากรที่จัดการ โดยปกติแล้วจะถูกจัดเก็บไว้ในโกดังระยะไกลและล็อคไว้ เพื่อให้คนสองคนไม่สามารถเปลี่ยนแปลงหรือทำลายมันในเวลาเดียวกันได้ โมดูล: แพ็คเกจการกำหนดค่าที่ใช้ซ้ำได้; ตัวอย่างเช่น คุณสามารถใช้โมดูล "ตั้งค่าเครือข่าย" ในหลายโครงการ
เคล็ดลับ: สัญญาณที่อันตรายที่สุดในเอาต์พุต Terraform คือเส้นทำลายหรือ -/+ (แทนที่) ในเอาต์พุตแผน ซึ่งหมายความว่าทรัพยากรจะถูกลบ หากคุณเห็นการทำลายแบบไม่คาดคิดในแผน อย่าสมัครเลย ให้ทำความเข้าใจก่อนว่าเหตุใดจึงปรากฏขึ้น
ทีละขั้นตอน: การเขียน IaC ด้วย AI
- ชี้แจงโครงสร้างพื้นฐานที่ต้องการ เป็นรูปธรรมเช่น "หนึ่ง VPC, สองเครือข่ายย่อย, หนึ่งกลุ่มความปลอดภัย และหนึ่ง t3.micro EC2 บน eu-central-1"
- ระบุผู้ให้บริการและเวอร์ชัน คลาวด์ใด Terraform และเวอร์ชันผู้ให้บริการใด หากคุณไม่ระบุเวอร์ชัน AI อาจส่งคืนไวยากรณ์ที่ล้าสมัย/เข้ากันไม่ได้
- มีการผลิตแบบร่าง HCL ขอตัวแปรและเอาต์พุตด้วย
- เอาความลับออกไป ค่าต่างๆ เช่น รหัสผ่านและคีย์ ควรไปที่ตัวแปรและห้องนิรภัย ไม่ใช่ไปที่โค้ด
- เรียกใช้ `init` + `plan` อ่านผลลัพธ์ของแผนทีละบรรทัด ตรวจสอบการลบที่ไม่คาดคิด
- เริ่มจากเล็กๆ ค่อยๆ ปฏิบัติ นำไปใช้ในบัญชีทดสอบ/สภาพแวดล้อมที่แยกออกมาก่อน
ความปลอดภัย: ความเสี่ยงเฉพาะของ IaC
IaC มีความเสี่ยงพอๆ กับความทรงพลัง จุดวิกฤติสามจุด:
- มีความลับอยู่ในไฟล์สถานะ บางครั้งสถานะ Terraform จะเก็บค่าที่ละเอียดอ่อน เช่น รหัสผ่านฐานข้อมูล ไว้ในรูปแบบข้อความธรรมดา ห้ามวาง State ไว้ในที่เก็บข้อมูลสาธารณะ ใช้แบ็กเอนด์ระยะไกลที่เข้ารหัสและจำกัดการเข้าถึง
- อย่าฝังความลับใน HCL บรรทัดเช่นรหัสผ่าน = "prod123" จะถูกเขียนลงในประวัติ Git อย่างถาวร ให้ใช้ตัวแปรและกำหนดค่าขณะรันไทม์จากตัวแปรสภาพแวดล้อม (TF_VAR_...) หรือ Secret Vault แทน
- การอนุญาต IAM ที่กว้างมาก บางครั้ง AI จะสร้างบล็อกเช่น Action: "*" (อนุญาตทุกอย่าง) เพื่อ "ทำให้มันใช้งานได้" นี่คือช่องโหว่ จำกัดการอนุญาตให้เหลือขั้นต่ำที่จำเป็น
ข้อควรพิจารณา: เมื่อข้อมูลลับเข้าสู่ประวัติ Git ข้อมูลนั้นจะยังคงอยู่ในอดีตและสามารถถูกบุกรุกได้ แม้ว่าคุณจะลบไฟล์ก็ตาม หากคุณกระทำโดยไม่ได้ตั้งใจ ให้ยกเลิกและสับเปลี่ยนข้อมูลลับทันที แค่ลบยังไม่พอ
ตารางสัญญาณแผนการเสี่ยง
วางแผนการพิมพ์
ความหมาย
จะทำอย่างไร
+สร้าง
ทรัพยากรใหม่จะถูกเพิ่ม
โดยทั่วไปแล้วปลอดภัย โปรดตรวจสอบ
~ อัปเดตในสถานที่
แหล่งที่มาจะเปลี่ยนในสถานที่
ตรวจสอบผลกระทบ (จะมีการหยุดทำงานหรือไม่)
-/+ แทนที่
จะถูกลบและสร้างใหม่
ข้อควรระวัง: ข้อมูลอาจสูญหายได้
- ทำลาย
ทรัพยากรจะถูกทำลาย
หยุด: อย่าสมัครหากคุณไม่ได้คาดหวัง
มินิเคสสามอัน
กรณีที่ 1 — ทำงาน 2 วันใน 3 ชั่วโมง ทีมหนึ่งกำลังจะเขียน Terraform เพื่อตั้งค่าสภาพแวดล้อมการทดสอบใหม่ (VPC, ซับเน็ต, ฐานข้อมูล RDS, คลัสเตอร์ ECS) แต่พวกเขาเพิ่งย้ายไปยัง HCL พวกเขาอธิบายสถาปัตยกรรมและเวอร์ชันให้กับ AI และสร้างพิมพ์เขียวแบบโมดูลาร์ พวกเขาตรวจสอบแต่ละโมดูลตามแผนและดำเนินการภายใน 3 ชั่วโมง พวกเขาจะใช้เวลาสองวันในการลองผิดลองถูกด้วยตนเอง
กรณีที่ 2 — แผนถูกลบ วิศวกรคนหนึ่งดำเนินการตามแผนโดยไม่ใช้โค้ดอัปเดตที่สร้างโดย AI เอาต์พุตมี -/+ แทนที่สำหรับฐานข้อมูลที่ใช้งานจริง - AI พยายามแทนที่ฟิลด์ที่ไม่สามารถแทนที่ได้ ซึ่งหมายถึงการลบและสร้างฐานข้อมูลใหม่ วิศวกรหยุดใช้และเปลี่ยนวิธีการที่ปลอดภัย นิสัยในการวางแผนป้องกันภัยพิบัติ
กรณีที่ 3 – ความลับที่ถูกฝังไว้รั่วไหล รุ่นน้อง YZ ออก db_password = "S3cret!" เขากำหนดเส้นตามที่เป็นอยู่และผลักมัน ติดอยู่ในการตรวจสอบโค้ด รหัสผ่านถูกยกเลิกและเปลี่ยนทันที ค่าถูกย้ายไปยังตัวแปรและป้อนจากห้องนิรภัยลับ บทเรียน: ไม่มีความลับแบบธรรมดาใน HCL
เทมเพลตที่สามารถคัดลอกได้สี่แบบ
1) การสร้างร่างโครงสร้างพื้นฐาน:
เขียนโครงสร้างพื้นฐานต่อไปนี้บน [CLOUD: AWS] ด้วย Terraform (เวอร์ชัน ~> 1.7): [รายการแหล่งที่มา] ภูมิภาค [X] กฎ:- ทำให้ค่าที่ละเอียดอ่อนทั้งหมดเป็นตัวแปร อย่าฝังไว้ใน HCL- แก้ไขเวอร์ชันของผู้ให้บริการ (required_providers)- ลดสิทธิ์ IAM ให้เหลือน้อยที่สุด อย่าใช้ "*"- ส่งกลับ [X, Y] เป็นเอาต์พุต ให้โค้ดแบบแยกส่วนและมีคำอธิบาย
2) การตีความผลลัพธ์ของแผน:
วิเคราะห์ผลลัพธ์ 'แผนภูมิประเทศ' ด้านล่าง ระบุรายชื่อฉัน:(1) ทรัพยากรใดบ้างที่ถูกเพิ่ม/เปลี่ยนแปลง/ลบ,(2) แถวที่เสี่ยงต่อการสูญหายหรือการหยุดชะงักของข้อมูล,(3) คำถาม 3 ข้อที่ฉันควรถามก่อนสมัคร แผน: [เอาต์พุต]
3) ตรวจสอบ HCL ที่มีอยู่เพื่อความปลอดภัย:
ตรวจสอบรหัส Terraform ต่อไปนี้เพื่อความปลอดภัย: ข้อมูลลับแบบฝัง, สิทธิ์ IAM ที่กว้างเกินไป, กฎเครือข่ายแบบเปิด (0.0.0.0/0), พื้นที่เก็บข้อมูลที่ไม่ได้เข้ารหัส เขียนสิ่งที่ค้นพบแต่ละข้อตามลำดับความสำคัญและแก้ไข รหัส: [HCL]
4) แปลงรหัสซ้ำเป็นโมดูล:
แปลงโค้ด Terraform ที่ซ้ำกันต่อไปนี้ให้เป็นโมดูลที่นำมาใช้ซ้ำได้: ค่าใดควรเป็นตัวแปร ส่วนต่อประสานของโมดูลควรเป็นอย่างไร แสดงตัวอย่างการใช้งานด้วย รหัส: [HCL]
พรอมต์อ่อน / พรอมต์แข็งแกร่ง
จุดอ่อน: "สร้างฐานข้อมูลด้วย Terraform"
ผลลัพธ์: ไม่ชัดเจนว่าคลาวด์ใด เอ็นจิ้นใด เวอร์ชันใด เข้ารหัสหรือไม่ ด้วยไวยากรณ์แบบเดิม AI สามารถจัดเตรียมตัวอย่างที่เปิดเผยต่อสาธารณะซึ่งฝังรหัสผ่านลงในโค้ด
แข็งแกร่ง: "สร้างอินสแตนซ์ RDS PostgreSQL 15 บน AWS ด้วย Terraform ~> 1.7 สร้างตัวแปรรหัสผ่าน อย่าฝังไว้ในโค้ด พื้นที่เก็บข้อมูลได้รับการเข้ารหัส เข้าถึงได้จากซับเน็ตส่วนตัวเท่านั้น ไม่ใช่แบบสาธารณะ แก้ไขเวอร์ชันของผู้ให้บริการ ส่งคืนจุดสิ้นสุดเป็นเอาต์พุต"
ความแตกต่าง: พรอมต์ที่สองระบุกลไก เวอร์ชัน การเข้ารหัส ข้อจำกัดของเครือข่าย และกฎลับ — เอาต์พุตมีความปลอดภัยและใกล้เคียงกับผลิตภัณฑ์
ข้อผิดพลาดทั่วไป
- เพื่อ `นำไปใช้' โดยไม่ต้องจัดทำ 'แผน' ข้อผิดพลาดที่แพงที่สุดใน IaC วางแผนก่อนเสมอ
- การฝังความลับใน HCL สร้างการรั่วไหลอย่างถาวรในประวัติ Git
- การจัดเก็บรัฐไม่ปลอดภัย สถานะสาธารณะที่ไม่ได้เข้ารหัสและปลดล็อคถือเป็นหายนะ
- ไม่ได้แก้เวอร์ชั่น.. การใช้ผู้ให้บริการโดยไม่ระบุเวอร์ชันจะทำให้เกิดความล้มเหลวอย่างกะทันหันในอนาคต
- *`การดำเนินการ: การอนุญาตแบบกว้างๆ เช่น ""`** ละเมิดหลักการของสิทธิพิเศษน้อยที่สุด
- ละเลย 'การทำลาย' ที่ไม่คาดคิด การใช้บรรทัดลบในแผนโดยไม่ต้องตั้งคำถาม
โดยสรุป
IaC เปลี่ยนโครงสร้างพื้นฐานให้เป็นโค้ดที่ทำซ้ำได้ กำหนดเวอร์ชันได้ และตรวจสอบได้ เครื่องมือที่พบบ่อยที่สุดคือ Terraform AI สร้าง HCL stub อย่างรวดเร็ว แต่คุณต้องระบุเวอร์ชัน รายละเอียดเฉพาะคลาวด์ และกฎความปลอดภัย กฎที่ไม่มีข้อผิดพลาดใน Terraform: เพื่อดูทุกการเปลี่ยนแปลงตามแผน เพื่อค้นหาการลบที่ไม่คาดคิด เพื่อเก็บความลับให้ห่างจากโค้ด และเพื่อรักษาสถานะให้ปลอดภัย บรรทัดทำลายและแทนที่ในเอาต์พุตแผนคือตำแหน่งที่ควรอ่านอย่างระมัดระวังที่สุด
งานสมัคร
ให้ AI สร้างโครงสร้างพื้นฐานขนาดเล็ก (เช่น บัคเก็ตการจัดเก็บข้อมูลและนโยบายการเข้าถึง) โดยใช้เทมเพลต "สร้างภาพร่างโครงสร้างพื้นฐาน" ด้านบน จากนั้น: (1) ให้เทมเพลต "vetting" ตรวจสอบความลับหรือการอนุญาต * ที่ฝังอยู่ในโค้ด (2) หากเป็นไปได้ ให้รัน init + plan ในบัญชีทดสอบ และอ่านผลลัพธ์ของแผนด้วยเทมเพลต "การตีความแผน" (3) บันทึกการลบ/การเปลี่ยนแปลงที่ไม่คาดคิด
รายการตรวจสอบ
- [ ] ฉันเพิ่มคลาวด์, Terraform/เวอร์ชันของผู้ให้บริการ และข้อจำกัดด้านการเข้ารหัส/เครือข่ายในข้อความแจ้งของฉัน
- [ ] ไม่มีความลับแบบข้อความธรรมดาในโค้ด ตัวแปรค่าความแม่นยำ
- [ ] ฉันจำกัด IAM/สิทธิ์ให้แคบลงให้เหลือเพียงสิทธิ์ขั้นต่ำ * ฉันไม่ได้ใช้
- [ ] ฉันวางแผนก่อนสมัครและอ่านผลลัพธ์ทีละบรรทัด
- [ ] ฉันตรวจสอบแล้วว่าไม่มีการทำลาย/ทดแทนโดยไม่คาดคิดในแผน
- [ ] ฉันแน่ใจว่าสถานะถูกเก็บไว้ในแบ็กเอนด์ที่เข้ารหัส ล็อค และถูกจำกัด