Coding Gun

ใช้งาน Terraform Cloud แบบ Steps by Steps

Terraform cloud คือ Software as a Service(SaaS) ที่เราสามารถใช้บริการได้ฟรี เมื่อเราใช้ terraform cloud เราจะสามารภใช้งาน terraform โดยที่ไม่ต้องติดตั้ง terraform cli ลงในเครื่อง

Terraform cloud เหมาะสำหรับผู้ที่เริ่มต้นหัดให้งาน terraform เพราะใช้งานผ่าน GUI ได้ง่ายๆ ไม่ต้องจำ command เหมือนกับ Terraform CLI

สร้าง Terraform Cloud Account

เริ่มจากการสมัครสมาชิกเข้าใช้งาน terraform cloud กันก่อน โดยให้เข้าไปที่ terraform.io

  1. เลือก Try Terraform Cloud

    Try Terraform Cloud

  2. สมัครสมาชิกกันก่อน

  3. Activate Account ผ่าน E-mail

  4. เลือก workflow โดยมีทางเลือกต่างๆ ดังนี้

    • Provision example resources เราจะเลือก run ตัวอย่าง terraform configuration ที่ terraform เตรียมไว้ให้ เหมาะสำหรับผู้ใช้งานที่เพิ่งเริ่มต้นใช้งาน Terraform Cloud
    • Migrate local state ย้าย state จาก local ขึ้นมาไว้บน cloud เหมาะสำหรับผู้ที่เคยใช้งาน terraform cli มาก่อน
    • Create a new organization เริ่มต้นสร้างทุกอย่างใหม่ตั้งแต่ต้น
  5. ในตัวอย่างนี้เราจะเลือก Create new organization กรอก e-mail และตั้งชื่อ organization ตามต้องการ

    Terraform Cloud Create new organization

  6. เลือกประเภท Workflow ซึ่งมีอยู่ 3 ทางเลือก ดังนี้

    • Version Control Workflow เก็บ terraform configuration ไว้บน git repository จะ run terraform ทุกครั้งที่มีการทำ pull requests และการ merges
    • CLI-Driven Workflow จะ run ผ่าน terraform cli (ต้องมีการเชื่อม terraform cli กับ terraform cloud เข้าด้วยกันก่อน) อ่านวิธีการเชื่อมต่อได้ที่นี่
    • API-Driven Workflow เป็นการเรียกใช้ผ่านทาง API ซึ่งส่วนใหญ่จะอยู่ใน release pipeline
  7. เลือก Version Control Workflow

    Terraform connect to Version Control

  8. กด Authorize Terraform Cloud ในกรณีที่เกิดปัญหาให้ตรวจสอบว่ามีการ block-popup หรือไม่ ให้ไป allow การเปิด popup เช่น บน Safari ให้เลือก Perference -> Popup Windows -> เลือก Allow เฉพาะ app.terraform.io ตามรูป

    Safari allow popup windows on MacOS

    ส่วนปัญหาอื่นๆ สามารถเข้าไปดูแนวทางการแก้ไขได้ที่นี่

  9. กำหนดสิทธิให้กับ terraform cloud ในการเข้าถึง repository(แนะนำให้กำหนดเฉพาะ repository ที่ต้องใช้ terraform cloud เท่านั้น)

    Terraform cloud set read write permission

  10. เลือก repository ที่ต้องการเชื่อมต่อกับ terraform cloud

  11. ตั้งชื่อ workspace โดยที่ workspace นั้นจะต้องระบุ repository และ branch ที่เราต้องการเข้าไปทำงานด้วย

  12. เลือก branch ที่ต้องการ trigger terraform cloud (ส่วนใหญ่จะเป็น main branch หรือ master branch)

  13. เมื่อสร้าง workspace เสร็จเรียบร้อยแล้ว terraform cloud จะแจ้งเราว่าตอนนี้เรายังไม่ได้สร้างตัวแปรขึ้นมาใช้งานนะ ถ้าเราต้องการตั้งชื่อตัวแปรสามารถกด Continue to workspace overview ได้เลย

    Terraform cloud created workspace

  14. ในตัวอย่างนี้เราต้องสร้างตัวแปรขึ้นมา 2 ตัว คือ AWS_ACCESS_KEY_ID และ AWS_SECRET_ACCESS_KEY เพื่อที่จะเชื่อมต่อกับ Amazon Web Services(AWS)

  15. เลือก Configure variables

    Terraform cloud configured variables

  16. กดปุ่ม Add Variable และในกรณีนี้เราจะเลือก Environment Variables สำหรับจัดเก็บ AWS_SECRET_ACCESS_KEY ซึ่งจะปลอดภัยกว่าการใช้ terraform variable

    Terraform cloud add workspace variables

  17. สร้างตัวแปร AWS_ACCESS_KEY_ID และนำ AWS_ACCESS_KEY_ID ที่ได้มาตอน create user ใน AWS Identity and Access Management(IAM) ดูรายละเอียดขั้นตอนการเชื่อมต่อกับ AWS ได้ที่นี่ AWS_ACCESS_KEY_ID ไม่ต้อง click sensitive เพราะเป็นเพียงแค่ ID ของ user ไม่ใช่ความลับ

  18. สร้างตัวแปร AWS_SECRET_ACCESS_KEY และอย่าลืม click เลือก sensitive ด้วยเพราะ AWS_SECRET_ACCESS_KEY เป็นข้อมูลที่เป็นความลับ

    จะได้ผลลัพธ์ดังรูป

    Terraform cloud add workspace variables

  19. กลับไปที่หน้า Workspace แล้วเลือก Start new plan

  20. ถ้าใน repository ที่เราเลือกเชื่อมต่อกับ workspace นี้มี terraform configuration อยู่ก็จะมีการ trigger ให้ terraform configuration นั้นขึ้นมาทำงาน แต่ถ้ายังไม่มีก็จะเกิด Error message แบบนี้

    Error: No Terraform configuration files found in working directory
    

    ให้เพิ่ม terraform configuration นี้เข้าไปใน repository ก่อน โดยในตัวอย่างนี้ผมจะตั้งชื่อว่า main.tf

    provider aws {
        region = "ap-southeast-1"
    }
    
    resource "aws_instance" "web" {
        ami           = "ami-0464f90f5928bccb8"
        instance_type = "t3.micro"
    
        tags = {
            Name = "HelloWorld"
        }
    }
    
  21. หลังจากที่ push code ขึ้นไปบน repository terraform จะ trigger ให้เกิดการ run terraform plan โดยอัตโนมัติ

    Terraform cloud automatically run new plan

    เมื่อ terraform configuration ไม่มี error state ของ runs จะกลายเป็น Planned ซึ่งหมายถึง terraform plan ทำงานเสร็จแล้ว

    Terraform cloud planned

  22. สุดท้ายเราแค่เข้าไปกด Confirm Plan เพื่อยืนยันการสร้าง resources บน cloud เป็นอันเสร็จเรียบร้อย

    Terraform cloud confirm plan

    ซึ่งในระหว่างนี้เราสามารถ cancel การ apply ได้ตลอดเวลา สุดท้ายเมื่อ apply เสร็จเรียบร้อย ลองเข้าไปดูผลลัพธ์ใน AWS console จะเห็นว่ามี EC2 Instance ที่สร้างขึ้นมาใหม่ ดังรูป

    EC2 Instance created by Terraform Cloud

