ตั้งค่า AWS Provider ใน Terraform อย่างปลอดภัย

AWS Provider เป็นปลั๊กอินที่ทำให้ Terraform สื่อสารกับ API ของ Amazon Web Services ได้ ครอบคลุมทรัพยากรหลักทุกประเภท ทั้ง EC2, S3, RDS, VPC, IAM และอีกนับพัน resource types การเชื่อมต่อที่ถูกต้องตั้งแต่ต้นจะช่วยให้ pipeline ที่เขียนต่อไปมีความเสถียร ลดปัญหาเรื่อง credentials หมดอายุ หรือ region ผิดตอน apply

บทความนี้จะสรุปวิธีตั้งค่า AWS Provider อย่างปลอดภัย ตั้งแต่การจัดเตรียม IAM User สำหรับ automation การตั้งค่า credential ด้วยวิธีที่หลากหลาย การกำหนด region การใช้ assume role สำหรับข้าม account และการทดสอบการเชื่อมต่อก่อนใช้งาน production

เตรียม IAM User สำหรับ Automation

ขั้นตอนแรกที่สำคัญคือสร้าง IAM User แยกต่างหากสำหรับงาน automation โดยไม่ใช้ root account เด็ดขาด การแบ่ง user ช่วยให้จำกัดสิทธิ์ตาม least privilege และติดตาม audit log ได้ชัดเจน หากกุญแจรั่วไหลก็ revoke เฉพาะ user ตัวนั้นได้ทันที

  • เข้า IAM Console → Users → Create user
  • ตั้งชื่อเช่น terraform-deploy และเลือก Programmatic access
  • กำหนด IAM Policy ตามขอบเขตที่จะใช้งาน (หลีกเลี่ยง AdministratorAccess ถ้าไม่จำเป็น)
  • สร้าง Access Key และ Secret Access Key เก็บไว้ในที่ปลอดภัย

Provider Block พื้นฐาน

ในโฟลเดอร์โปรเจกต์ สร้างไฟล์ provider.tf (หรือชื่ออื่นที่ลงท้ายด้วย .tf) แล้วกำหนด provider block โดยระบุ region ที่ต้องการ หาก version จะถูก resolve จาก Terraform Registry อัตโนมัติขณะ terraform init

terraform {
  required_version = ">= 1.5"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.60"
    }
  }
}

provider "aws" {
  region = "ap-southeast-1"
}

วิธีตั้งค่า Credentials ที่แนะนำ

AWS Provider ค้นหา credentials ตามลำดับชัดเจน ตั้งแต่ environment variable ไปจนถึง shared config file และ IAM Role ของเครื่อง การเลือกวิธีที่เหมาะจะช่วยไม่ให้ secret รั่วไปอยู่ใน git repository

Environment Variable (เหมาะกับ CI/CD)

export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_REGION="ap-southeast-1"

terraform init
terraform plan

Shared Credentials File (เหมาะกับเครื่องพัฒนา)

ใช้ AWS CLI configure ครั้งเดียวแล้วไฟล์ credentials จะถูกเก็บใน ~/.aws/credentials พร้อม profile ที่แยกตามบัญชี เหมาะสำหรับนักพัฒนาที่ต้องสลับระหว่างหลาย account

aws configure --profile terraform-dev

# provider.tf
provider "aws" {
  region  = "ap-southeast-1"
  profile = "terraform-dev"
}

IAM Role (เหมาะกับ EC2/ECS ที่รัน Terraform)

หากรัน Terraform บน EC2 หรือ ECS ภายใน AWS แนะนำให้ attach IAM Role เข้ากับ instance แทนการเก็บ access key เลย วิธีนี้ปลอดภัยที่สุดเพราะ AWS จะหมุน credential ให้อัตโนมัติและไม่มี secret ค้างในไฟล์ใด ๆ

การใช้ Assume Role ข้าม Account

องค์กรขนาดใหญ่มักแบ่ง AWS หลาย account ตามทีมหรือสภาพแวดล้อม (dev/stage/prod) การใช้ assume role ช่วยให้ user เดียวสามารถเข้าถึง account อื่นผ่าน trust relationship ได้โดยไม่ต้องสร้าง key หลายชุด

provider "aws" {
  region = "ap-southeast-1"

  assume_role {
    role_arn     = "arn:aws:iam::123456789012:role/TerraformDeploy"
    session_name = "terraform-session"
    external_id  = "SharedSecretId"
  }
}

การระบุหลาย Region ด้วย Alias

หากต้องจัดการทรัพยากรในหลาย region ภายในโปรเจกต์เดียวกัน ใช้ alias แยก provider ออกเป็นหลายตัวได้ ทุก resource ที่ไม่ได้ระบุจะไปยัง default provider และ resource ที่ต้องการ region อื่นให้กำหนด provider argument

provider "aws" {
  region = "ap-southeast-1"
}

provider "aws" {
  alias  = "tokyo"
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "log_tokyo" {
  provider = aws.tokyo
  bucket   = "my-log-bucket-tokyo"
}

ทดสอบการเชื่อมต่อ

ก่อน apply resource จริง ทดสอบด้วย data source ที่ไม่มีผลข้างเคียง เช่นดึงข้อมูล caller identity เพื่อยืนยันว่า credential ทำงานได้จริง

data "aws_caller_identity" "current" {}

output "account_id" {
  value = data.aws_caller_identity.current.account_id
}

output "user_id" {
  value = data.aws_caller_identity.current.user_id
}

รัน terraform init ตามด้วย terraform plan หากไม่ได้รับ error และแสดง output account_id ตรงกับที่คาดไว้ แสดงว่าเชื่อมต่อสำเร็จ

แนวทางความปลอดภัย

  • ไม่ hardcode access key ใน .tf file เด็ดขาด ใช้ environment variable หรือ IAM Role เสมอ
  • เพิ่ม .terraform/, *.tfstate, *.tfvars ใน .gitignore
  • กำหนด IAM Policy แบบ least privilege ระบุ resource ARN ให้ชัดเจน
  • เปิด CloudTrail เพื่อบันทึกทุก API call ที่เกิดจาก provider
  • สลับ key ประจำ อย่างน้อย 90 วันต่อครั้ง ผ่าน IAM rotation policy

สรุป

การตั้งค่า AWS Provider เริ่มจากสร้าง IAM User แยกสำหรับ automation กำหนด provider block ระบุ region และเลือกวิธี credential ให้เหมาะกับสภาพแวดล้อม ใช้ environment variable บน CI/CD shared credential บนเครื่องพัฒนา และ IAM Role บน EC2 การใช้ assume role ช่วยจัดการหลาย account และ alias ช่วยจัดการหลาย region ทุกอย่างควรผ่านการทดสอบด้วย data source ก่อนเริ่มจัดการทรัพยากรจริงและยึดแนวทางความปลอดภัยอย่างเคร่งครัดเพื่อป้องกัน key รั่วไหล