มาใช้ Terraform กันเถอะ – ตอนที่ 4 modular เอามาเชื่อม
in this series
- มาใช้ Terraform กันเถอะ – ตอนที่ 1 เรื่องพื้นฐาน
- มาใช้ Terraform กันเถอะ – ตอนที่ 2 ตัวแปรและการแทนค่า
- มาใช้ Terraform กันเถอะ – ตอนที่ 3 state ร่วมกัน
- มาใช้ Terraform กันเถอะ – ตอนที่ 4 modular เอามาเชื่อม
- มาใช้ Terraform กันเถอะ – ตอนที่ 5 ของเก่าเรา import
- มาใช้ Terraform กันเถอะ – ตอนที่ 6 ประยุกต์ใช้ CI/CD
เล่ามาจนถึงตอนที่ 4 ละนะฮะ ย้อนกันอีกสักรอบว่า Terraform มันจะอ่านทุก file ที่เป็น tf
script ใน folder ที่ทำงานอยู่ เราเลือกไม่ได้ว่าจะให้ script file ไหนทำงานบ้าง หรือไม่ทำงานบ้าง เวลาทำงานจริง เราไม่ได้จัดการแค่ resource ประเภทเดียวอยู่แล้วล่ะ พอมีหลายๆ ประเภทเข้ามาอยู่ในที่เดียวกัน เราจะมี file มากมายให้ต้องดูแล แล้วจะทำยังไงดีให้เราไม่งงเสียเองล่ะ
Terraform module คือคำตอบฮะ
module ดียังไง
อารมณ์คล้ายๆ import
ใน Python เลยฮะ เราแยก tf
script ของ resource แต่ละประเภทออกเป็นแต่ละ module ให้มันไปอยู่ใน folder ใน path อะไรของมันเอง เอาไปวางข้างนอก main folder ก็ได้นะ พอจะใช้ก็สั่งให้มันเรียกเข้ามา พอจะไม่ใช้ก็ลบคำสั่งเรียกนั้นออกไป เราก็ไม่ต้องมานั่งย้าย file หรือลบกลับไปกลับมาให้ยุ่งยากล่ะฮะ
แต่ว่านะ ทุกครั้งที่เราสั่ง import module หรือจะไม่เอา module นั้นแล้ว เราจะเป็นต้อง init
เสมอนะฮะ
Syntax
ย้ายมาคุยเรื่อง syntax มันง่ายมากเลย แค่ใส่ keyword module
เข้าไป จากนั้นก็บอกมันไปว่า module นี้อยู่ตรงไหน ตามด้วยตัวแปรของ module นั้นฮะ แบบนี้
module "<module_name>" {
source = "<module_script_path>"
attribute1 = value1
attribute2 = value2
}
ตรงที่อยู่ของ module เราใส่เป็น relative path ได้นะ แบบ "../module/folder1/folder2" อย่างเนี้ย
ตัวอย่างหน้าตา file
จาก folder tree ข้างบน ผมแยกเป็น folder src
เก็บ main script และ folder modules
เก็บ module script แล้วทีนี้ ตอนจะ execute ก็ทำที่ main folder ( src
) นั่นแหละฮะ จะเห็นว่าตอนนี้ folder modules
เป็นเอกเทศโดยสิ้นเชิงนะฮะ
module folder
ก็มี 2 file ได้แก่
อันแรก คือ script สร้าง GCS buckets
และอีกอันคือตัวแปร
main folder
มี backend ตามด้วย main script อันนี้
และ file ประกาศตัวแปร
ปิดท้ายด้วย file กำหนดตัวแปร
แผนผังเชื่อมโยง
เราเขียน script แบบข้างบนเนี่ย สามารถมองการส่งค่าตัวแปรได้ประมาณนี้ฮะ จากขวาไปซ้านเป็นทอดๆ ไป
ลองสั่ง run ดีกว่า
พร้อมแล้ว ก็ให้เราสั่ง init
ให้ Terraform เรียก module เข้ามาก่อนนะฮะ
แล้วทีนี้ก็ validate
และ plan
ก่อนจะ apply
จะได้ผลลัพท์ที่ถูกต้อง