ทำไมควรใช้ Type “object” แทน “any” ใน Terraform Variable

Nopnithi Khaokaew (Game)
2 min readFeb 26, 2023

--

ในบทความนี้เราจะมาลองดูว่าทำไม 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 ให้เราได้แบบนี้

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

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

No responses yet