Provision Amazon EC2 menggunakan Terraform CLI

Proses konfigurasi infrastruktur atau service di Amazon Web Services (AWS) menggunakan Web GUI merupakan suatu hal yang nyaman. Kita sebagai engineer cukup terbantu dengan tampilan UI Web yang sangat informatif dan hanya dengan melakukan klik di beberapa menu, konfigurasi dapat terbentuk.

Namun bagaimana jika kita dihadapkan dengan kondisi konfigurasi service yang sifatnya pengulangan ataupun jika perlu konfigurasi service dengan jumlah yang cukup banyak. Mungkin metode konfigurasi via Web Console dengan melakukan klik dan konfigurasi di web akan sedikit melelahkan.

Untuk mengatasi hal tersebut, ada metode lain yang dapat kita gunakan dalam melakukan konfigurasi ataupun provision service yang kita gunakan di AWS. Metode tersebut menggunakan pendekatan Infrastructure as Code (IaC).

Dengan metode IaC, kita akan melakukan konfigurasi dengan cara membuat barisan barisan kode dimana kode tersebut nantinya akan diterjemahkan oleh sistem hingga dapat menjalankan service di AWS khususnya, namun metode IaC tidak terbatas hanya di AWS karena dapat digunakan juga di public cloud lain ataupun di on premise dan juga misalkan ketika membangun infrastruktur berbasis container seperti Docker ataupun Kubernetes.

Berikut beberapa hal hal yang kita dapatkan dengan menggunakan metode IaC:

  • Konfigurasi dilakukan dengan menulis barisan barisan kode yang mudah dibaca (human readable).
  • Dapat menerapkan kultur DevOps. Dengan metode ini, kode kode yang sudah ditulis dapat disimpan di version control system/source control management seperti git repository. Karena hal ini kolaborasi antar tim dapat terbangun.
  • Proses konfigurasi dilakukan secara deklarasi (declarative) dalam barisan barisan kode.
  • Karena dilakukan dengan metode deklarasi kode, hal ini dapat mempercepat dan mengurangi resiko kesalahan manusia (human error) dalam proses konfigurasi service.

Salah satu tool Infrastructure as Code yang umum digunakan saat ini adalah Terraform. Sebuah tool Infrastructure Provisioning ataupun Infrastructure as Code yang di-develop oleh Hashicorp.

Pada artikel kali ini saya akan mencoba mencontohkan konfigurasi AWS service via Terraform. Skenario yang digunakan pada artikel ini adalah saya akan membangun Amazon EC2 dengan AMI ubuntu 20.04 yang dideklarasikan via Terraform code. Key pair yang digunakan oleh EC2 adalah key pair yang sebelumnya sudah ada di AWS ataupun sudah dibuat sebelumnya. EC2 akan dijalankan di region ap-southeast-1 (Singapore), VPC dan security group yang digunakan adalah default. Terraform yang digunakan adalah Terraform CLI yang sudah terinstall di notebook. Berikut gambaran singkat topologinya:

Image.

Persiapan

Sebelum memulai konfigurasi, ada beberapa komponen yang harus disiapkan. Berikut diantaranya:

  • Terraform CLI yang sudah terinstall. Untuk langkah instalasi silahkan lihat di URL berikut: Install Terraform.
  • AWS Access Key, Secret Access Key, profile (default ataupun named profile) yang sudah dikonfigurasi via AWS CLI. Silahkan lihat detailnya di URL berikut: Configuring the AWS CLI.

Konfigurasi Kode Terraform

Langkah konfigurasi dimulai dengan membuat kode-kode terraform terkait provisioning EC2.

Pada artikel ini saya membuat 1 folder yang bernama ec2 dan di dalamnya terdapat 3 file terraform code (file dengan ekstensi file .tf) yang bernama main.tf, variables.tf dan outputs.tf.

Berikut struktur directorynya:

terraform-template-aws
|_ec2
  |_main.tf
  |_outputs.tf
  |_variables.tf.  
  1. Kita mulai dengan membahas file main.tf.

    Image.

    Dalam sebuah file terraform, diperlukan yang dinamakan provider. Provider inilah yang akan digunakan sebagai plug-in oleh terraform untuk menjalankan API terkait yang digunakan dalam provision service, misalnya AWS.

    Konfigurasi dapat dimulai dengan konfigurasi terraform setting block dengan mereferensikan provider aws dan juga versinya. Provider ini akan di-pull dari terraform registry. Berikut dokumentasi terkait Terraform AWS Provider: Docs Terraform AWS Provider.

