Running Many Units at Once
ไอเดียในหนึ่งประโยค
หัวข้อที่มีชื่อว่า “ไอเดียในหนึ่งประโยค”terragrunt run --all apply จะไล่ทุก unit ที่อยู่ใต้ directory ปัจจุบัน apply ตามลำดับที่ dependency graph จากบทก่อนหน้ากำหนดไว้ และ --filter ก็ทำให้จำกัดการไล่นั้นให้เหลือแค่บางส่วนของ tree ได้ โดยไม่เปลี่ยนวิธีคำนวณลำดับเลย
run —all: รันทุก unit ทั่วทั้ง tree
หัวข้อที่มีชื่อว่า “run —all: รันทุก unit ทั่วทั้ง tree”เมื่อ directory หนึ่งมี unit มากกว่าหนึ่งตัว การรัน terragrunt plan หรือ terragrunt apply ทีละ unit ด้วยมือย่อมไม่ scale run --all กระจาย command เดียวไปทั่วทุก unit ที่อยู่ใต้ directory ปัจจุบัน
terragrunt run --all planterragrunt run --all applyต้องระวังผลการค้นหาและ tutorial เก่า ๆ ในเรื่องนี้เป็นพิเศษ เพราะโมดูลนี้เป็นจุดที่ข้อมูลล้าสมัยได้เร็วมาก terragrunt run-all plan และ terragrunt run-all apply คือ syntax เก่าและถูก deprecated ไปแล้ว เพื่อให้ใช้ run --all แทน ที่เก่ากว่านั้นอีก terragrunt plan-all กับ terragrunt apply-all ไม่ใช่แค่ deprecated แต่ถูกลบทิ้งไปทั้งหมดแล้ว และจะ fail ทันทีบน Terragrunt เวอร์ชันปัจจุบัน ถ้า guide ที่กำลังอ่านอยู่บอกให้รัน apply-all ให้ถือว่านั่นเป็นสัญญาณว่าเนื้อหาที่เหลือของ guide นั้นอาจล้าสมัยไปด้วย
จำกัดขอบเขตด้วย —filter
หัวข้อที่มีชื่อว่า “จำกัดขอบเขตด้วย —filter”การรันทุก unit ทั้ง repository ไม่ใช่สิ่งที่ต้องการเสมอไป บางครั้งแก้แค่ unit ของ subscription เดียว แล้วอยากจะ plan เฉพาะส่วนนั้น flag --filter จำกัดขอบเขต run --all ให้เหลือแค่บางส่วนของ tree ด้วย glob pattern
terragrunt run --all --filter './subscription-a/**' -- plan--filter มาแทน flag --queue-include-dir และ --queue-exclude-dir แบบเก่า ซึ่งทำงานคล้ายกันแต่แยกเป็นสอง flag สำหรับ include กับ exclude path ส่วน -- ก่อน plan คือตัวแยก flag ของ Terragrunt เองออกจาก command ที่จะรันข้าม unit ต่าง ๆ ซึ่งสำคัญขึ้นทันทีที่ run --all เริ่มรวม flag อย่าง --filter เข้ากับ Terraform command ที่อยู่เบื้องหลัง
สำหรับ CI pipeline ที่ไม่ควรมีอะไรหยุดรอ human confirm prompt เลย ให้เพิ่ม --non-interactive
terragrunt run --all --non-interactive -- apply--non-interactive มาแทน flag --terragrunt-non-interactive แบบเก่า อีกหนึ่งรูปแบบที่ต้องระวังใน material เก่า เพราะหลาย flag เคยมี prefix terragrunt- ซึ่ง Terragrunt เวอร์ชันปัจจุบันตัดทิ้งไปแล้ว
before_hook และ after_hook: แทรกเข้าไปในการรัน unit
หัวข้อที่มีชื่อว่า “before_hook และ after_hook: แทรกเข้าไปในการรัน unit”run --all บอก Terragrunt ว่าจะแตะ unit ไหนบ้างและตามลำดับอะไร แต่บางครั้ง unit หนึ่งก็ต้องการ side effect ห่อรอบ plan หรือ apply ของตัวเอง เช่น validation script ก่อนหน้า หรือการแจ้งเตือนหลังจากนั้น before_hook และ after_hook block ที่ประกาศไว้ใน terraform block ของ unit จะรัน shell command ใด ๆ ก็ได้ ณ จุดนั้นพอดี
terraform { before_hook "validate_inputs" { commands = ["plan", "apply"] execute = ["./scripts/validate-inputs.sh"] }
after_hook "notify_slack" { commands = ["apply"] execute = ["./scripts/notify-slack.sh", "vm apply finished"] run_on_error = true }}commands ระบุว่า Terragrunt command ไหนบ้างที่ trigger hook นี้ execute คือ command จริงที่ Terragrunt รัน และ run_on_error = true บน after_hook ด้านบนหมายความว่าการแจ้งเตือน Slack จะทำงานแม้ apply เองจะ fail ก็ตาม มีประโยชน์เมื่อต้องการรู้เรื่อง failure ด้วย ไม่ใช่แค่ตอนสำเร็จ เพราะ hook พวกนี้อยู่ใน terragrunt.hcl ของ unit เอง hook จะทำงานไม่ว่า unit นั้นจะถูก apply เดี่ยว ๆ หรือเป็นส่วนหนึ่งของ run --all apply ที่กวาดไปทั่วหลาย unit ก็ตาม
flowchart LR cmd["terragrunt run --all apply"] cmd --> vnet["vnet unit"] vnet --> vm["vm unit (depends on vnet)"] vnet --> database["database unit (depends on vnet)"] vm --> hook["after_hook notify_slack"]