ใช้ Terraform จัดการหลาย Account, Environment หรือ Cloud Platform

Use Terraform with Multi-Accounts, Environments or Cloud Platforms

Nopnithi Khaokaew (Game)
3 min readMar 12, 2022

— — — — — — — — —
บทความทั้งหมดของผม
— — — — — — — — —

มือใหม่อาจสงสัยว่าถ้าเราจะ provision infrastructure ด้วย Terraform ในหลาย ๆ

  • Environment เช่น workload มีทั้งบน development, UAT และ production
  • Account เช่น S3 อยู่ account logging ส่วน firewall อยู่ account network
  • Region เช่น Lambda@Edge อยู่ us-east-1 ส่วนที่เหลืออยู่ ap-southeast-1
  • Multicloud/Platform เช่น resource ทั้งหมดอยู่บน AWS แต่ก็มี Azure AD บน Azure ด้วย

หรือข้างบนผสมกันจะทำท่าไหนได้บ้าง วันนี้ผมรวมมาให้แล้ว…

เตรียม Environment

บทความนี้ผมใช้…

  • MacOS (Monterey 12.2.1)
  • Terraform เวอร์ชั่น 1.1.7
  • AWS provider เวอร์ชั่น 4.5.0

Account และการ Authenticate

ขออิงจาก AWS นะครับ(ค่ายอื่นก็หลักการเดียวกัน) ส่วนตัวผมชอบที่จะแยก account สำหรับ Terraform ออกมาต่างหาก อาจจะเรียกเป็น automation ก็ได้ หรือถ้าในบทความนี้ผมเรียก main

โดย Terraform จะ access ไปที่ main ในฐานะ IAM user ก่อน จากนั้นหากต้องมีการ provision resource บน account อื่น ๆ ก็จะใช้การ assume role ต่อไป ซึ่งมีข้อดีคือเราจะ manage credential ของ main แค่ตัวเดียว

Code ตัวอย่าง

วิธีที่ 1 ใช้ Working Directory

ถ้า workload ในแต่ละ environment ไม่เหมือนกันซะทีเดียว ก็แยก directory กันไปเลย แต่ละ environment ก็ใช้ code ของใครของมัน

ตัวอย่างที่โชว์คือสร้าง S3 bucket อยู่ที่ dev environment ตัวนึง และอีกหนึ่งอยู่ที่ prd environment ซึ่งทั้งสองอยู่คนละ account กัน สังเกตว่าเราใช้ code คนละชุดกัน

โครงสร้าง Directory

.
├── dev
│ ├── provider.tf
│ ├── s3.tf
│ ├── terraform.tfvars
│ └── variables.tf
└── prd
├── provider.tf
├── s3.tf
├── terraform.tfvars
└── variables.tf

การ Provision (บน Dev)

เมื่อจะ provision ก็ cd เข้าไปใน directory ของ environment นั้น ๆ

cd dev
terraform plan -out dev.plan
terraform apply dev.plan
rm dev.plan

การ Destroy (บน Dev)

terraform destroy --auto-approve

วิธีที่ 2 ใช้ Workspace

ถ้า workload ในแต่ละ environment เหมือนกันหรือคล้ายกันมาก เช่น dev เป็นยังไง prd ก็เป็นแบบนั้น อาจจะต่างกันแค่ size, capacity หรือการ enable feature บางอย่าง แบบนี้ก็ใช้ code เดียวกันไปเลย เพียงแต่ใช้ variable คนละชุด

ตัวอย่างที่โชว์คือสร้าง S3 bucket อยู่ที่ dev environment ตัวนึง และอีกหนึ่งอยู่ที่ prd environment ซึ่งทั้งสองอยู่คนละ account กัน

ทั้งสองใช้ code เป็นชุดเดียวกัน ต่างกันที่ variable ในการ input เท่านั้น (นอกจากชื่อที่ต่างกัน จะเห็นว่า bucket ที่ prd มีการ enable versioning ด้วย)

โครงสร้าง Directory

.
└── environments
├── env_vars
│ ├── dev.tfvars
│ └── prd.tfvars
├── provider.tf
├── s3.tf
└── variables.tf

สร้าง Workspace

cd environments
terraform workspace new dev
terraform workspace new prd

การ Provision (บน Dev)

terraform workspace select dev
terraform plan -var-file=env_vars/dev.tfvars -out dev.plan
terraform apply dev.plan
rm dev.plan

การ Destroy (บน Dev)

terraform destroy -var-file=env_vars/dev.tfvars

ป.ล. ท่านี้สามารถเขียน Makefile ช่วยให้รันได้ง่ายขึ้นและลดโอกาสมือลั่นได้

วิธีที่ 3 ใช้ Provider กับ Alias (Multiple Providers)

ใช้ได้หลายสถานการณ์ แต่ผมจะใช้ในกรณีต้องสร้าง resource บน region ที่แตกต่างกัน หรือคนละ platform และต้องการ manage code หรือ state file ที่เดียว

ตัวอย่างที่โชว์คือสร้าง S3 bucket อยู่ที่ region Singapore ตัวนึง และอีกหนึ่งอยู่ที่ region Tokyo บน account เดียวกัน

โครงสร้าง Directory

.
├── provider.tf
├── s3.tf
├── terraform.tfvars
└── variables.tf

การ Provision

terraform plan -out terraform.plan
terraform apply terraform.plan
rm terraform.plan

ทั้งหมดนี้ก็เป็นตัวอย่างวิธีการ provision เนอะ ผมพยายามยกตัวอย่างให้มัน simple เข้าไว้ ก็ลองไปปรับใช้ให้เหมาะสำหรับงานของเราแล้วกันนะ

ถ้าคิดว่าบทความนี้มีประโยชน์ ฝากกด clap, follow และ share บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ ^_^

— — — — — — — — —
บทความทั้งหมดของผม
— — — — — — — — —

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.

No responses yet