Manage Digital Ocean with Terraform

สำหรับคนที่ชอบเปิดเอา Compute Node มาเล่นแต่ยังไม่ใช้ Kubernetes ถ้าใช้ Terraform เราก็จะสามารถ สร้างและเชื่อมกับ DNS ได้เลยเร็วๆ บน Digital Ocean ปกติเห็นตัวอย่างในเวปจะมีแต่ใช้ AWS กัน

เข้าไปดูเต็มๆได้เลยที่นี่

varokas/tf-scripts
Terraform Scripts. Contribute to varokas/tf-scripts development by creating an account on GitHub.github.com

ด้านบนสุดของไฟล์จะเป็นการประกาศ provider ที่ใช้ พร้อมกับ Credential ที่จะใช้ ส่วนมาจะประกาศเป็น variables ไว้จะได้ไม่เผลอ commit เข้ามา แล้วใส่ของจริงไว้ใน terraform.tfvars ซึ่งจะเป็น .gitignore ไว้

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

provider "cloudflare" {
  email = "${var.cloudflare_email}"
  token = "${var.cloudflare_token}"
}

จากนั้นก็อัพโหลด public key ที่จะใช้เข้าไป `public_key_path` default ไว้ที่ ~/.ssh/terraform.pub เปลี่ยนได้ตามใจชอบ

resource "digitalocean_ssh_key" "terraform" {
  name       = "terraform"
  public_key = "${file(var.public_key_path)}"
}

จากนั้นก็สร้าง droplet ได้เลย ตรงนี้จะมีจุดที่ทำได้ไม่ดีอย่างนึง ต้องบอก Digital Ocean ว่า MD5 Fingerprint ของ public key ที่จะใช้คืออะไร (แทนที่จะใช้ชื่อที่เพิ่ง upload ไป !?!) ก็เลยต้องประกาศตัวแปรไว้ แล้วก็อปค่าไปแปะเอาเอง

$ ssh-keygen -E md5 -lf ~/.ssh/terraform.pub | awk '{print $2}'
MD5:89:1b:3e:b1:cd:37:53:9c:78:19:48:6b:e6:df:81:fe

เวลาก็อปมาไม่ต้องเอา MD5: มาด้วย ได้เป็นแบบนี้

terraform_ssh_fingerprint="89:1b:3e:b1:cd:37:53:9c:78:19:48:6b:e6:df:81:fe"

จากนั้นก็เอามาใช้ได้ใน droplet resource

resource "digitalocean_droplet" "winter" {
  image  = "ubuntu-18-04-x64"
  name   = "winter"
  region = "sfo2"
  size   = "s-1vcpu-1gb"
  backups = "true"
  ssh_keys = ["${var.terraform_ssh_fingerprint}"]
}

สุดท้ายเอา ip address ที่ได้ มา register DNS ผ่าน Cloudflare แบบนี้

# Create DNS record on CloudFlare
resource "cloudflare_record" "winter" {
  domain = "varokas.com"
  name   = "blog"
  value  = "${digitalocean_droplet.winter.ipv4_address}"
  type   = "A"
  ttl    = 3600
}

จากนั้นก็สั่ง terraform apply แล้วก็ใช้ได้เลย

$ ssh -i ~/.ssh/terraform root@winter.varokas.com