การทำ Automated Testing สำหรับ Infrastructure Code ด้วย Terratest
Using Terratest for Automated Testing of Infrastructure Code
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (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 บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ ^_^