Import, Lifecycle and Secrets
การใช้ Terraform ในระบบจริงต้องรับมือกับ resource เดิม, drift, replacement risk และ sensitive values ที่อาจไหลลง state
Resource import
Import ใช้ผูก resource ที่มีอยู่แล้วใน AWS เข้ากับ Terraform state เช่น VPC เดิมหรือ IAM Role เดิม ขั้นตอนสำคัญคือเขียน resource block ให้ตรงกับของจริงก่อน import แล้วรัน plan เพื่อดูว่า Terraform จะเปลี่ยนอะไร
import {
to = aws_vpc.main
id = "vpc-0123456789abcdef0"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "existing-vpc"
}
}
Lifecycle meta-arguments
lifecycle ช่วยควบคุม behavior เช่น prevent_destroy สำหรับ resource สำคัญ,
create_before_destroy สำหรับลด downtime และ ignore_changes เมื่อบาง field ถูกจัดการโดยระบบอื่น
resource "aws_db_instance" "main" {
# ...
lifecycle {
prevent_destroy = true
}
}
Drift
Drift เกิดเมื่อ resource จริงไม่ตรงกับ code เช่น มีคนแก้ Security Group ผ่าน Console Terraform plan จะเผย drift บางส่วนได้ แต่ทีมควรลด manual changes ด้วย policy และ CI/CD workflow
Secrets ใน Terraform
อย่าเก็บ secret ลง Git หรือใส่ plaintext เป็น variable ในไฟล์ที่ commit และต้องจำไว้ว่า sensitive flag ช่วยซ่อน output ใน UI/CLI แต่ไม่ได้แปลว่า value จะไม่ถูกเก็บใน state เสมอไป
- ใช้ Secrets Manager หรือ Parameter Store แล้วให้ application อ่านตอน runtime
- หลีกเลี่ยงการ generate password ใน Terraform ถ้าไม่จำเป็น
- จำกัด access ต่อ state backend เพราะ state อาจมี sensitive values
- ใช้ CI/CD secret store สำหรับ values ที่ต้องส่งเข้า Terraform ระหว่าง run
Common mistakes
- Import resource แล้ว apply ทันทีโดยไม่อ่าน plan ทำให้ Terraform replace resource สำคัญ
- ใช้
ignore_changesเพื่อซ่อน drift ที่ควรแก้จริง - คิดว่า
sensitive = trueทำให้ secret ปลอดภัยทั้งหมด
Review questions
- Import ต้องทำควบคู่กับอะไรเพื่อให้ปลอดภัย?
prevent_destroyเหมาะกับ resource แบบไหน?- ทำไม Terraform state ต้องถือว่า sensitive?