# Setup terraform aws provider and version
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 3.49.0" # Please change version that will be used here
    }
  }
}
  1. Selanjutnya konfigurasi region yang akan digunakan dan credential. Metode credential yang digunakan pada artikel ini adalah shared credential file yang akan mengacu ke file .aws/credential. File dan profile akan mengacu ke variable yang didefinsikan di variables.tf.
# Setup aws region and credentials
provider "aws" {
  region                  = "ap-southeast-1"
  shared_credentials_file = var.aws_credential_file
  profile                 = var.aws_credential_profile
}
  1. Selanjutnya adalah mengambil informasi latest AMI ID ubuntu 20.04 yang didapat dari public parameter store AWS. Simak lebih lengkap terkait public parameter store AWS di URL berikut: Finding Public Parameters

    Image.

# Get latest public ubuntu AMI ID from Parameter Store in chosen region
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}
  1. Langkah berikutnya adalah mendenfisikan resource EC2 yang akan dibuat. AMI ID akan mengambil dari data source yang sudah didefinisikan di langkah sebelumnya. Kemudian key pair akan mereferensikan ke key pair yang sudah ada atau sudah pernah dibuat di AWS sebelumnya.

    Untuk instance type dan ukuran root block device EBS yang digunakan oleh EC2 akan mengambil dari variables yang didefinsikan di variables.tf. Selain itu konfigurasi akan mengasosiasikan public ip address ke EC2 dan membuat tags dengan key Name.

    Image.

# Setup EC2 instance using ubuntu AMI
resource "aws_instance" "your_ec2_instance_name" {
  ami                         = data.aws_ami.ubuntu.id
  instance_type               = var.ec2_instance_type
  associate_public_ip_address = true
  key_name                    = "your_key_pair_name"

  root_block_device {
    volume_size = var.ec2_volume_size
  }

  tags = {
    Name = "your_tag" # Please change name tag here
  }
}
  1. Selanjutnya berpindah ke konfigurasi variables.tf. Di file ini kita akan definsikan variable variable terkait yang akan menjadi referensi variable di main.tf.

    Image.

    Di artikel ini saya akan mendefinsikan variable aws_credential_file ke path atau tempat dimana file .aws/credentials berada dan variable aws_credential_profile akan mengacu ke nama profile yang digunakan. Variable ec2_instance_type akan mendefinisikan tipe instance yang akan digunakan dan pada contoh menggunakan t2.micro. Terakhir variable ec2_volume_size akan mendefinsikan besar root block device yang digunakan oleh EBS yang terintegrasi ke EC2, dan pada contoh adalah 10 (GB)

# Define path to aws credentials file
variable "aws_credential_file" {
  type        = string
  description = "Path to aws credentials file"
  default     = "~/.aws/credentials"
}

# Define aws profile
variable "aws_credential_profile" {
  type        = string
  description = "AWS profile used for provision services"
  default     = "ludes-terraform-admin"
}

# Define EC2 instance type
variable "ec2_instance_type" {
  type        = string
  description = "Amazon EC2 instance type"
  default     = "t2.micro" # Please change ec2 instance type here
}

# Define EC2 instance volume size
variable "ec2_volume_size" {
  type        = number
  description = "Amazon EC2 instance volume size"
  default     = 10 # Please change ec2 root volume size here
}
  1. File terakhir yang dikonfigurasi adalah outputs.tf. File ini akan memerintahkan terraform untuk menampilkan output public ip address yang digunakan oleh EC2 setelah terraform apply selesai atau setelah terraform selesai membangun service.

    Image.

# Define EC2 instance volume size
variable "ec2_volume_size" {
  type        = number
  description = "Amazon EC2 instance volume size"
  default     = 10 # Please change ec2 root volume size here
}

Menjalankan Terraform

Setelah proses konfigurasi kode selesai, selanjutnya adalah menjalankan terraform agar dapat provision AWS service.