การ run terraform plan บน Terraform cloud จะต้อง run ทีละตัวไม่สามารถ run พร้อมกันได้

ถ้าต้องการลบ Resources ที่ได้สร้างขึ้นจาก Terraform ให้ทำตามนี้

ในกรณีที่เราต้องการ destroy plan หรือ delete workspace ให้เข้าไปใน Workspace ที่เราต้องการแล้วเลือก Settings -> Destruction and Deletion หลังจากนั้นกดปุ่ม Queue destroy plan หรือ Force delete from Terraform Cloud

Terraform cloud destroy

Terraform Cloud vs Terraform CLI

ความแตกต่างของ Terraform Cloud กับ Terraform CLI คือ การจัดการ state Terraform จะเก็บ state ไว้บน cloud เรียกว่าเป็น remote state แต่ Terraform CLI จะจัดเก็บ state ไว้ใน folder ที่เรา run terraform เรียกว่า local state

Login Terraform Cloud ผ่าน Terraform CLI

เราสามารถใช้ terraform cli login เข้าไปยัง terraform cloud เพื่อใช้งานผ่าน command line ได้ โดยที่จะต้องทำตามขั้นตอนต่างๆ ดังนี้

  1. Login ผ่าน Terraform CLI ด้วยคำสั่ง
    terraform login
    
  2. Terraform จะถามว่าให้ generate token แล้วเก็บไว้ในไฟล์ /.terraform.d/credentials.tfrc.json นี้เลยมั้ย
    Terraform will request an API token for app.terraform.io using your browser.
    
    If login is successful, Terraform will store the token in plain text in
    the following file for use by subsequent commands:
        [Your user path]/.terraform.d/credentials.tfrc.json
    
    Do you want to proceed?
        Only 'yes' will be accepted to confirm.
    
        Enter a value: 
    
  3. ให้ตอบ yes จะไปต่อในขั้นตอนถัดไป
  4. หลังจากนั้นจะ popup browser ขึ่้นมาให้ตั้งชื่อ API Token โดย default จะตั้งเป็น “terraform login”
  5. Click Create API token
  6. นำ Token นั้นกลับไปใส่ใน command line
    Token for app.terraform.io:
        Enter a value:
    
  7. หลังจากนั้นจะขึ้นข้อความว่า เชื่อมต่อกับ terraform cloud เรียบร้อย
    Retrieved token for user redacted
    
    Welcome to Terraform Cloud!
    

อ่านต่อเพิ่มเติมได้ที่นี่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security