จากบล็อกก่อนที่คุยเรื่องแยกตัวแปรไว้ใน file เอาไว้ใช้สำหรับแต่ละ environment ทีนี้ มันมีประเด็นว่า 1 folder ก็จะมีได้แค่ 1 state ถ้าเราจะแยกหลายๆ environment ก็จะต้องมีหลาย folder ที่มี tf script เหมือนกันซ้ำๆ งั้นเหรอ

มันมี feature นึงที่ Terraform ทำเอาไว้ใน case นี้ฮะ เรียกว่า "Backend"

Backend ของ Terraform เอาไว้บอกว่า state file จะเก็บไว้ที่ไหนฮะ ค่าเริ่มต้นคือ "local" หรือก็คือในเครื่องของเรานั่นแหละ แต่ความที่เราใช้ Terraform จัดการบน cloud มันก็เลยมีหลายประเภทให้ใช้ด้วย อย่างของผมที่ใช้ Google Cloud Platform มันก็มีให้ใช้ Google Cloud Storage เป็น backend ได้ฮะ

ถ้าอยากอ่านว่ามีอะไรอีกบ้าง ก็จิ้มที่ลิงก์ข้างล่างไปอ่านเพิ่มเติมได้ฮะ

Backend Type: gcs | Terraform | HashiCorp Developer
Terraform can store the state remotely, making it easier to version and work with in a team.

Syntax

เราจะขึ้นต้นด้วย backend และตามด้วย gcs หมายถึง Google Cloud Storage เพื่อให้ Terraform กำหนด backend ตามรูปแบบนี้ฮะ

terraform {
  backend "gcs" {
    bucket = "<bucket_name>"
    prefix = "<path_prefix>"
  }
}

ทีนี้ backend ต่างกัน ก็จะต้องเขียน attribute ต่างกันด้วย คือถ้าไม่ใช่ gcs ก็จะไม่เขียนแบบนี้แหละ ก็ต้องอ่านเอกสารข้างบนอีกทีนะฮะ

และเราจะต้องสร้าง bucket ที่เรากำหนดก่อนนะ ให้ Terraform ใช้มันต่อได้ มันไม่สร้างให้ก่อนนะ


เริ่มลองใช้กันได้

รู้คร่าวๆ กันไปแล้ว ทีนี้ก็มาลองลงมือจริงกัน

สร้าง backend.tf

เราจะสร้าง file ขึ้นมาเป็น backend configuration ฮะ แบบนี้

หมายความว่า state file ของเราจะเก็บไว้ที่ gs://bluebirz-terraform-backend-bucket/terraform/state/ ไงล่ะ

Init

แล้วก็มา terraform init ถ้าสำเร็จมันจะขึ้นข้อความบอกว่า backend "gcs" กำหนดเรียบร้อยแล้ว แบบนี้

แต่ถ้าไม่สำเร็จ จะเด้งเตือนมาแบบข้างล่างนี้ฮะ ส่วนใหญ่จะเกิดจากว่าเราไปแก้ไข backend มันหลังจากที่ initial แล้ว มันก็จะฟ้องให้เราไป initial ใหม่อีกรอบนึง

Apply

ติ๊ต่างว่า validate กับ plan เสร็จแล้วนะ ก็ apply ได้เลย

เนี่ยแหละ เราจะเห็น bucket ที่เราสร้างจาก tf script แล้วล่ะ

ถ้าเราลองแกะอ่านเนื้อในของ state file ที่อยู่ใน bucket จะเห็นข้อมูลว่าเราทำอะไรไปบ้าง อย่างอันนี้ก็มีชื่อ bucket ที่เราสร้างใหม่ ก็คือ bluebirz_bucket_test1 นะฮะ Terraform แค่ย้าย state file ไปอยู่บน cloud ที่เรากำหนดแค่นั้นเองฮะ


ลอง script ใหม่แต่ใช้ backend เดิม

บางครั้งเราจำเป็นต้องสร้าง tf script อันใหม่ อยู่ที่ใหม่ เครื่องใหม่ แต่ต้องการใช้ backend ที่มีอยู่แล้ว มันแปลว่าเราจะแก้ไขของเดิมนะฮะ ไม่ได้สร้างของใหม่ เพราะเราใช้ state file เดิมเลย

ตัวอย่างนี้ ผมจะสร้าง tf script อันใหม่อยู่ใน folder ใหม่ชื่อ "another_folder" แล้วก็ init

ตั้งใจให้ tf script อันใหม่เนี่ยเหมือนของเดิมทั้งหมด ยกเว้น bucket name ที่เปลี่ยนจาก "bluebirz_bucket_test1" ไปเป็น "bluebirz_bucket_test2" พอเราลอง  plan ปุ๊บ จะเห็นว่า มันแจ้งว่าเรากำลังจะแก้ชื่อ bucket นะ ไม่ใช่จะสร้าง bucket ใหม่ ตรงนี้ก็พอเข้าใจเพิ่มขึ้นนะฮะว่ามัน share state file ร่วมกันล่ะ


เราสามารถใช้ backend ของมันเนี่ยแหละ ช่วยจัดการแต่ละ environment ได้ โดยกำหนด backend แยกกัน ช่วยทำให้งานเราเป็นสัดส่วนและเป็นระเบียบมากขึ้นฮะ