ลองสร้าง Server บน Digital Ocean ด้วย Terraform

เกร่น ทำไม ต้อง terraform ด้วยความสามารถของมัน คือการ จัดการ Infrastructure ให้อยู่ใน รูปแบบ code (IaC) พูดง่ายๆ ก็คือ ทำให้ การจัดการ พวก Infra ให้อยู่ใน ภาษาที่ โปรแกรมเมอร์ เข้าใจง่ายๆ อีกจุดที่ลองใช้ เพราะ ไปเห็น เรื่อง Zero Downtime Updates Terraform Zero Downtime


Terraform Digital Ocean

ก่อนอื่น เพิ่ม ssh key ไว้ใน account

How to Upload SSH Public Keys to a DigitalOcean Account :: DigitalOcean Product Documentation

Structure

- main.tf //จะเป็น file หลักที่จะมีการ สร้าง droplet หรือ จัดการ resource ต่างๆ
- variables.tf // ที่ๆ เราประกาศตัวแปร ไว้ใช้ ใน main.tf 

ภายใน main.tf

ส่วนของ Provider ที่ใช้

provider "digitalocean" {
  token = "$ {var.do_token}"
}

ส่วน resource

resource "digitalocean_droplet" "< name_resource >" {
  ....
  ....
  ....
}

ส่วนแรก จะเป็นส่วน จัดการ droplet หรือ instance

resource "digitalocean_droplet" "droplet" {
    name = "$ {var.droplet_name}"
    image = "$ {var.droplet_image}"
    region = "$ {var.droplet_region}"
    size = "$ {var.droplet_size}"
    private_networking = false
    ssh_keys = [ "$ {var.ssh_fingerprint}" ]
    ....
    ....
}

ส่วนที่ 2 อาจจะเป็น ส่วนการ จัดการภายใน droplet ที่สร้างมา

provisioner "remote-exec" {
    connection {
      type     = "ssh"
      private_key = "$ {file("~/.ssh/id_rsa")}" // ที่เก็บ private key ที่เราเอา public ไปพวกไว้ ใน cloud provider ต่างๆ
      user     = "root" // user ที่จะทำการ remote ไป
      timeout  = "2m"
      host = "$ {digitalocean_droplet.droplet.ipv4_address}" // ip ที่ได้หลังการ สร้าง droplet
    }

    inline = [
      "export PATH=$PATH:/usr/bin",
      "sudo apt-get update",
      "sudo apt-get install nginx -y",
    ]
}

ภายใน variables.tf

variable "do_token" {}
variable "pub_key" {}
variable "pvt_key" {}
variable "ssh_fingerprint" {}
variable "droplet_name" {}
variable "droplet_size" {}
variable "droplet_image" {}
variable "droplet_region" {}

How to Start

Step 1 Init Terraform

$ terraform init

Step 2 Create Plan ของ กลุ่มนี้

$ terraform plan

เมื่อ เสร็จ จะได้ ไฟล์มาอีกตัวนึง ชื่อว่า terraform.tfplan เพื่อเป็นการ บันทึก โครงสร้างที่เราทำไว้

Step 3 Apply plan

$ terraform apply

Destroy

$ terraform destoy

หลักการคร่าวๆ จะเป็นการ destroy จาก plan ที่สร้างไว้