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

ก่อนอื่น Managing Access Keys for IAM Users - AWS Identity and Access Management


สร้าง 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_key_pair" "example" {
  key_name   = "$ {var.key_name}"
  public_key = "$ {file(var.pub_key)}"
}

ส่วนที่ 3 ส่วน resource instance

resource "aws_instance" "<name_instance>" {
  ....
  ....
  ....
}

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

resource "aws_instance" "example" {
  ami           = "$ {var.images}"
  instance_type = "$ {var.type}"
  key_name      = "$ {aws_key_pair.example.key_name}"
  ...
}

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

resource "aws_instance" "example" {
  ...
  ...
  ...

  provisioner "local-exec" {
    command = "echo $ {aws_instance.example.public_ip} >   ip_address.txt"
  }
  ...
  ...
  ...
}

3.3 ส่วนการ remote เป็นการเข้าไปทำอะไรก็ตามที่เราต้องการจะเข้าไปทำใน serverนั้นๆ

provisioner "remote-exec" {
  connection {
    type        = "ssh"
    user        = "ubuntu"
    private_key = "$ {file(var.pvt_key)}"
    host        = "$ {aws_instance.example.public_ip}"
    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_key_pair" "example" {
  key_name   = "$ {var.key_name}"
  public_key = "$ {file(var.pub_key)}"
}
resource "aws_instance" "example" {
  ami           = "$ {var.images}"
  instance_type = "$ {var.type}"
  key_name      = "$ {aws_key_pair.example.key_name}"
  provisioner "local-exec" {
    command = "echo $ {aws_instance.example.public_ip} > ip_address.txt"
  }
  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      user        = "ubuntu"
      private_key = "$ {file(var.pvt_key)}"
      host        = "$ {aws_instance.example.public_ip}"
      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 "type" {}
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 "type=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-northeast-1"
-var "images=ami-07f4cb4629342979c"
-var "type=t2.nano"
-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 "type=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-northeast-1"
-var "images=ami-07f4cb4629342979c"
-var "type=t2.nano"
-var "key_name=thnovice"

Destroy

$ terraform destoy 
or
$ terraform destoy --auto-approve
  • จะเป็นการ destroy จาก plan ที่สร้างไว้

Success (หลักการคร่าวๆประมาณนี้)

May 30, 2020