มาใช้ Terraform กันเถอะ – ตอนที่ 6 ประยุกต์ใช้ CI/CD
in this series
- มาใช้ Terraform กันเถอะ – ตอนที่ 1 เรื่องพื้นฐาน
- มาใช้ Terraform กันเถอะ – ตอนที่ 2 ตัวแปรและการแทนค่า
- มาใช้ Terraform กันเถอะ – ตอนที่ 3 state ร่วมกัน
- มาใช้ Terraform กันเถอะ – ตอนที่ 4 modular เอามาเชื่อม
- มาใช้ Terraform กันเถอะ – ตอนที่ 5 ของเก่าเรา import
- มาใช้ Terraform กันเถอะ – ตอนที่ 6 ประยุกต์ใช้ CI/CD
ผ่านมา 5 ตอนแล้วนะฮะ เรารู้จักพื้นฐานกันไปพอสมควรละ ทีนี้ ได้เวลาเอามาประยุกต์เข้ากับเครื่องมือ CI/CD กันบ้าง แน่นอน มันคือ Google Cloud Build
สำหรับใครที่ยังไม่รู้จัก หรืออยากอ่านเพิ่ม สามารถจิ้มที่ลิงก์ด้านล่างไปย้อนดูได้ฮะ
File ต่างๆ มีอะไรบ้าง
เอาล่ะ งานนี้ขอ reuse file จากตอนที่แล้วหน่อย มีประมาณนี้ฮะ
- folder
modules
มี GCS module กับตัวแปรของ module - folder
src
เราแบ่งเป็นหลายๆ file ได้แก่ backend, main, provider, และตัวแปร - folder
variables
แบ่งตัวแปรเป็น 2 file คือ GCS ในชื่อgcs-dev.tfvars
และชื่อ project ในชื่อproject-dev.tfvars
.
แล้วก็มีอีก 2 ตัวที่เป็นของใหม่ในตอนนี้ นั่นคือ...
backend-dev.hcl
HCL file เป็น HashiCorp Configuration Language ที่เราเอามาใช้เก็บตัวแปร configuration ของ backend ฮะ มีประโยชน์มากเมื่อเราต้องจัดการ backend ในหลาย environment เราก็แยกไปเลย file ละชุด ทีนี้ตัว backend script ก็จะเขียนแค่นี้
แล้วเขียน backend configuration แยกมา สมมติชื่อว่า "backend-dev.hcl"
cloudbuild.yaml
พระเอกมาตรงนี้แหละ ยังจำคำสั่งของ Terraform ที่เราใช้ได้ใช่มั้ยฮะ เราจะมาเรียงกันไว้ใน file นี้เลย เพื่อให้ Cloud Build มันทำงานให้เรา
แล้วเราก็สามารถใช้ Image ที่เค้าสร้างให้ไว้อยู่แล้วได้เลยฮะ อย่างตัวอย่างก็เป็น "hashicorp/terraform:1.0.0" ซึ่งดูเพิ่มเติมได้ที่ลิงก์นี้ไปยัง Docker Hub
จากนั้น เราก็กำหนดไป 3 ขั้นตอนพื้นฐานฮะ
init
เพราะ script หลักอยู่ใน folder src
ก็สั่ง cd
เข้าไปแล้ว init
โดยเพิ่ม parameter เป็นbackend-dev.hcl
ตรงนี้เราจะได้ state ที่ต้องการมา
cd src
terraform init -backend-config="../variables/backend-dev.hcl"
plan
คราวนี้ก็ run คำสั่งนี้
cd src
terraform plan $(for v in $(ls ../variables/*.tfvars); do echo -var-file="$v"; done)
ที่ $(for v in $(ls ../variables/*.tfvars); do echo -var-file="$v"; done)
หมายถึง เราให้ list tfvars
file ทั้งหมดที่อยู่ใน folder variables
แล้ว print ออกมาในรูปของ -var-files="..."
ผลลัพท์คือ เราจะได้คำสั่งที่ใส่ -var-file
ทุก file ที่อยู่ใน folder นั้น แบบนี้
terraform plan -var-file="gcs-dev.tfvars" -var-file="project-dev.tfvars"
ถ้าอนาคต เรามีtfvars
มาเพิ่ม เราก็ไม่ต้องแก้คำสั่งทุกรอบ เพราะมันจะประมวลผลได้โดยอัตโนมัติฮะ
apply
cd src
terraform apply $(for v in $(ls ../variables/*.tfvars); do echo -var-file="$v"; done) -auto-approve
ทุกอย่างผ่าน ก็ -auto-approve
ได้เลยฮะ
Run มือรอบนึง
สั่ง init

สั่ง plan

แล้วก็สั่ง apply

เราได้ bucket "bluebirz_sample_tf_cicd_01" แบบง่ายๆ

Run ด้วย Cloud Build
ก่อนอื่นเลย เราต้องมี trigger ที่เชื่อมกับ repo และ service account ของ trigger นั้นก็ต้องมี permission ครบแล้ว
กรณีนี้ เราจะให้ permission "Storage Admin" นะฮะ
ข้อมูลเพิ่มเติมตรงนี้ คือ how to configure access for Cloud Build และ understanding GCP roles.

ทีนี้ ก่อนจะ commit ผมขอปรับนิดนึง ให้ bucket เปลี่ยนจาก "bluebirz_sample_tf_cicd_01" เป็น "bluebirz_sample_tf_cicd_02" หมายความว่า เราต้องการให้มี bucket ชื่อใหม่ และทำลาย bucket เดิมนั่นเองฮะ
Commit และ push แล้วดูผลของ Cloud Build

กลับไปดู bucket และผลลัพท์เป็นไปตามที่กำหนดฮะ

code ของตอนนี้อยู่ใน repo ข้างล่างนี้นะฮะ