โดยบทความนี้ก็เหมือนเดิมมม เราจะเน้นเรื่องของการลงมือทําเหมือนเช่นเคย ไม่ต้องอ่านมาก ไปลงมือเล่นกันดีกว่า เรียนรู้อย่างงี้จะเข้าใจมากกว่า อ่านอย่างเดียวแน่นอน

Github Repository: https://github.com/howtoautomateinth/awesome-terraform

แนะนําให้กด STAR ไว้ที่ repository ด้วย จะได้ไม่พลาดทุกการ update เพราะว่าเวลามีอะไรใหม่มาจะคอยอัพเดตผ่าน repository นี้

แต่ที่แนะนําให้เข้าไปอ่านสรุปจริงๆเลยจะคือ awesome-terraform เพราะว่าเจ้าตัวนี้จะรวบรวมเนื้อหาแบบสั้นๆๆและเข้าใจง่ายไว้หมดแล้ว แต่ข้อเสียคือมันยาวมากไปหน่อย  😀


 

สมัยนี้เวลาเราทํางานกับ Cloud เจ้าต่างๆอย่าง AWS หรือ Gcloud เราไม่ได้ใช้คนไปนั่งกดสร้างเครื่องแล้วตั้งค่า security group ของแต่ละ instance บน cloud เพราะการทําอย่างนั้นมันนอกจากจะเสียเวลาแล้วยังมีความเสี่ยงที่จะเกิด user error อีกด้วย 🙂

ซึ่งในยุคนี้ก็ไม่พ้นเรื่องของ Infrastructure-as-a-code ที่ทําหน้าที่ provisioning infra. ขึ้นมาด้วย code ทั้งหมด โดยนอกจากจะลดการผิดพลาดของคนลงแล้ว ยังสามารถทํา automation สําหรับ infra., ตรวจสอบ infra. ได้ว่าขึ้นมาถูกจริง และ monitor ให้ infra. ของเราอยู่ใน certain state ที่ต้องการ (แปลง่ายๆคือ เราต้องการ 4 เครื่องตลอดการใช้งาน มันก็ต้องมี 4 เครื่องตาม state นั้น ถ้าเครื่องไหนพังไปมันก็ต้องสร้างใหม่ให้เรา)และ ที่จะพูดถึงวันนี้ก็คือ Terraform  ซึ่งจริงๆแล้วนอกจาก Terraform ยังมี provisioning tools อีกมากมาย หรือจะใช้ native tool ของ cloud provider แต่ละเจ้าก็ได้เช่น CloudFormation

คําถามที่ทุกคนคงมีขึ้นมาในใจทันทีเลยก็คือ ทําไมต้อง Terraform ละ? ในเมื่อตัว Native ของ Cloud Provider อย่าง AWS CloudFormation ก็มี …. ซึ่งคําตอบก็เป็นเหมือนทุก tools นั้นแหละ

  1. เราต้องการ one-for-all หรือ tools ที่จะช่วยให้เราลดเวลาในการ provision ใน cloud provider หลายๆเจ้า โดยเขียนครั้งเดียวนั้นเอง ซึ่ง tools terraform ก็ช่วยลดเวลาในส่วนั้นด้วยการแค่ add provider หลายๆเจ้าเข้ามาให้เรา enable ใช้นั้นเอง
  2. Terraform แยก execution กับ planning ออกจากกันด้วย แปลว่าเราสามารถตรวจสอบก่อนจะสั่ง provision เครื่องได้ว่า เรากําลังจะสร้างอะไรขึ้นมาบ้าง โดยแค่สั่ง terraform plan
    • หน้าตาเวลาสั่งเสร็จมันจะออกมาแบบด้านล่างนี้ ให้ดูว่า aws component ที่กําลังจะสร้าง มันจะมีอะไรบ้าง
  3. Terraform Graph ช่วย visualize graph ให้เราดูก่อนที่เราจะทําการ apply infra. เข้าไปในระบบของเราได้ ช่วยในการวางแผนกับโปรเจคได้อย่างดีเลย แค่ terraform graph | dot -Tsvg > graph.svg
    • หน้าตาเวลาสั่งเสร็จมันจะออกมาแบบด้านล่างนี้ ให้ดูว่า aws component ที่กําลังจะสร้าง มันจะมีอะไรบ้าง