Berikut langkah-langkahnya:

  1. Dapat dimulai dengan memastikan bahwa terraform sudah terinstall.

     terraform version
    

    Image

  2. Selanjutnya dapat melakuakn terraform formatting. Tujuannya agar file kode terraform yang kita buat sudah sesuai dengan format terraform.

     terraform fmt
    

    Image

  3. Selanjutnya inisialisasi terraform. Pada proses ini terraform akan melakukan instalasi provider yang sudah didefinisikan di kode.

     terraform init
    

    Image

  4. Selanjutnya jalankan planning atau perencanaan dari kode yang sudah dibuat sebelumnya. Terraform akan melakukan inspeksi dari kode yang sudah dibuat dan akan melakukan perkiraan resource atau service apa saja yang akan dikonfigurasi. Pada proses ini belum ada service atau konfigurasi yang dijalankan ke AWS

     terraform plan
    

    Image

    Image

  5. Selanjutnya jalankan perintah agar kode konfigurasi yang ada berjalan untuk membentuk resource atau provision AWS service.

     terraform apply
    

    Image

  6. Jika ada pesan konfirmasi masukan yes untuk menjalankan.

    Image.

  7. Alternatif lain jika tidak ingin menampilkan pesan konfirmasi dan misalkan sudah yakin untuk membentuk resource, dapat menjalankan perintah berikut.

     terraform apply -auto-approve
    

    Image

  8. Selanjutnya terraform akan mulai membentuk atau provision AWS resource/service. Karena di contoh artikel ini saya membuat 1 output yang menampilkan ip public yang di-associate ke EC2, informasi ini akan tampil setelah terraform apply selesai.

    Image

  9. Selanjutnya kita dapat verifikasi apakah betul bahwa EC2 sudah berhasil terbentuk. Masuk ke AWS Web Console, kemudian masuk ke menu EC2 instance. Di web console akan tampil 1 EC2 dengan nama yang sama seperti didefinisikan di kode dan statusnya running. IP address public juga sama seperti yang muncul di output sebelumnya.

    Image

  10. Verifikasi bahwa ssh ke EC2 dapat dilakukan. SSH menggunakan keypair yang sama dengan yang digunakan oleh EC2 ke public IP EC2.

    Image

  11. Pastikan bahwa SSH ke EC instance ubuntu berhasil.

    Image

  12. Kita juga dapat memastikan bahwa sistem operasi yang digunakan sesuai dengan AMI yang didefinisikan di kode. Begitu juga dengan besarnya root block device.

    Image

  13. Secara default, ketika terraform apply dijalankan selanjutnya terraform akan membuat 1 file dengan nama terraform.tfstate. File ini berisi informasi state resource yang sedang berjalan.

    Image

  14. Kita juga dapat verifikasi resource apa yang dibentuk atau dalam tracking terraform menggunakan perintah berikut.

    terraform state list
    

    Image

  15. Jika kita ingin menghapus resource atau service yang sudah tidak digunakan, kita juga dapat menjalankan perintah dari terraform. Resource yang akan dihapus atau terminate adalah resource yang masuk dalam tracking terraform di terraform state. Selain itu terraform tidak akan melakukan proses terminate.

    terraform destroy
    

    Image

  16. Sama seperti terraform apply, terraform destroy juga akan menampilkan pesan konfirmasi. Jika setuju, masukkan yes.

    Image

  17. Alternatif lain, sama seperti terraform apply. Dapat menjalankan perintah berikut jika sudah yakin dan tidak ingin menampilkan pesan konfirmasi.

    terraform destroy -auto-approve
    

    Image

  18. Tunggu hingga terraform destroy selesai.

    Image

  19. Selanjutnya kita bisa pastikan kembali via AWS Web Console. Kali ini instance dengan nama ludes-ubuntu-0 yang didefinisikan di kode, sudah tidak berjalan (terminated).

    Image

  20. Secara default terraform juga akan membuat 1 file dengan nama terraform.tfstate.backup. File ini berisi informasi resource terakhir yang berjalan sebelum resource/service tersebut dihapus atau destroy.

    Image

File terraform.tfstate dan terraform.tfstate.backup berisi informasi yang sifatnya sensitif. Harap simpan file ini baik baik, bisa juga dilakukan backup ke public storage misalkan AWS S3. Dan jangan sampai file ini sampai ke pihak lain yang tidak berkepentingan terhadap infrastruktur AWS kita.

Kesimpulan

Pada artikel ini kita sudah membahas dasar dasar dari Infrastructure as Code (IaC) dalam hal ini adalah Terraform. Termasuk didalamnya konfigurasi dasar membuat kode Terraform untuk provision Amazon EC2. Kita juga sudah membahas dasar dasar perintah Terraform bagaimana agar terraform berjalan sehingga dapat membangun atau provision AWS resource/service, termasuk juga menghentikan atau destroy resource/service AWS tersebut.

File contoh template terraform juga dapat dilihat di github saya: lanandra/terraform-template-aws.
Silahkan tinggalkan pesan jika ada saran, masukan, koreksi atau kritik.

Semoga bermanfaat dan terima kasih.

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

Situs yang Didukung WordPress.com.

Atas ↑

%d blogger menyukai ini: