ผ่านมา 5 ตอนแล้วนะฮะ เรารู้จักพื้นฐานกันไปพอสมควรละ ทีนี้ ได้เวลาเอามาประยุกต์เข้ากับเครื่องมือ CI/CD กันบ้าง แน่นอน มันคือ Google Cloud Build

สำหรับใครที่ยังไม่รู้จัก หรืออยากอ่านเพิ่ม สามารถจิ้มที่ลิงก์ด้านล่างไปย้อนดูได้ฮะ

Google Cloud Build ให้ทำงานอัตโนมัติ
Google Cloud Build มันก็เป็น CI/CD tool ตัวนึง ท่ามกลางหลายๆ ตัว เช่น Jenkins หรือ Github Action และความที่ผมใช้ Google Cloud Platform มันก็มีเจ้านี่มาให้พร้อมแล้วอ่ะนะ

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.

buil

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

Commit และ push แล้วดูผลของ Cloud Build

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


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

GitHub - bluebirz/sample-terraform
Contribute to bluebirz/sample-terraform development by creating an account on GitHub.