สร้าง Server บน AWS Lightsail ด้วย Terraform

Use Infrastructure as Code to AWS Lightsail with Terraform


Terraform AWS LIGHTSAIL

  • ก่อนอื่น Managing Access Keys for IAM Users จาก ..

Managing Access Keys for IAM Users


สร้าง key pair ขึ้นมาเก็บไว้ก่อน

$ ssh-keygen

จะได้ key

$ ls ~/.ssh/
...
id_rsa          id_rsa.pub ...

Structure Basic

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

ภายใน main.tf

  • ส่วนที่ 1 ส่วนของ Provider ที่ใช้
provider "aws" {
  profile    = "$ {var.profile}"
  access_key = "$ {var.access_key}"
  secret_key = "$ {var.secret_key}"
  region     = "$ {var.region}"
}
  • ส่วนที่ 2 ส่วน resource set key pair aws
resource "aws_lightsail_key_pair" "example" {
  name      = "$ {var.key_name}"
  public_key = "$ {file(var.pub_key)}"
}
  • ส่วนที่ 3 ส่วน resource instance
resource "aws_lightsail_instance" "<name_instance>" {
  ....
  ....
  ....
}

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

resource "aws_lightsail_instance" "<name_instance>" {
  name              = "example"
  availability_zone = "$ {var.region}a"
  blueprint_id      = "$ {var.images}"
  bundle_id         = "$ {var.size}"
  key_pair_name     = "$ {aws_lightsail_key_pair.example.name}"
  ...
}

ส่วนที่ 2 ส่วนการ get ip เป็นการดึง ip ที่ได้มาออก file

resource "aws_lightsail_instance" "<name_instance>" {
  ...
  ...
  ...
  
  provisioner "local-exec" {
    command = "echo $ {aws_lightsail_instance.example.public_ip} >   ip_address.txt"
  }
  ...
  ...
  ...
}

provisioner "remote-exec" {
    connection {
      type        = "ssh"
      user        = "ubuntu"
      private_key = "$ {file(var.pvt_key)}"
      host        = "$ {aws_lightsail_instance.example.public_ip_address}"
      timeout = "2m"
    }
  inline = [
    "sudo apt-get update",
    "sudo apt-get install nginx -y"
  ]
}
  • สรุป main.tf ทั้งหมด
provider "aws" {
  profile    = "$ {var.profile}"
  access_key = "$ {var.access_key}"
  secret_key = "$ {var.secret_key}"
  region     = "$ {var.region}"
}
resource "aws_lightsail_key_pair" "example" {
  key_name   = "$ {var.key_name}"
  public_key = "$ {file(var.pub_key)}"
}
resource "aws_lightsail_instance" "<name_instance>" {
  name              = "example"
  availability_zone = "$ {var.region}a"
  blueprint_id      = "$ {var.images}"
  bundle_id         = "$ {var.size}"
  key_pair_name     = "$ {aws_lightsail_key_pair.example.name}"
  
  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      user        = "ubuntu"
      private_key = "$ {file(var.pvt_key)}"
      host        = "$ {aws_lightsail_instance.example.public_ip_address}"
      timeout = "2m"
    }
    inline = [
      "sudo apt-get update",
      "sudo apt-get install nginx -y"
    ]
  }
}
  • ภายใน variables.tf
variable "profile" {}
variable "access_key" {}
variable "secret_key" {}
variable "pub_key" {}
variable "pvt_key" {}
variable "region" {}
variable "images" {}
variable "size" {}
variable "key_name" {}

How to Start

  • Step 1 Init Terraform
$ terraform init
  • Step 2 Create Plan ของ กลุ่มนี้
$ terraform plan \
-var "profile=xxx"
-var "access_key=xxx"
-var "secret_key=xxx"
-var "pub_key=xxx"
-var "pvt_key=xxx"
-var "region=xxx"
-var "images=xxx"
-var "size=xxx"
-var "key_name=xxx"
# example apply
$ terraform plan \
-var "profile=xxx"
-var "access_key=<accesskey จาก aws iam>"
-var "secret_key=<secretkey จาก aws iam>"
-var "pub_key=~/.ssh/key.pub"
-var "pvt_key=~/.ssh/key"
-var "region=ap-southeast-1"
-var "images=ubuntu_18_04"
-var "size=nano_1_0"
-var "key_name=thnovice"

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

  • Step 3 Apply plan
$ terraform apply \
-var "profile=xxx"
-var "access_key=xxx"
-var "secret_key=xxx"
-var "pub_key=xxx"
-var "pvt_key=xxx"
-var "region=xxx"
-var "images=xxx"
-var "size=xxx"
-var "key_name=xxx"
--auto-approve
# example apply
$ terraform apply \
-var "profile=xxx"
-var "access_key=<accesskey จาก aws iam>"
-var "secret_key=<secretkey จาก aws iam>"
-var "pub_key=~/.ssh/key.pub"
-var "pvt_key=~/.ssh/key"
-var "region=ap-southeast-1"
-var "images=ubuntu_18_04"
-var "size=nano_1_0"
-var "key_name=thnovice"

  • Destroy
$ terraform destoy 
or
$ terraform destoy --auto-approve

จะเป็นการ destroy จาก plan ที่สร้างไว้