Introduction

Sebelumnya kita perlu tahu terlebih dahulu mengenai apa itu terraform , kemudian apa sih kegunaanya dan kenapa harus menggunakan Terraform, nah pada artikel kali ini saya akan menjelaskan sedikit tentang hal tsb.

Terraform adalah sebuah tools yang dibuat untuk membuat mengubah dan juga menggabungkan sebuah infrastruktur dengan smooth dan efisien menggunan code, atau konsep ini dikenal juga dengan istilah “Infrastructure as Code”.

Apa itu infrsatructure as code ? sebuah sistem atau metode pengelolaan infrastructure IT khusunya server yang menggunakan file konfigurasi berbasi code/coding dan beberapa bahasa pemograman yang kita gunakan seperti : Typescript, Python, java, C# & Golang

Kenapa kita perlu menggunakan metode “Infrastructure as Code” ? Hal-hal konfigurasi seperti creaate vm, storage dll yang semula manual via GUI dan juga tidak terdokumentasi kenapa IaC ini sangat membantu untuk mengkonfigurasi dan mengelola infrastruktur komponen tingkat rendah seperti membuat VM di cloud, Storage dan VPC, serta juga komponen tingkat tinggi lainya seperti entry DNS “management DNS”, fitur SAAS, dan lainya.

source by : terraform.io

Prepare

Hal-hal yang perlu disiapkan untuk ngelab pada artikel ini adalah sebagai berikut :

  • Install Terraform
  • Code editor
  • AWS Account
  • Linux/WSL “AWS CLI”

Sebelumnya pastikan anda sudah melakukan export key account AWS anda, jika belum silahkan check artikel saya yang satu ini :

AWS CLI export key

Study Case : Pada saat saya sedang membaca artikel tentang hal-hal yang berkaitan tentang DevOps, saya penasaran tentang apa itu Terraform dan juga bagaimana cara atau metode untuk menjalankanya pada sebuah cloud ?, nah karena hal itu lah saya mencoba mencari sebuah study case untuk praktik secara langsung atau implementasi penggunaan terraform ke AWS, karena tujuanya adalah supaya konfigurasi kita terdokumentasi dengan baik jika ada perubahan , update dan lainya ter commit di repository, dan untuk detail study case sebagai berikut :

Create ec2 in aws with Terraform “Infrastructure as a code”

Installation

Penggunaan terraform untuk provisioning instance

  • 1 VPC
  • 1 Public subnet
  • Security Group
  • Create Internet Gateway
  • Create route
  • Create 2 instance on AWS

Check it out

Step 1 – Create File Terraform

Ada 2 file yang akan kita gunakan

file terraform
  • Main.tf : berisi file konfigurasi yang akan kita gunakan nantinya contoh seperti, kita akan membuat vpc, subnet, security group dan juga instance dll
  • Terraform.rf : adlaah file kofngiruasi yang berisikan tentang provider apa yang akan kita automation dan juga versi dari terraform itu sendiri.

untuk file diatas sebenarnya beragam yang digunakan seperti variable, output dll, secara fungsi sama.

terraform.tf

terraform {
//Version terraform yang digunakan
required_version = "~> 1.2.6"
required_providers {
aws = {
version = "~> 4.24.0"
//Version aws provider yang disupport
}
}
}

main.tf

Step 2 – Create VPC network

Task pertama kita akan membuat resource untuk VPC nya terlebih dahulu, untuk registrynya ada di dokumentasi resmi terraform https://registry.terraform.io/providers/hashicorp/aws/latest/docs

#create vpc
resource "aws_vpc" "lab-1" {
cidr_block = "10.5.0.0/16"
tags = {
Name = "terraform-aws-vpc"
}
}

aws_vpc
 adalah type resource yang sudah terdaftar di aws & terraform

lab-1
 nama resource bisa di custom sesuai dengan kebutuhan

cidr_block
 adalah subnet IP yang akan kita gunakan, karena subnet itu tidak bisa dirubah ketika sudah di create maka saya membuat spare subnet /16 yang akan saya gunakan

tags
 nama tags untuk membuat deskripsi

Step 3 – Create Private Subnet

Task kedua membuat private subnet yang diambil dari salah satu subnet VPC yang kita buat

#create Public subnet
resource "aws_subnet" "public.subnet" {
vpc_id = aws_vpc.lab-1.id
cidr_block = "10.5.10.0/24"
tags = {
Name = "terraform-aws-public_subnet"
}
}

aws_subnet
 type resource

private_subnet
 nama resource custom yang bisa digunakan

vpc_id
 = 
t<strong>ype_resource</strong>
 dot 
nama_resource
 ditambahkan dot 
id

Step 4 – Create Security Group

Task ketiga adalah membuat security group yang dimana fungsi dari security group ini ibarat adalah firewall , contohnya adalah kita akan membuka aksess beberapa PORT TCP/IP & ICMP seperti SSH, Web, HTTPS dll, agar server dapat berkomunikasi ke external maupun internal

#create aws security group
resource "aws_security_group" "sg_terraform_lab" { #sg "security group"
name = "sg_terraform_lab"
description = "Configure Securty group for Terraform"
vpc_id = aws_vpc.lab-1.id
ingress {
description = "Allow SSH"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "Allow Web"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "Allow all protocol yang masuk"
from_port = -1
to_port = -1
protocol = "icmp"
cidr_blocks = [0.0.0.0/0]
}
ingress {
description = "Allow https from internet"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = [aws_vpc.lab-1.cidr_block]
}
egress {
description = "Allow semua protocol yang keluar"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "sg_terraform_lab"
}

aws_security_group
 Resource yang digunakan oleh terraform untuk manage security group di aws

vpc_id
 = 
t<strong>ype_resource</strong>
 dot 
nama_resource
 ditambahkan dot 
id

ingress
 adalah konfigurasi yang ditambahkan untuk akses dari eksternal kedalam / internal

egress
 adalah konfigurasi yang ditambahkan untuk mengijinkan protocol dari dalam/internal ke luar/eksternal

Step 5 – Create Internet Gateway

Disini kita membuat internet gateway berfungsi untuk menghubungkan antara subnet VPC main kita ke internet atau internal ke eksternal begitupun sebaliknya

#create internet gateway supaya bisa diakses dari luar
resource "aws_internet_gateway" "igw_labterraform" {
vpc_id = aws_vpc.lab-1.id
tags = {
Name = "Int gateway"
}
}

aws_internet_gateway
 resource yang digunakan untuk membuat int gateway

vpc_id
 disesuaikan dengan VPC main kita

Step 6 – Create Route

Route diperlukan untuk membuka komunikasi antara VPC atau instance ke pihak eksternal melalui Internet gateway yang sudah kita buat.

#Create route for VPC main to 0.0.0.0/0
resource "aws_route" "route" {
route_table_id = "rtb-0d988ec3cecc72e2a"
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw_labterraform.id
}

aws_route
 resource yang diperlukan untuk membuat route

route_table_id
 parameter yang diambil dari console AWS yang dimana itu otomatis ter create ketika kita membuat VPC main

destination_cidr_block
 adalah kita meng allow semua ip supaya kita bisa akses vps atau instance tersebut

gateway_id
 berisikan tentang nama value dari internet gateway itu sendiri yang kita buat

Step 7 – Create Instance

Task selanjutnya adalah ketika kita sudah membuat ip kemudian security group, maka selanjutnya kita setup konfigurasi instance di terraform sebagai berikut

#create EC2 or instance on AWS
resource "aws_instance" "lab_terraform" {
count = 2
ami = "ami-043f1fdec42408287"
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.sg_terraform_lab.id]
subnet_id = aws_subnet.private_subnet.id
associate_public_ip_address = true
key_name = "key-pair-terraform"
tags = {
Name = "lab-terraform"
Owner = "Gunawan"
}
}

aws_instance
 adalah resource yang digunakan terraform untuk membuat instance

count
 digunakan untuk menentukan berapa jumlah instance yang akan kita buat nantinya

ami
 adalah type image yang ada di AWS

instance_type
 adalah jenis atau spesifikasi yang akan digunakan

vpc_security_group_ids
 = parameters aws instance untuk define security group

[

aws_security_group
dot 
nama_tag_security_group
 dot 
id
] //type data : string list data

subnet_id
 adalah parameter aws instance untuk define subnet yang akan digunakan

associate_public_ip_address
 adalah paraeter aws instance untuk mendefine bahwa kita butuh IP public untuk diremote dari luar //type data boolean

key_name adalah nama keypair , sebelumnya kita harus tambahkan terlebih dahulu id_rsa.pub di laptop kita kedalam console AWS

Step 8 – Provisioning Instance

Ketika menjalankan terraform terdapat tiga perintah yang sering dijalankan

Terraform init
diperlukan untuk inisialisasi awal pada directory file terraform kita

  • terraform plan
     untuk mengetahui resource apa saja yang kita akan buat

  • terraform apply
     untuk melakukan provisioning membuat resource pada cloud provider kita dalam hal ini aws

  • terraform destroy
     adalah menghapus semua resource yang telah dibuat sebelumnya

Step 9 – Check console & Access SSH

Kemudian kita check terlebih dahulu apakah instance berhasil tercreate

Dan yang terakhir kita testing akses remote SSH nya

SSH instance-1

SSH instance-2

Selamat mencoba

NB : 

tfstate
 ketika kita membuat atau melakukan konfigurasi terraform akan ada 1 file dengan nama tfstate yang dimana file itu adalah sebuah kondisi sekarang atau saat ini dimana konfigurasimu sedang berlangsung, ketika melakukan perubahan , penammbahan atau pengurangan , jadi betapa pentingnya file ini ketika sebuah infra sudah production atau berjalan agar perlu diperhatikan agar file tersebut tidak hilang atau lebih baik di simpan di external bukan di laptop kita