มาดูตัว Workshop ที่จะเล่นกัน

จะมีแบ่งเป็นการใช้งาน Terraform หลักๆแล้ว โดยที่แบ่ง folder เป็นหัวข้อที่น่าสนใจต่างๆ โดยจะมีดังนี้

  1. simple
    • แบบโคตรเบสิคของ Terraform คือมี variables type ไหนได้บ้าง
    • ไฟล์ตัวอย่าง Terraform.tfvars ที่ทําหน้าที่เก็บตัวแปลแยกต่างหากไว้ เพื่อจัดการกับ credential หรือ รับตัวแปลจากข้างนอก (ซึ่งโดยปกติแล้วจะ ignore file นี้ออกจาก git เพื่อให้ไม่มี credential บนนั้น แต่ในกรณีนี้เป็นตัวอย่างให้ดูเลยสร้าง exceptional ไว้ใน ignore file)
  2. spinning
    • มาทดลองสร้าง AWS instance ตัวแรกในชีวิตของเราเองกันเถอะ
  3. modules
    • เมื่อเราใช้งาน Terraform จริงๆจังๆ เราจะพบว่ามันมีหลายส่วนที่ duplicate กันเต็มไปหมดเลย เพราะฉะนั้นสิ่งที่เราทําเหมือนเวลาเขียนโค้ดก็คือสร้าง module ต่างๆขึ้นมา เพื่อให้มัน reusable ได้ แค่ส่ง arguments เข้าไป
    • หลักการมันจะเหมือน python module มากๆๆๆๆๆ คือมอง folder เป็น package นั้นเอง ถ้าใครใช้ python ก็จะเข้าใจง่ายหน่อย แต่ถ้าไม่ก็มอง 1 folder เป็น 1 module
  4. datasources
    • มอง datasources เป็นแหล่งก้อนกําเหนิดอะไรซักอย่างที่เป็น dynamic มากๆ เช่น AMI ID ของ AWS ที่มันเปลี่ยนไปเรื่อยๆๆ แล้วเราต้องการจะใช้ AMI เหล่านั้น
    • จะให้ไป fix variables เป็น hardcode ในยุค 2020 ก็ดูจะเป็นอะไรที่สิ้นคิดไปหน่อย datasource เลยเป็นก้อนข้อมูลที่เราดูดลงมาแล้ว filter เอาเฉพาะที่จะใช้ออกมานั้นเอง
    • cloud provider แต่ละเจ้าจะ provide มาให้อยู่ละ
  5. aws
    • ลองเล่นแต่บน local มันก็ยังไงอยู่ เลยเลือก cloud provider เจ้ายยอดนิยมขึ้นมาให้ลอง spin instance เล่นกัน กับพวก option ต่างๆๆที่เราสามารถเข้าไปอ่านได้ว่าใช้ยังไง
    • จะมีพวก ec2, ec2 และ ebs, vpc และ ecr (elastic container repository)
  6. packer
    • แบ่งเป็นสองเรื่อง
      • provision machine
      • provision software on machine
    • provision machine ขึ้นมา สิ่งที่ต้องคิดถึงนอกจากสร้างเครื่องขึ้นมาละ คือเรื่องของ software on that machine เช่น docker, agent ต่างๆนาๆที่เราตั้งใจจะสร้าง instance ไว้
    • provision software on machine มันก็คือพวก chef, puppet หรืออื่นๆๆ
    • ในบางโอกาสเราอาจจะเลือกที่จะไม่ provision software on machine หลังจาก provision machine แต่เป็นการ build custom AMI ของเราเองขึ้นมาเลย เพื่อลดเวลาในการ provision software ซึ่ง packer ก็คือเครื่องมือเพื่อทําอย่างงั้น

สิ่งที่ควรจะทําก่อนที่จะลองเล่นกับ Terraform

  1. AWS credential
    • ไป create AWS user แยกไว้สําหรับในการใช้งาน terraform เพื่อสร้างเครื่อง
    • สร้าง private key ด้วย เพื่อเอาไว้ผูกกับ ec2 instance
      • AWS สร้างได้แต่ private key นะ เราต้องเอา private key นั้นมันสร้าง public key เอาเอง
      • window ก็ใช้ putty-gen สร้าง public ที่ต้องผูกกับ ec2 instance ได้เลย
  2. ทุก Chapter ที่แยกเป็น folder ไว้ต้องการ terraform.tfvars ถ้าเราไม่สร้างก็ได้ แต่เวลาก่อนจะ execution หรือ plan มันจะ prompt ใน CLI ให้เรากรอกอยู่ดี
  3. ไฟล์ version.tf ไม่มีอะไรมาก มันแค่บอกว่าให้ใช้ terraform version 0.12 ขึ้นไป เนื่องจากหลังจาก version 0.11 ขึ้นมามี syntax บางอย่างเปลี่ยนไป พวก interpolation มันหายไปแล้ว เดี๋ยวจะงง เลยให้ใช้ 0.12 ไปเลยดีกว่า
  4. syntax ของ Terraform เข้าใจง่ายมากคือ
    variable "mylist" { 
      type = list(string)
      default = [1,2,3] 
    }
    
    • type ของ object นั้น เช่น
    • ชื่อตัวแปร ” .. “
    • { .. } scope
    • options ต่างๆใน scope เช่น
      • AWS ec2 instance
        • มี options ตามนี้ ทั้ง required และ optional

Chapter 1 – Simple

มีแค่ 2 files ง่ายๆเลยคือ variable.tf และ terraform.tfvars  โดย variables จะมี type อยู่แค่

  • string
  • number
  • bool
  • list()
  • map()
  • set()

พวกช่องว่างของ variable “AWS_ACCESS_KEY” นี้เว้นไว้เพราะจงใจนะ ไม่ได้ลืม 😀 เว้นไว้เพื่อให้ไม่มีค่านั้นเอง แล้วใช้ terraform.tfvars เป็นตัวใส่ค่าเข้ามา เพื่อแยก credential ออกไปนั้นเอง

ตัวอย่าง credential ที่เราไม่ควรใส่เข้าไป แต่ใช้ file แยกเพื่อเอาค่าเข้าไป provision machine นั้นเอง

Chapter 2 – Spinning

เรียนรู้ object เยอะไปก็เท่านั้นมาลองสร้างเครื่อง AWS EC2 instance ขึ้นมาเลยตั้งแต่ตอนแรกดีกว่า

โดยหลักๆเลย เราต้องระบุก่อนว่าเราจะใช้ cloud provider ตัวไหน ซึ่งในตัวอย่างนี้เราเลือกยอดนิยมคือ AWS นั้นเอง แล้วก็ระบุ required filed ให้กับ provider อย่าง region เข้าไป และ optional พวก keys จะได้ไม่ยุ่งยาก

variables ก็ทั่วไปพวก AMI id ต่างๆใน region นั้นๆ ทําเป็น map (key-value) ไว้ เวลามาเรียกใช้งานจะได้ระบุ

ส่วนเจ้านี้ก็แค่สร้าง instance ขึ้นมาชื่อ example type เป็น t2.micro เพราะมันฟรีเวลาสมัคร AWS account ใหม่ๆ

Chapter 3 – Modules

ภาพรวมของ modules คือเจ้า main.tf เนี่ยจะเป็นตัวที่ไปเรียกใช้ modules simple_modules โดยเราสามารถรเลือกที่จะสร้าง dev หรือ prod ก็ได้ โดยตัวอย่างนี้เราจะสร้างทั้งสอง environment เลย

โดยเราใช้ Module source เพื่อ references ไปที่ child module ของที่เราสร้างขึ้น ซึ่งเราสามารถใช้ทั้ง local path หรือไปที่ channel อื่นๆ เช่น Github ก็ได้

