ทำไมควรใช้ Type “object” แทน “any” ใน Terraform Variable
ในบทความนี้เราจะมาลองดูว่าทำไม object
เป็นทางเลือกที่ควรใช้โดยเฉพาะอย่างยิ่งในการกำหนดค่า variable ใน Terraform ที่ค่อนข้างมีความซับซ้อน
Overview สำหรับ object
และ any
ใน Terraform, any
เป็น data type ที่สามารถที่จะรับข้อมูลเข้ามาเป็นอะไรก็ได้ ไม่ว่าจะเป็น string
, number
, bool
, list
หรือ map
ซึ่งมันช่วยให้อะไรง่ายก็จริง แต่ในบางมุมก็จะมีข้อเสียอยู่ เดี๋ยวมาว่ากัน
object
เป็น data type ที่ทำให้เราสามารถกำหนด structure ของข้อมูลที่รับเข้ามาผ่าน variable ได้นอกเหนือไปจาก string
, number
, bool
, list
หรือ map
ตัวอย่าง
สมมุติผมเขียน Terraform module มาตัวหนึ่งใช้สำหรับสร้าง S3 bucket ใน module จะมี variable ชื่อ s3_buckets
ซึ่งรับค่าเป็น list ของข้อมูลต่าง ๆ ที่ใช้สำหรับการสร้าง bucket
ซึ่งเวลา user ใช้ module ก็จะต้องเขียนแบบนี้
module "s3" {
source = "..//s3"
s3_buckets = [
{
"name" : "nopnithi-bucket1",
"is_private" : true,
"retention_days" : 30,
"enable_versioning" : false,
"tags" : {
"environment" : "test"
}
},
{
"name" : "nopnithi-bucket2",
"is_private" : true,
"retention_days" : 90,
"enable_versioning" : false,
"tags" : {
"environment" : "test"
}
}
]
}
โดยใน module ผมได้กำหนด variable เอาไว้แบบนี้
variable "s3_buckets" {
type = list(any)
}
ซึ่งก็สามารถใช้งานได้ดีและไม่มีปัญหาอะไร
แต่หากผมอยากกำหนด data type ให้มัน specific มากขึ้น ผมก็จะใช้ object
เข้ามาช่วยเพราะไม่สามารถใช้ data type พื้นฐานได้เนื่องจากข้อมูลซับซ้อนกว่านั้น
ก็จะได้เป็น
variable "s3_buckets" {
type = list(object({
name : string
is_private : bool
retention_days : number
enable_versioning : bool
tags : map(string)
}))
}
ทำไมควรใช้ object
แทน any
?
Type safety
การกำหนด data type ให้ชัดเจนจะช่วยเรื่อง error catching ได้
เช่น ถ้าคุณใช้ any
และ pass ค่าที่ผิดเข้าไป Terraform จะ accept และนำค่าเหล่านั้นไป run ซึ่งก็จะเจอ error อยู่แล้ว แต่ถ้าใช้ object
มันจะ validate ก่อนที่จะ run และจะ fail ทันทีหากข้อมูลที่รับเข้ามาไม่ถูกต้อง แน่นอนว่าใช้เวลาน้อยกว่าแบบแรกมากเพื่อที่จะรู้ตัว
Documentation
ช่วยให้การเขียน document ทำได้ดีกว่า เพราะเราจะรู้ได้เลยว่า attribute ใน object
นั้นมีอะไรบ้าง และแต่ละตัวเป็น type ไหน
IDE support
ในมุมของ user จะช่วยให้การเขียน code ที่ถูกต้องนั้นทำได้ง่ายขึ้นเพราะ IDE อย่างเช่น VS code สามารถทำ type checking และ auto-completion ให้เราได้แบบนี้