Lesson 4Operate safely

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

  1. Import ต้องทำควบคู่กับอะไรเพื่อให้ปลอดภัย?
  2. prevent_destroy เหมาะกับ resource แบบไหน?
  3. ทำไม Terraform state ต้องถือว่า sensitive?