IT General
น้องๆ หลายคนอาจจะคุ้นเคยกับการเทสต์โค้ดโปรแกรม แต่พอเป็นเรื่อง Infrastructure as Code (IaC) อย่าง Terraform, Ansible, หรือ CloudFormation หลายคนอาจจะงงๆ ว่ามันเทสต์ยังไงวะ? สมัยผมทำร้านเน็ต SiamCafe รุ่นแรกๆ นี่คือลงมือแก้ config กันสดๆ พังก็ roll back กันไป (หัวเราะ) แต่ยุคนี้มันต้อง automated และมั่นใจได้ก่อน deploy จริง
Terratest เนี่ย มันคือ Go library ที่ช่วยให้เราเขียน integration tests สำหรับ infrastructure ได้ง่ายขึ้น คิดง่ายๆ ว่ามันเป็น "unit test" สำหรับ infrastructure นั่นแหละ สำคัญยังไงน่ะเหรอ? ลองนึกภาพ deploy infrastructure ผิดพลาดขึ้น production สิครับ...หายนะชัดๆ! Terratest ช่วยให้เราจับ bug ได้ตั้งแต่เนิ่นๆ ก่อนจะไปสร้างความเสียหายร้ายแรง
อีกอย่างที่สำคัญคือ มันช่วยให้เราสร้าง infrastructure ที่ repeatable และ predictable ได้ ลองนึกภาพทีมเรามีหลายคน แต่ละคน deploy infrastructure ไม่เหมือนกัน มั่วไปหมด! Terratest ช่วยให้เรามั่นใจได้ว่าไม่ว่าใครจะ deploy ก็จะได้ environment ที่เหมือนกันเป๊ะๆ
ก่อนจะไปลุย Terratest กันเต็มที่ เรามาปูพื้นฐานกันก่อนนิดนึงนะ
Terratest เขียนด้วยภาษา Go ครับ ดังนั้นถ้าเราพอมีพื้นฐาน Go มาบ้างก็จะช่วยให้เข้าใจโค้ด Terratest ได้ง่ายขึ้น แต่ไม่ต้องถึงกับ expert ก็ได้นะ แค่พออ่านออกเขียนได้ก็พอ
สมัยผมเริ่มเขียน Go ใหม่ๆ ก็งงๆ เหมือนกัน แต่พอใช้ไปเรื่อยๆ ก็เริ่มชิน Go มันเป็นภาษาที่ compile เร็ว run เร็ว เหมาะกับงาน infrastructure มากๆ
Terratest เอาไว้เทสต์ IaC ครับ ดังนั้นเราต้องเข้าใจ concept ของ IaC ก่อน IaC คือการจัดการ infrastructure ด้วยโค้ด แทนที่จะคลิกๆ ใน UI ของ cloud provider
เครื่องมือ IaC ที่ดังๆ ก็จะมี Terraform, Ansible, CloudFormation พวกนี้แหละ แต่ Terratest ซัพพอร์ตหลายตัวนะ ไม่ต้องห่วง
สุดท้ายคือเราต้องเข้าใจ concept ของ testing ครับ พวก unit test, integration test, end-to-end test อะไรพวกนี้ ถ้าเราเข้าใจความแตกต่างของ test แต่ละแบบ เราก็จะเลือกใช้ Terratest ได้อย่างเหมาะสม
Unit test ก็คือเทสต์ component เล็กๆ ของเรา, Integration test คือเทสต์การทำงานร่วมกันของหลายๆ component, End-to-end test คือเทสต์ทั้งระบบตั้งแต่ต้นจนจบ
มาถึงส่วนที่หลายคนรอคอย นั่นก็คือการใช้งาน Terratest นั่นเอง! ผมจะสอนแบบ step-by-step เลยนะ
เราจะลองเทสต์ Terraform module ง่ายๆ กันนะครับ สมมติว่าเรามี Terraform module ที่สร้าง AWS S3 bucket
ก่อนอื่นเราต้องมี Terraform module ก่อนนะ สร้างไฟล์ main.tf ใน directory s3-bucket:
resource "aws_s3_bucket" "example" {
bucket = "my-unique-bucket-name" # เปลี่ยนตรงนี้ด้วยนะ
acl = "private"
tags = {
Name = "My bucket"
Environment = "Dev"
}
}
อย่าลืมเปลี่ยน bucket เป็นชื่อที่ไม่ซ้ำกับใครนะ! ไม่งั้น Terraform จะ error
สร้างไฟล์ s3_bucket_test.go ใน directory test:
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestS3Bucket(t *testing.T) {
t.Parallel()
terraformOptions := &terraform.Options{
TerraformDir: "../s3-bucket",
}
defer terraform.Destroy(t, terraformOptions)
terraform.InitAndApply(t, terraformOptions)
bucketName := terraform.Output(t, terraformOptions, "bucket")
assert.NotEmpty(t, bucketName)
}
โค้ดนี้จะ init, apply Terraform module, และเช็คว่า output bucket ไม่ว่าง
เปิด terminal แล้วรันคำสั่ง:
go test -v .
ถ้าทุกอย่างเรียบร้อย test ควรจะ pass ครับ!
Terratest ไม่ใช่เครื่องมือเดียวที่ใช้เทสต์ infrastructure ได้ ยังมีทางเลือกอื่นอีกมากมาย แต่ละตัวก็มีข้อดีข้อเสียต่างกันไป
| เครื่องมือ | ข้อดี | ข้อเสีย |
|---|---|---|
| Terratest | เขียนด้วย Go, integrate กับ Terraform ได้ดี, flexibility สูง | ต้องเขียนโค้ดเยอะ, learning curve สูง |
| InSpec | เน้น compliance, DSL เข้าใจง่าย | integrate กับ Terraform ได้ไม่ดีเท่า Terratest |
| Serverspec | เขียนด้วย Ruby, เน้น server configuration | integrate กับ Terraform ได้ไม่ดีเท่า Terratest |
สรุปคือถ้าเราใช้ Terraform เป็นหลัก และอยากได้ flexibility สูง Terratest คือตัวเลือกที่ดี แต่ถ้าเราเน้น compliance และอยากได้ DSL ที่เข้าใจง่าย InSpec ก็เป็นตัวเลือกที่น่าสนใจ
อย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะครับ มีเรื่อง IT อีกเยอะแยะ
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไร ถามมาได้เลย!
และอย่าลืมติดตาม SiamCafe Blog เพื่ออัพเดทข่าวสารวงการไอทีกันต่อไปนะครับ
เอาล่ะน้องๆ มาถึงตรงนี้แล้ว แสดงว่าพอเข้าใจ Terratest ระดับนึงแล้วนะ สมัยผมทำร้านเน็ตฯ สิ่งสำคัญคือ "ของต้องพร้อมใช้เสมอ" Infrastructure ก็เหมือนกัน ถ้าเว็บโหลดไม่ได้ ลูกค้าหายหมด! ดังนั้น Test ให้ละเอียด สำคัญมาก!
จำไว้เลยว่า Test เร็ว Fail เร็ว แก้ไขได้เร็ว อย่ารอให้ Production เจ๊งแล้วค่อยมาแก้ มันไม่ทันกิน
// Example Mock Service in Go
type MockService struct {
ExpectedInput string
ReturnResult string
}
func (m *MockService) DoSomething(input string) string {
if input == m.ExpectedInput {
return m.ReturnResult
}
return "Error"
}
เกือบทุก Provider หลักๆ เลยนะ AWS, Azure, GCP นี่สบายๆ แต่ถ้า Provider เล็กๆ อาจจะต้องเขียน Custom Code เพิ่มเติมเอง
อันนี้แล้วแต่ Complexity ของ Infrastructure เลยน้อง แต่พยายามทำให้ Test เร็วที่สุดเท่าที่จะทำได้ Test พวก Security ก็ต้องละเอียดหน่อยนะ
ไล่ Log ดูเลยน้อง Terratest มันจะบอกว่าตรงไหน Failed พยายามอ่าน Error Message ให้เข้าใจ แล้ว Debug ไปทีละ Step สมัยก่อน Debug นี่คือ Skill สำคัญเลยนะ!
ถ้าทำได้ก็ดี แต่ส่วนใหญ่จะ Test ใน Staging Environment ก่อน แล้วค่อย Promote ไป Production แต่ต้องมั่นใจว่า Staging เหมือน Production เป๊ะๆ นะ
Terratest เป็น Tool ที่ดีมากในการ Test Infrastructure ช่วยให้เรามั่นใจได้ว่า Infrastructure ของเราทำงานได้อย่างถูกต้องและปลอดภัย แต่ต้องใช้ให้เป็นนะน้อง อย่าลืม Cleanup Resource ทุกครั้ง และ Test อย่างสม่ำเสมอ iCafeForex ก็ใช้หลักการคล้ายๆ กันในการเทรด คือต้อง Test Strategy ก่อนลงสนามจริง
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย หรือเข้าไปดู SiamCafe Blog ได้เลย