เล่ามาจนถึงตอนที่ 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 จะได้ผลลัพท์ที่ถูกต้อง


อ้างอิง