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

Use Infrastructure as Code to AWS Lightsail with Terraform


Terraform AWS LIGHTSAIL

ก่อนอื่น 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

$ 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 ที่สร้างไว้

หลักการคร่าวๆ Success

May 30, 2020