ฉันยังอยู่ในสถานะของการย้ายโครงสร้างพื้นฐาน AWS ที่มีอยู่ไปยัง Terraform ดังนั้นฉันจะพยายามอัปเดตคำตอบเมื่อฉันพัฒนา
ฉันพึ่งพาตัวอย่าง Terraform อย่างเป็นทางการและการทดลองและข้อผิดพลาดหลายครั้งเพื่อดึงประเด็นที่ฉันไม่แน่ใจออกมา
.tfstate
ไฟล์
สามารถใช้การกำหนดค่า Terraform เพื่อจัดเตรียมกล่องจำนวนมากบนโครงสร้างพื้นฐานที่แตกต่างกันซึ่งแต่ละกล่องอาจมีสถานะที่แตกต่างกัน เนื่องจากสามารถดำเนินการโดยคนหลายคนสถานะนี้ควรอยู่ในตำแหน่งที่รวมศูนย์ (เช่น S3) แต่ไม่ใช่คอมไพล์
นี้สามารถยืนยันได้มองหาที่ .gitignore
terraform
การควบคุมของนักพัฒนา
เป้าหมายของเราคือให้การควบคุมโครงสร้างพื้นฐานแก่นักพัฒนามากขึ้นในขณะที่รักษาการตรวจสอบทั้งหมด (บันทึกคอมไพล์) และความสามารถในการตรวจสอบการเปลี่ยนแปลง (คำขอดึง) ด้วยเหตุนี้เวิร์กโฟลว์โครงสร้างพื้นฐานใหม่ที่ฉันตั้งเป้าไว้คือ:
- รากฐานพื้นฐานของ AMI ทั่วไปที่มีโมดูลที่ใช้ซ้ำได้เช่นหุ่นเชิด
- โครงสร้างพื้นฐานหลักที่ DevOps จัดเตรียมโดยใช้ Terraform
- นักพัฒนาเปลี่ยนแปลงการกำหนดค่า Terraform ใน Git ตามต้องการ (จำนวนอินสแตนซ์ VPC ใหม่การเพิ่มภูมิภาค / โซนความพร้อมใช้งาน ฯลฯ )
- ผลักดันการกำหนดค่า Git และคำขอดึงที่ส่งให้สมาชิกของทีม DevOps ตรวจสอบความถูกต้อง
- หากได้รับอนุมัติให้เรียก webhook ไปที่ CI เพื่อสร้างและปรับใช้ (ไม่แน่ใจว่าจะแบ่งพาร์ติชันหลายสภาพแวดล้อมอย่างไรในขณะนี้)
แก้ไข 1 - อัปเดตสถานะปัจจุบัน
ตั้งแต่เริ่มคำตอบนี้ฉันได้เขียนรหัส TF จำนวนมากและรู้สึกสบายใจมากขึ้นในสถานการณ์ของเรา เราพบข้อบกพร่องและข้อ จำกัด ระหว่างทาง แต่ฉันยอมรับว่านี่เป็นลักษณะของการใช้ซอฟต์แวร์ใหม่ที่เปลี่ยนแปลงอย่างรวดเร็ว
เค้าโครง
เรามีโครงสร้างพื้นฐาน AWS ที่ซับซ้อนพร้อมด้วย VPC หลายตัวแต่ละตัวมีเครือข่ายย่อยหลายเครือข่าย กุญแจสำคัญในการจัดการสิ่งนี้อย่างง่ายดายคือการกำหนดอนุกรมวิธานที่ยืดหยุ่นซึ่งครอบคลุมภูมิภาคสภาพแวดล้อมบริการและเจ้าของซึ่งเราสามารถใช้เพื่อจัดระเบียบรหัสโครงสร้างพื้นฐานของเรา (ทั้งพื้นดินและหุ่น)
โมดูล
ขั้นตอนต่อไปคือการสร้างที่เก็บ git เดียวเพื่อจัดเก็บโมดูล Terraform ของเรา โครงสร้าง dir ระดับบนสุดของเราสำหรับโมดูลมีลักษณะดังนี้:
tree -L 1 .
ผลลัพธ์:
├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates
แต่ละคนตั้งค่าเริ่มต้นที่ดี แต่แสดงให้เห็นว่าเป็นตัวแปรที่ "กาว" ของเราสามารถเขียนทับได้
กาว
เรามีที่เก็บข้อมูลที่สองglue
ซึ่งใช้ประโยชน์จากโมดูลที่กล่าวถึงข้างต้น วางไว้ตามเอกสารอนุกรมวิธานของเรา:
.
├── README.md
├── clientA
│ ├── eu-west-1
│ │ └── dev
│ └── us-east-1
│ └── dev
├── clientB
│ ├── eu-west-1
│ │ ├── dev
│ │ ├── ec2-keys.tf
│ │ ├── prod
│ │ └── terraform.tfstate
│ ├── iam.tf
│ ├── terraform.tfstate
│ └── terraform.tfstate.backup
└── clientC
├── eu-west-1
│ ├── aws.tf
│ ├── dev
│ ├── iam-roles.tf
│ ├── ec2-keys.tf
│ ├── prod
│ ├── stg
│ └── terraform.tfstate
└── iam.tf
ภายในระดับไคลเอนต์เรามี.tf
ไฟล์เฉพาะของบัญชี AWS ที่จัดเตรียมทรัพยากรทั่วโลก (เช่นบทบาท IAM) ต่อไปคือระดับภูมิภาคที่มีคีย์สาธารณะ EC2 SSH สุดท้ายในสภาพแวดล้อมของเรา ( dev
, stg
, prod
ฯลฯ ) จะ VPC การตั้งค่าการสร้างอินสแตนซ์และ peering การเชื่อมต่อของเรา ฯลฯ จะถูกเก็บไว้
หมายเหตุด้านข้าง:อย่างที่คุณเห็นฉันกำลังต่อต้านคำแนะนำของตัวเองข้างต้นterraform.tfstate
ในการคอมไพล์ นี่เป็นมาตรการชั่วคราวจนกว่าฉันจะย้ายไปใช้ S3 แต่เหมาะกับฉันเพราะตอนนี้ฉันเป็นนักพัฒนาเพียงคนเดียว
ขั้นตอนถัดไป
นี่ยังคงเป็นกระบวนการแบบแมนนวลและยังไม่ได้อยู่ใน Jenkins แต่เรากำลังย้ายโครงสร้างพื้นฐานที่ค่อนข้างใหญ่ซับซ้อนและจนถึงตอนนี้ก็ดี อย่างที่บอกข้อบกพร่องน้อย แต่ไปได้ดี!
แก้ไข 2 - การเปลี่ยนแปลง
เป็นเวลาเกือบหนึ่งปีแล้วที่ฉันเขียนคำตอบเริ่มต้นนี้และสถานะของ Terraform และตัวฉันเองก็เปลี่ยนไปอย่างมาก ตอนนี้ฉันในตำแหน่งใหม่โดยใช้ terraform การจัดการคลัสเตอร์ Azure และ terraform v0.10.7
อยู่ในขณะนี้
สถานะ
มีคนบอกฉันหลายครั้งว่าไม่ควรเข้า Git - และถูกต้อง เราใช้สิ่งนี้เป็นมาตรการชั่วคราวกับทีมงานสองคนที่อาศัยการสื่อสารและระเบียบวินัยของนักพัฒนา ด้วยทีมงานที่มีขนาดใหญ่ขึ้นเราจึงใช้ประโยชน์จากสถานะระยะไกลใน S3 ได้อย่างเต็มที่ด้วยการล็อกโดย DynamoDB ตามหลักการแล้วสิ่งนี้จะถูกย้ายไปที่กงสุลตอนนี้เป็น v1.0 เพื่อตัดผู้ให้บริการคลาวด์ข้าม
โมดูล
ก่อนหน้านี้เราได้สร้างและใช้โมดูลภายใน ยังคงเป็นเช่นนั้น แต่ด้วยการถือกำเนิดและการเติบโตของรีจิสทรี Terraformเราจึงพยายามใช้สิ่งเหล่านี้เป็นฐานอย่างน้อยที่สุด
โครงสร้างไฟล์
ตำแหน่งใหม่มีอนุกรมวิธานง่ายมากมีเพียงสองสภาพแวดล้อม infx - และdev
prod
แต่ละตัวมีตัวแปรและเอาต์พุตของตัวเองโดยนำโมดูลของเราที่สร้างไว้ด้านบนกลับมาใช้ใหม่ remote_state
ผู้ให้บริการยังช่วยในการเอาท์พุทใช้ทรัพยากรร่วมกันสร้างขึ้นระหว่างสภาพแวดล้อม สถานการณ์ของเราคือโดเมนย่อยในกลุ่มทรัพยากร Azure ที่แตกต่างกันไปจนถึง TLD ที่มีการจัดการทั่วโลก
├── main.tf
├── dev
│ ├── main.tf
│ ├── output.tf
│ └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf
การวางแผน
อีกครั้งด้วยความท้าทายพิเศษของทีมแบบกระจายตอนนี้เราบันทึกผลลัพธ์ของterraform plan
คำสั่งไว้เสมอ เราสามารถตรวจสอบและรู้ว่าจะดำเนินการอะไรโดยไม่ต้องเสี่ยงกับการเปลี่ยนแปลงบางอย่างระหว่างขั้นตอนplan
และapply
ขั้นตอน (แม้ว่าการล็อกจะช่วยในเรื่องนี้ก็ตาม) อย่าลืมลบไฟล์แผนนี้เนื่องจากอาจมีตัวแปร "ความลับ" ที่เป็นข้อความธรรมดา
โดยรวมแล้วเรามีความสุขมากกับ Terraform และยังคงเรียนรู้และปรับปรุงคุณสมบัติใหม่ที่เพิ่มเข้ามา