ด้วยวิธีนี้เราสามารถเลือก Module ที่จะนํามาใช้ได้นั้นเอง

ซึ่งถ้าตาม source ไปจะพบว่ามันจะ refer ไปถึง simple_modules folder ที่มองว่าเป็น modules ของ terraform (มันแบ่งตาม folder)

ซึ่งในนั้นก็จะมี aws_elasticache_replication_group ที่เป็น resources รอรับ variable ที่ส่งเข้ามาอยู่นั้นเอง สังเกตุ var. ต่างๆที่ส่งเข้ามาจาก module

ด้วยวิธีนี้จะทําให้เราสามารถ resuse resources ได้

โดยเมื่อเราทําการ terraform plan ออกมาแล้วเราจะได้ 2 module แยกกันตามชื่อ module ดังรูปข้างล่าง

Chapter 4 – Data source

Data source คือก้อนไว้ filter dynamic data … จําแค่นี้เลย 🙂

ในตัวอย่างนี้เราจะเอาค่าของ aws_ip_ranges ใน European มาใช้

จะเห็นว่าเราสร้าง data “aws_ip_ranges” ขึ้นมาแล้วก็ filter พวก regions ที่เราต้องการ แล้วก็เอามาใช้ใน aws_security_group บรรทัด 15,16 นั้นเอง

บางคนอาจจะสงสัยแล้ว เราจะรู้ค่าที่ return กลับมาได้ไง?​ไม่ยากเลย อ่าน document ทุกครั้งเวลาทําอะไรนะครับบ 🙂

Chapter 5 – AWS

ตัวอย่างใน AWS folder ทั้งหมดจะเป็นตัวอย่างการ provision บน AWS ทั้งหมดพวก

  • vpc
  • ecr (elastic container repository)
  • ec2
  • ec2 กับ storage ebs

มีจุดน่าสนใจคือพวก aws_key_pair ว่าเราสามารถใช้พวก built in function file(…) ที่จะไป file path นั้นๆ

แล้วเราก็ใช้ aws_key_pair resource เรียกไปที่ชื่อ key ที่เราสร้างขึ้นมาได้เลย ด้วยวิธีนี้เราจะได้ instance ที่มี key แล้วเราก็สามารถ SSH เข้าไปได้นั้นเอง !!! 🙂

ที่เหลือในตัวอย่างก็​ instance ทั่วไป ไม่ได้มีไรแปลกใหม่กว่าที่เราลองเล่นกันมาเท่าไร

Chapter 6 – Packer

Packer คือเครื่องมือ pack เพื่อสร้าง Machine Images ซึ่งเราสามารถใช้ chef,puppet เข้าร่วมด้วยได้ด้วย เพื่อ provision software

วิธีใช้คือง่ายมากแค่สร้าง file *.json แล้วก็เริ่ม config ได้เลย โดยแบ่งออกเป็น 4 ส่วนหลักๆคือ

  1. variables
    • ตรงตัวเลยว่าเป็นการสร้างตัวแปรหรือเรียกตัวแปรมาใช้นั้นเอง
  2. builders
    • ดูตรง type บรรทัดที่ 7 ในรูปด้านล่างคือตัวอย่างของ image ที่เราจะ build ออกมานั้นเอง
    • เราสามารถเข้าไปเลือกว่าเราจะ build ออกเป็น image แบบไหนจากตรงนี้นั้นเอง
  3. Provisioners
    • จังหวะเนี้ยแหละ install software ที่จําเป็นลงไปใน Image
    • โดยวิธีการใช้งานขึ้นอยู่กับ type ของ provisioner เช่นถ้าเป็น shell แล้วเราจะลง docker, redis บน Image ก็ต้องใช้ command-line ของ image นะ เช่น Ubuntu ก็ sudo apt-get
    • ไปดูทั้งหมดได้ references 
  4. Post-Processors
    • จะทําหลังสุดเมื่อ image build เสร็จแล้ว เช่นจะ Upload ไฟล์หรือ, zip data ต่างๆนาๆ
    • เป็น optional


 

0 0 vote
Article Rating
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments