Terraform HCL Formatter: จัดรูปแบบโค้ด Terraform ออนไลน์เหมือน terraform fmt
จัดรูปแบบและจัดตำแหน่งไฟล์ Terraform HCL ในเบราว์เซอร์ด้วย block indentation และการจัดเรียงเครื่องหมายเท่ากับ เหมือน terraform fmt โดยไม่ต้องติดตั้งโปรแกรมใด ๆ
Table of Contents
Terraform HCL Formatter: จัดรูปแบบโค้ด Terraform ออนไลน์เหมือน terraform fmt
ใครที่ทำงานกับ Terraform มาสักระยะหนึ่ง ย่อมคุ้นเคยกับขั้นตอนประจำวัน นั่นคือก่อน commit ทุกครั้งต้องรันคำสั่ง terraform fmt ซึ่งเป็นตัวจัดรูปแบบอย่างเป็นทางการของ HashiCorp Configuration Language (HCL) โค้ดที่ผ่านตัวนี้แล้วจะหน้าตาเป็นมาตรฐานเดียวกันทั้งทีม ทั้งย่อหน้าแบบ two-space ที่สม่ำเสมอ เครื่องหมายเท่ากับที่เรียงเป็นคอลัมน์เดียวกัน และไม่มีช่องว่างแปลก ๆ มากวนสายตา
แต่ปัญหาคือ terraform fmt เป็นคำสั่ง และคำสั่งต้องรันบนเครื่องที่ติดตั้ง Terraform ไว้ ซึ่งในหลายสถานการณ์คุณทำแบบนั้นไม่ได้ เช่น ตอนรีวิว pull request จากแท็บเล็ตบนโซฟา ตอนเพื่อนร่วมงานส่ง snippet มาในแชทแล้วถามว่า block ที่ซ้อนกันดูถูกต้องไหม หรือตอนใช้เครื่ององค์กรที่ล็อกสิทธิ์ไว้จนติดตั้ง Terraform binary ไม่ได้เลย
ช่องว่างนี้แหละที่ Terraform HCL Formatter เข้ามาแก้ เพียงวางโค้ด HCL ลงในเบราว์เซอร์ เครื่องมือจะจัดรูปแบบให้ทันที ทั้ง block indentation ที่สม่ำเสมอ การจัดเรียงเครื่องหมายเท่ากับภายในแต่ละ block การปรับ spacing ให้เป็นมาตรฐานเดียวกัน และการตรวจสอบ bracket balance ที่ชี้บรรทัดของวงเล็บปีกกาที่ยังไม่ปิด ทุกอย่างประมวลผลแบบ 100% client-side โค้ด infrastructure ของคุณจึงไม่หลุดออกจากเครื่องเลย
ทำไมต้องใช้ Terraform HCL Formatter?
- ไม่ต้องติดตั้งอะไรเลย ไม่ต้องมี Terraform binary, ไม่ต้องดาวน์โหลด provider, ไม่ต้องเปิด terminal เพียงเปิดหน้าเว็บ วางโค้ด แล้วได้ HCL ที่จัดรูปแบบแล้วภายในไม่กี่วินาที แม้บนเครื่องที่คุณควบคุมไม่ได้
- จัดเรียงเครื่องหมายเท่ากับทันที การจัดคอลัมน์ค่าด้วยมือทั้นุงทั้งเปลืองเวลาและผิดพลาดง่าย ตัว formatter จะเติมช่องว่างให้ = ของ attribute แต่ละกลุ่มอยู่คอลัมน์เดียวกันพอดี ตามที่ reviewer คาดหวัง
- block indentation สม่ำเสมอ block ที่ซ้อนกันอย่าง resource, provider หรือ tags แบบ inline จะได้ความลึกย่อหน้าเท่ากันหมด ทำให้โครงสร้างของ configuration อ่านรู้เรื่องในแวบแรก
- มีการตรวจสอบ bracket ในตัว ลืมปิดวงเล็บปีกกาคือความผิดพลาดอันดับต้น ๆ ของ HCL เครื่องมือจะสแกนความสมดุลของ bracket และรายงานบรรทัดที่ { หรือ [ เริ่มต้นโดยยังไม่ปิด ช่วยให้แก้จุดที่ผิดจริง ๆ แทนการมอง error งง ๆ
- เป็นส่วนตัวโดยดีไซน์ ทุกอย่างจัดรูปแบบในเบราว์เซอร์ของคุณ ไม่มีการอัปโหลดขึ้นเซิร์ฟเวอร์ สำคัญมากเวลาวางโค้ดที่อ้างถึง infrastructure จริง ชื่อ subnet หรือชื่อ resource
- ใช้ได้ทุกอุปกรณ์ เพราะเป็นแค่หน้าเว็บ คุณจัดรูปแบบ snippet จากแท็บเล็ต แล็ปท็อปยืมมา หรือโทรศัพท์ระหว่างประชุมแก้ incident ก็ได้
ฟีเจอร์หลัก
| ฟีเจอร์ | ทำอะไร |
|---|---|
| Block indentation | จัดย่อหน้า block ที่ซ้อนกันด้วย 2 หรือ 4 ช่องว่างต่อระดับ ตามที่ตั้งค่า |
| จัดเรียงเครื่องหมายเท่ากับ | จัด = ของ attribute ที่อยู่ติดกันภายใน block ให้เป็นคอลัมน์เดียว |
| เลือกขนาดย่อหน้า | สลับระหว่าง 2 และ 4 ช่องว่างให้ตรงกับ .editorconfig ของทีม |
| ตรวจสอบ bracket | ตรวจจับวงเล็บปีกกาและวงเล็บเหลี่ยมที่ยังไม่ปิด พร้อมบอกบรรทัดเริ่มต้น |
| รองรับ comment และ heredoc | เก็บเนื้อหา comment และ heredoc ไว้ครบถ้วน ไม่ทำเพี้ยน |
| คัดลอกและดาวน์โหลด | ส่งผลลัพธ์เข้า clipboard โดยตรง หรือบันทึกเป็นไฟล์ |
มีรายละเอียดน่าสนใจอีกสองสามข้อ ประการแรก formatter จะปรับ spacing รอบ ๆ operator, comma และวงเล็บให้เป็นระบบเดียวกันระหว่างเขียนแต่ละบรรทัดใหม่ สไตล์แบบ key=val กับ key = val ที่ปนกันจึงมาบรรจบที่หน้าตาเดียวกัน ประการที่สองการจัดเรียงเครื่องหมายเท่ากับเป็นตัวเลือก toggle ได้ ถ้า style guide ของทีมไม่เติมช่องว่าง ก็ปิดได้ ส่วนการจัดย่อหน้าและ spacing ยังทำงานตามปกติ
วิธีการใช้งาน
- เปิด Terraform HCL Formatter ในเบราว์เซอร์
- วางโค้ด HCL ลงในช่อง input ไม่ว่าจะเป็นไฟล์ .tf เต็ม, block เดียว หรือ snippet แบบ .tfvars
- เลือกขนาดย่อหน้า (2 หรือ 4 ช่องว่าง) และตัดสินใจว่าจะให้จัดเรียงเครื่องหมายเท่ากับหรือไม่
- ตรวจผลลัพธ์ที่จัดแล้ว ถ้าแผง validation รายงานว่ามีวงเล็บไม่ปิด ให้ย้อนไปแก้บรรทัดนั้นในซอร์สโค้ดของคุณ
- คัดลอกผลลัพธ์ไปที่ clipboard หรือดาวน์โหลดเป็นไฟล์ แล้วนำไปวางคืนใน editor หรือ pull request ที่กำลังรีวิว
วงจรทั้งหมดใช้เวลาน้อยกว่าการเปิด terminal แถมยังใช้ได้ในสถานการณ์ที่ terminal ไม่มีให้ใช้เลยด้วย
terraform fmt จัดรูปแบบอะไรบ้าง
การใช้ formatter ให้เก่ง ควรรู้ว่ามันทำอะไรกับโค้ดจริง ๆ กติกาของ terraform fmt ฉบับมาตรฐานมีไม่กี่ข้อ และตัว formatter ในเบราว์เซอร์ก็ทำตาม convention ชุดเดียวกัน
Block indentation แบบ two-space เนื้อหาใน block ทุกชั้นจะย่อหน้าลึกกว่า block แม่สองช่องว่าง block อย่าง provider "aws" อยู่คอลัมน์ศูนย์ argument ของมันอยู่สองช่องว่าง block ภายในอย่าง default_tags { เปิดที่สองช่องว่างและเนื้อหาข้างในอยู่ที่สี่ช่องว่าง การซ้อนที่ลึกขึ้นก็แค่ไต่ระดับต่อไป นี่คือเหตุผลที่ block อย่าง IAM policy หรือ security rule ที่ซ้อนกันหลายชั้นยังอ่านได้
การจัดเรียงเครื่องหมายเท่ากับภายใน block ในช่วงของ attribute บรรทัดเดียวที่ต่อเนื่องกัน terraform fmt จะเติมช่องว่างหลังชื่อ attribute เพื่อให้ทุก = อยู่คอลัมน์เดียวกันและทุกค่าเริ่มต้นตรงกัน โดยการจัดนี้เป็นแบบ local ต่อ block ไม่ใช่ทั้งไฟล์ คือ block tags จัดเรียงในกลุ่มของตัวเอง แยกจาก argument ด้านบน
Convention เรื่องลำดับ argument ที่น่าสังเกตคือ terraform fmt ไม่สลับลำดับ argument ซึ่งเป็นเรื่องตั้งใจ เพราะการสลับสร้าง diff noise โดยไม่เปลี่ยนความหมาย การเรียงลำดับเป็น convention ที่คนและ linter เป็นผู้บังคับ เช่น meta-argument อย่าง count และ for_each ไว้บนสุดของ block, configuration หลักอยู่ตรงกลาง, และ block อย่าง tags กับ lifecycle ไว้ท้าย สุดท้าย formatter ที่คงลำดับเดิมไว้แต่จัดคอลัมน์ให้เรียบร้อย จะทำให้ convention เหล่านี้มองเห็นชัดเจน
ทำไมเครื่องหมายเท่ากับที่จัดแล้วถึงดูถูกในการรีวิว คอลัมน์ที่จัดแนวช่วยให้ reviewer กวาดสายตาอ่านค่าลงล่างแทนการ parse ทีละบรรทัด และที่สำคัญกว่านั้น เมื่อบังคับใช้ formatting แล้ว diff จะมีแต่การเปลี่ยนแปลงเชิงความหมาย ไม่มีใครเสีย comment ไปกับ "ช่วยจัดคอลัมน์หน่อย" หรือเพ่ง diff ที่เปลี่ยนแค่ช่องว่าง โค้ด HCL ที่จัดรูปแบบแล้วสื่อว่าผู้เขียนใส่ใจผู้อ่าน
ลองดู block ที่ยังรกตามแบบที่มักได้รับจากแชท
resource "aws_instance" "web" {
ami = "ami-0abc123"
instance_type = "t3.micro"
subnet_id = aws_subnet.main.id
tags = {
Name = "web-server"
Env = "prod"
}
}
และ block เดิมหลังจัดรูปแบบแล้ว
resource "aws_instance" "web" {
ami = "ami-0abc123"
instance_type = "t3.micro"
subnet_id = aws_subnet.main.id
tags = {
Name = "web-server"
Env = "prod"
}
}
โค้ดชุดเดิม แต่เวอร์ชันที่สองรีวิวง่ายกว่ากันคนละเรื่อง
เครื่องมือในเบราว์เซอร์กับ binary ตัวจริงต่างกันอย่างไร terraform fmt ตัวจริงใช้ parser ของ HCL2 อย่างเป็นทางการ เข้าใจภาษาครบทั้ง expression และ function และเชื่อมกับ toolchain ของ Terraform ได้ ทั้ง terraform validate ที่ตรวจ configuration กับ provider schema และ fmt -recursive ที่จัดรูปแบบทั้งโฟลเดอร์ ส่วนตัวในเบราว์เซอร์เป็น structural formatter คือทำ indentation, alignment, spacing และ bracket balance พร้อมระวังไม่แตะ comment และ heredoc แต่ไม่โหลด provider, resolve data source หรือตรวจความถูกต้องเชิงความหมาย สำหรับการอ่าน รีวิว และแก้ด่วน ขอบเขตแค่นี้พอดี ส่วนการส่งโค้ดขึ้น production ให้ CI pipeline รัน binary ตัวจริงต่อ
กรณีการใช้งานจริง
Snippet ตอนรีวิว PR
สถานการณ์ที่เจอบ่อยที่สุดคือ pull request โชว์ diff แล้วมีจุดหนึ่งย่อหน้าเหลวเป็นพิเศษ แทนที่จะ checkout branch มารัน binary ให้วางจุดนั้นลง formatter เพื่อยืนยันว่ามันควรหน้าตาเป็นแบบไหน แล้วเขียน comment รีวิวให้ตรงจุด เทคนิคนี้ใช้จัดรูปแบบ snippet ก่อน quote ไปตอบใน thread ด้วย เพื่อให้คนที่คุณรีวิวอยู่เห็นโค้ดสะอาด
เรียนรู้ syntax ของ HCL
ถ้าคุณเพิ่งเริ่มกับ Terraform ตัว formatter ทำหน้าที่ครูได้ด้วย ลองวาง block ที่คัดลอกมาจากบล็อกโพสต์หรือ AI แล้วดูผลลัพธ์ว่ารูปแบบมาตรฐานเป็นอย่างไร วงเล็บวางตรงไหน block ซ้อนลึกแค่ไหน และ attribute ที่จัดแล้วอ่านเป็นอย่างไร ผ่านไปไม่กี่สัปดาห์ที่เทียบของที่วางกับผลลัพธ์ การจัดรูปแบบที่ถูกต้องจะกลายเป็นความเคยชิน
แก้ด่วนบนเครื่องที่จำกัดสิทธิ์
ที่ปรึกษา, contractor และทีมที่เน้นความปลอดภัยมักใช้เครื่องที่ติดตั้ง binary อิสระไม่ได้ เครื่องมือในเบราว์เซอร์ต้องการแค่ URL เมื่อคุณเห็นปัญหา formatting ใน module ที่แชร์กันระหว่าง screenshare คุณผลิต block ฉบับแก้แล้วออกมาวางลงบทสนทนาได้ทันที
ตัวอย่างในเอกสาร
ทุก Terraform module ควรมีตัวอย่างการใช้งานที่สะอาดใน README ร่างตัวอย่าง รันผ่าน formatter แล้วเอาผลไปใส่เอกสาร ตัวอย่างที่จัดคอลัมน์และย่อหน้าสม่ำเสมอทำให้ module ดูดูแลเป็นระบบ และ copy ไปใช้ในโปรเจกต์ของผู้ใช้ได้เนียนทันที
แนวทางปฏิบัติที่ดี
- รัน terraform fmt ตัวจริงใน CI เสมอ เพิ่ม step terraform fmt -check -recursive เพื่อให้โค้ดที่ยังไม่จัดรูปแบบ fail pipeline ไปเลย ดีกว่าไปเถียงกันในรีวิว เครื่องมือในเบราว์เซอร์เป็นตัวเสริม ไม่ใช่ตัวแทน
- ใช้เครื่องมือเบราว์เซอร์เพื่อการอ่าน ไม่ใช่ artifact สุดท้าย ถือว่าผลลัพธ์ใช้ดูและวางลง draft ส่วนรอบจัดรูปแบบอย่างเป็นทางการยังต้องเกิดบนเครื่องที่มี Terraform
- ทำ module ให้เล็ก ปัญหา formatting ทวีคูณตามขนาดไฟล์ module ที่เล็กและโฟกัสชัดจะจัดรูปแบบ รีวิว และรักษาความสม่ำเสมอง่ายกว่า
- ตกลงขนาดย่อหน้าครั้งเดียว ทีมควรตัดสินใจว่าใช้ 2 หรือ 4 ช่องว่าง บันทึกลง .editorconfig แล้วตั้งค่า formatter ให้ตรงกัน เพื่อไม่ให้ผลจากเบราว์เซอร์กับ CI ขัดกัน
- อย่าจัดคอลัมน์ด้วยมือใน commit ถ้ารู้สึกว่ากำลังเติมช่องว่างเอง ให้วางผ่าน formatter แทน เพราะการจัดมือคือทางผ่านของความผิดพลาด
- จับคู่ fmt กับ validate การจัดรูปแบบแก้แค่หน้าตา ให้รัน terraform validate หรือ terraform plan เพื่อยืนยันว่า configuration ถูกต้องจริงก่อน merge
พร้อมจัดรูปแบบ HCL ของคุณหรือยัง?
ครั้งต่อไปที่ใครสักคนทิ้ง block HCL รก ๆ ลงในแชท งานรีวิว หรือเอกสาร ไม่ต้องตามหาเครื่องที่ติดตั้ง Terraform แล้ว เปิด Terraform HCL Formatter วางโค้ด แล้วรับผลลัพธ์ที่ย่อหน้าเรียบร้อยและเครื่องหมายเท่ากับจัดแนวแล้วภายในไม่กี่วินาที ฟรี เป็นส่วนตัว และอยู่ในเบราว์เซอร์ของคุณ
เครื่องมือที่เกี่ยวข้องที่คุณอาจสนใจ:
- YAML Formatter — จัดรูปแบบและย่อหน้าไฟล์ YAML ของ pipeline และ config ด้วยแนวทาง in-browser เดียวกัน
- GitHub Actions Workflow Generator — สร้างโครง workflow YAML ที่มีโครงสร้างดีสำหรับ CI pipeline ของคุณ
- Docker Run to Compose Converter — แปลงคำสั่ง docker run เป็นไฟล์ Compose ที่มีโครงสร้างชัดเจน
ขอให้สนุกกับการจัดรูปแบบ!
คำถามที่พบบ่อย
ถ: Terraform HCL Formatter เหมือน terraform fmt เป๊ะ ๆ เลยไหม? ตอบ: เครื่องมือทำตาม convention การจัดรูปแบบชุดเดียวกัน ทั้ง block indentation แบบ two-space (หรือแบบที่ตั้งค่าได้) การจัดเรียงเครื่องหมายเท่ากับ และ spacing ที่เป็นมาตรฐาน แต่มันเป็น structural formatter ในเบราว์เซอร์ ไม่โหลด provider และไม่ตรวจความหมาย ดังนั้น terraform fmt ตัวจริงใน repository ยังคงเป็นมาตรฐานสูงสุด
ถ: โค้ด Terraform ของฉันถูกอัปโหลดขึ้นเซิร์ฟเวอร์หรือเปล่า? ตอบ: ไม่ ทุกอย่างประมวลผลแบบ client-side ใน JavaScript ของเบราว์เซอร์ configuration ของคุณไม่ออกจากอุปกรณ์ นั่นคือเหตุผลที่เครื่องมือนี้ปลอดภัยสำหรับ snippet ที่อ้างถึง infrastructure จริง
ถ: ใช้จัดรูปแบบไฟล์ประเภทไหนได้บ้าง? ตอบ: ข้อความ HCL ทุกแบบ ทั้งไฟล์ .tf, resource block เดี่ยว, ไฟล์ .tfvars และตัวอย่าง module วางเนื้อหาเป็นข้อความธรรมดาแล้วจัดรูปแบบได้เลย
ถ: formatter สลับลำดับ argument ของฉันไหม? ตอบ: ไม่ เหมือนกับ terraform fmt ตัวนี้คงลำดับ attribute และ block เดิมไว้ และแก้เฉพาะ indentation, alignment และ spacing ทำให้ diff ของคุณโฟกัสอยู่ที่การเปลี่ยนแปลงจริง
ถ: ใช้ย่อหน้าแบบ 4 ช่องว่างแทน 2 ได้ไหม? ตอบ: ได้ ตัวเลือกขนาดย่อหน้าให้เลือกระหว่าง 2 และ 4 ช่องว่างต่อระดับการซ้อน และคุณยังปิดการจัดเรียงเครื่องหมายเท่ากับได้ด้วย ถ้า style guide ของทีมไม่ต้องการการเติมช่องว่าง