Terragrunt ใช้แล้วชีวิตดีขึ้นยังไง?

Pitch Kantapit
3 min readJan 21, 2023

--

หลังจากที่ผมได้ลองใช้ Terraform เพื่อสร้าง schema บน BigQuery ก็ประสบพบเจอว่า ถึงแม้ Terraform จะช่วยเราในการจัดการ resource แล้ว แต่ถ้าหากเรามี หลาย environments ในท้ายที่สุดเราก็ต้อง hard code ในส่วนของ Terraform แต่ละ environment อยู่ดี

ดังนั้นการที่เราต้อง สร้าง Terraform หลายๆ environments แต่ code ภายในมีส่วนที่เหมือนกันทำให้เราเสียทั้งเวลาและยังมีโอกาสเกิด Human errors ได้อีกด้วย

เนื่องจากผมได้มีโอกาสลองใช้ Terragrunt แล้วรู้สึกว่าเครื่องมือนี้สามารถช่วยลดปัญหาความซ้ำซ้อนของงานและช่วยประหยัดเวลาของเราได้ เลยอยากจะมาแชร์ให้ทุกๆ คนฟังกันครับ (https://terragrunt.gruntwork.io/)

Terragrunt คืออะไร?

โดยที่ Terragrunt ได้นิยามตัวเองไว้ว่า เป็น thin wrapper ที่มีเครื่องมือสำหรับทำให้ configurations ของเรา DRY (Don’t repeat yourself) โดยจะทำงานร่วมกับ Terraform modules และยังสามารถ managing ตัว Terraform state ได้อีกด้วย สรุปสั้นๆ ก็คือ Terragrunt เป็น tools ที่จะช่วยเราในการ config Terraform code ที่เหมือนกันได้ โดยไม่ต้อง duplicate code กันเลยทีเดียว

https://terragrunt.gruntwork.io/

Terragrunt ช่วยอะไรเรา?

จาก concept ของทาง Terraform ที่เป็นเครื่องมือที่สามารถจัดการ infrastructure ของเราได้โดยใช้ configuration syntax ที่สั้นและเข้าใจง่าย แต่ถ้าหากเรามี Terraform ที่มี content ในแต่ละ environment ที่คล้ายๆ กันโดยปกติเราจะต้องทำการ duplicate โครงสร้างของ Terraform code แล้วนำมาปรับแก้ config ตามแต่ละ environment

โดยเราจะสังเกตุว่าจากภาพ ถ้าหากเราใช้ Terraform เราจะต้อง duplicate ไฟล์ main.tf สำหรับแต่ละ environment (prod, qa, stage) ซึ่งในแต่ละไฟล์นั้นจะมี config ที่แตกต่างกันไปตามแต่ละ environment เช่น. ถ้าหาเราต้องการปรับให้ code ในส่วนของ prod environment ให้ใช้จำนวน server ที่มากกว่า code ในส่วนของ dev environment เราจะต้อง duplicate code แล้วปรับจำนวน server ให้เป็นไปตามต้องการของแต่ละ environment นั้นๆ

จากที่กล่าวมา หลายๆ คนคงอาจจะยังไม่เห็นภาพ มาลองดูตัวอย่างกันครับ

https://terragrunt.gruntwork.io/docs/features/keep-your-terraform-code-dry/

จากภาพถ้าเราจะทำการแก้ไข config ของ prod ก็คงต้องเข้าไปแก้ไขไฟล์ main.tf ซึ่งถ้ามีจำนวนน้อยก็คงจะพอไหวแหละนะ แต่ถ้าหากเราต้องแก้ไขทั้งหมดนี้หล่ะ

https://terragrunt.gruntwork.io/docs/features/keep-your-terraform-code-dry/

โครม! แค่คิดก็ปวดหลังแล้วใช่มั้ยครับ 5555555 หรือถ้าในอีก 3–4 เดือนข้างหน้าเราต้องกลับมา maintain ภาพในหัวของเราก็อาจเลือนลางไปหมดแล้ว 5555555

ดังนั้น Terragrunt สามารถช่วยเราจัดการให้ Terraform code ง่ายต่อการ config และ maintain แถม code ของเรายัง DRY ได้ด้วยเพียงการ define ไฟล์ .hcl ที่เดียวและไม่ต้องสนใจว่าจะมีกี่ environment โดยที่ Terragrunt จะจัดการให้เรา แบบนี้

https://terragrunt.gruntwork.io/

ไฟล์ที่เราจะต้อง config มีเพียงแค่ไฟล์ terragrunt.hcl ซึ่งจะเป็นการกำหนดว่าให้เรียกใช้ module อะไร ให้ไปสร้างอะไร ที่ไหน เรียกว่าสั่งได้ตามต้องการได้เลย หน้าตาก็จะประมาณนี้ครับ

https://terragrunt.gruntwork.io/

จากภาพข้างบนจะเห็นได้ว่าทุกๆ environment จำเป็นต้องใช้ `instance_count` และ `instance_type` เหมือนกันหมด แต่จะแตกต่างกันเพียง value เท่านั้น โดยที่ Terragrunt จะทำการสร้าง `instance_count` และ `instance_type` ให้แต่ละ environment มีตัวแปรเดียวกันหมดโดยที่เราไม่จำเป็นต้องไป duplicate ให้เสียเวลาเลย

https://terragrunt.gruntwork.io/docs/features/keep-your-terraform-code-dry/

ดังนั้นผลลัพธ์ที่ได้คือ Terragrunt จะทำการสร้าง ไฟล์ .hcl ให้แต่ละ sub directory (app, mysql, vpc) เองตามที่เรากำหนดไว้ใน Terragrunt.hcl ของแต่ละ environment (prod, qa, stage)

สรุปคือ

Terragrunt เป็น Open-Source Tool เครื่องมือนึงที่ไม่เพียงแต่ทำให้ชีวิตเราสะดวกขึ้นแต่ทำให้ code ของเรา clean และ DRY มากขึ้นตามฉบับคน cool cool 😎แบบเราๆ และทำให้เราสามารถนำ code ไปทำงานร่วมกับเพื่อนๆ ได้โดยที่เราไม่ต้องมานั่งปวดหัวกับการ maintain

สุดท้ายนี้ก็ฝากถึงผู้ที่หลงเข้ามาอ่าน ก็สามารถเอาไปลองใช้กันดูได้ครับ หวังว่าจะมีประโยชน์ไม่มากก็น้อยหากผิดพลาดประการใดก็ขออภัยด้วยครับ สามารถติชมครับ

ส่วนถ้าใครสงสัยเรื่องการเริ่มต้นใช้งาน บทความหน้าผมจะพาทุกคนไปใช้งานเจ้า Terragrunt กันครับ ฝากติดตามกันด้วยค้าบบบ

Reference

  1. https://terragrunt.gruntwork.io/docs/features/keep-your-terraform-code-dry/

--

--