การทำ Automated Testing สำหรับ Infrastructure Code ด้วย Terratest

Using Terratest for Automated Testing of Infrastructure Code

Nopnithi Khaokaew (Game)
2 min readAug 19, 2021

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

ก่อนจะ deploy บน production เราจะมั่นใจได้ยังไงว่า infrastructure code ของเราจะสามารถทำงานได้ตามที่คิด? คำตอบก็คือลอง deploy บน staging environment ก่อน

ทีนี้การ test infrastructure code นั้นใช้เวลามากกว่า software code เยอะ เพราะต้องรอจนกว่า infrastructure ทั้งหมดจะถูก provision จนเสร็จ รวมไปถึงอาจมีการ install software หรือ dependency ต่าง ๆ อีก

ดังนั้นบทความนี้ผมจะแนะนำการใช้ Terratest มาช่วยทำ automated testing สำหรับ infrastructure code ให้เรามีชีวิตที่สุขสบายขึ้น อิอิ

Terratest คืออะไร?

Terratest คือ Go library ที่ provide ฟังก์ชั่นสำหรับใช้ในการ test infrastructure มาให้เราเสร็จสรรพ โดย support ทั้ง Terraform, Packer, Docker, Kubernetes, AWS, GCP, Azure และอื่น ๆ อีกมากมาย (ซึ่งในอนาคตคงจะเพิ่มขึ้นเรื่อย ๆ)

สิ่งที่ต้องเตรียม

  • Terraform ต้องพร้อมใช้งานกับ AWS (เฉพาะบทความนี้)
  • ติดตั้ง Go เวอร์ชั่น 1.13 ขึ้นไป
  • พื้นฐานการเขียนโปรแกรมด้วย Go (ใช้เขียน test ที่ซับซ้อนขึ้น)

Infrastructure ที่ต้องการ Test

โครงสร้างของ Project

├── terraform
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── test
└── simple_webapp_test.go

ซึ่งสามารถ clone จากที่นี่ได้ครับ

git clone https://github.com/nopnithi/terratest-demo

ไฟล์ทั้งหมด

terraform/main.tf

terraform/variables.tf

terraform/outputs.tf

test/simple_webapp_test.go

ทำไมต้องเขียน Go? ก็เพราะต้องมาเขียน test เนี่ยหละครับ

Webserver หลัง Deploy

เริ่มต้น Test

ภายใต้ directory ของ project ให้ run คำสั่งทั้งหมดตามนี้ครับ

cd test
go mod init "github.com/gruntwork-io/terratest/modules"
go mod tidy
go test -v -run TestSimpleWebApp -timeout 5m

สิ่งที่เกิดขึ้น

  • Terratest จะทำการสั่ง Terraform ให้ provision infrastructure บน AWS ขึ้นมาตาม code ของเราด้วยคำสั่ง terraform init และ terraform apply
  • จากนั้น Terratest จะส่ง HTTP GET request ไปยัง URL ของ webserver ทุก ๆ 5 วินาที สิ่งที่เราต้องการคือหวังว่าได้รับ response code เป็น 200 และ body เป็น “Nopnithi-Terratest-Demo” กลับมา
  • ผลสุดท้ายก็คือ Pass นั่นแปลว่า infrastructure code ของเราทำงานตามที่คาด
  • เพิ่มเติม: ทั้งหมดนี้สามารถนำไป integrate เข้ากับ CI/CD pipeline ของเราให้กลายเป็น fully automation ได้เลย

วิดีโอตัวอย่าง

ถ้าคิดว่าบทความนี้มีประโยชน์ ฝากกด 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.