tl;dr: Langkah-langkah awal konfigurasi AWS IAM dan Terraform Cloud Workspace untuk pembuatan resource AWS
Konfigurasi dan penggunaan Infrastructure as Code akan mendapat nilai lebih ketika kita bisa melakukan collaborative IaC atau kita bisa berkolaborasi dengan rekan kerja atau developer/engineer lain saat melakukan provision resource.
Terraform sebagai salah satu IaC tools yang umum digunakan saat ini menyediakan fitur tersebut melalui platform Terraform Cloud miliknya. Sekilas lebih detail terkait Terraform Cloud dapat dilihat di dokumentasi berikut.
Contoh kasus atau use case yang sering kita jumpai adalah misal kita ingin berkolaborasi dengan teman tim atau developer/engineer lain ketika akan melalukan pembuatan atau provision resource di public cloud semisal Amazon Web Services (AWS).
Pada artikel kali ini, saya akan membahas lebih lanjut hal-hal dasar apa saja yang dibutuhkan ketika kita ingin membuat atau provision resource AWS melalui Terraform Cloud.
Konfigurasi
Konfigurasi awal yang akan dilakukan dimulai dari sisi AWS. Hal ini berlaku jika sebelumnya kita belum pernah membuat IAM user yang digunakan untuk programmatic access. Karena agar Terraform Cloud dapat berinteraksi dengan AWS, diperlukan API keys. Berikut langkah-langkahnya:
-
Saya akan mulai dengan menggunakan pendekatan atau perspektif IAM group. Jadi user akan dimasukan ke dalam IAM group agar lebih mudah diatur atau di-manage. Masuk ke halaman service IAM, pilih menu User groups, kemudian klik Create group.
-
Masukkan nama group yang diingikan, pada contoh di artikel ini saya namakan demo-terraform.
-
Beri hak akses atau attach permission ke IAM group tersebut, pada contoh di artikel ini akan saya berikan full access ke S3. Hal ini hanya untuk keperluan demo, sebaiknya pada production gunakana metode least privileged atau beri akses seminimal mungkin sesuai dengan yang dibutuhkan.
-
Pastikan IAM group berhasil terbentuk.
-
Selanjutnya membuat IAM user. Masuk ke menu Users, kemudian klik Add Users.
-
Beri nama IAM user, pada contoh disini saya namakan demo-terraform. Untuk access type cukup berikan Access key – Programmatic access, karena user ini tidak perlu akses ke Web Console. Kemudian klik Next
-
Masukkan user ke dalam IAM group. Pada contoh di artikel ini, saya masukkan ke IAM group yang baru dibuat yaitu demo-terraform. Kemudian klik Next
-
Saya berikan tag dengan key Name dan value-nya demo-terraform. Kemudian klik Next.
-
Review konfigurasi IAM user, jika sudah sesuai klik Create user.
-
Selanjutnya AWS Web Console akan menampilkan halaman bahwa IAM user sukses terbentuk. Simpan atau download AWS Credentials Key tersebut. Karena setelah halaman ini ditutup, kita tidak dapat melihat value nya kembali. Access Key dan Secret Key ini yang nanti diperlukan agar API interaction antara AWS dan Terraform Cloud dapat berjalan.
-
Pastikan IAM user sudah berhasil terbentuk.
-
Langkah berikutnya mulai melakukan konfigurasi di sisi Terraform Cloud. Jika belum memiliki account, silahkan daftar/sign up dan mulai membuat organization atau join organization yang sudah ada. Pada langkah ini, saya akan membuat Workspace dengan metode Version control workflow. Workspace digunakan untuk memisahkan satu lingkup resource dengan resource lainya dan metode version control workflow merupakan workflow yang paling umum dengan mengintegrasikan Terraform Cloud Workspace dengan version control system seperti GitHub, GitLab, Bitbucket atau Azure DevOps.
-
Selanjutnya saya akan mengintegrasikan dengan VCS yang saya gunakan yaitu GitLab.
-
Kemudian pilih repository. Pada artikel ini saya sudah membuat sebuah repository untuk keperluan demo dengan nama demo-terraform.
-
Selanjutnya konfigurasi workspace tersebut. Saya mulai dengan memberi nama yaitu demo-terraform-s3.
-
Pada artikel ini repository demo-terraform memiliki struktur sebagai berikut:
demo-terraform/
├─ s3/
│ ├─ main.tf
│ ├─ variables.tf
│ ├─ s3.tf
├─ .gitignore
├─ README.md
Di Terraform Cloud, kita juga dapat menyesuaikan working directory setiap workspace. Pada contoh ini saya atur/set working directory nya di directory S3 dan branch main. Sehingga jika ada perubahan hanya bereaksi ketika ada perubahan di directory dan branch tersebut dan workspace atau directory lain tidak mengalamin dampaknya.
-
Selanjutnya workspace akan terbentuk dengan versi Terraform latest/yang paling ter-update. Pastikan sudah berhasil dan selanjutnya adalah konfigurasi variable yang digunakan oleh workspace. Masuk ke menu Variables.
-
Variable yang digunakan oleh Terraform Cloud workspace ada dua macam. Namun saya lebih senang menggunakan pendekatan environment variable. Yang pertama saya masukkan env_var AWS_ACCESS_KEY_ID. Kemudian yang kedua saya masukkan AWS_SECRET_ACCES_KEY, untuk secret key dapat dibuat menjadi sensitive sehingga membantu menyembunyikan exposure dari variable.
-
Selanjutnya saya akan membahas sekilas tentang source code yang digunakan dalam demo ini. File pertama yang dibahas adalah main.tf. Di file ini saya mendaklarasikan terraform configuration menggunakan backend remote ke Terraform Cloud (app.terraform.io). Saya juga deklarasikan nama organization (lanandra) dan nama workspace (demo-terraform-s3) mengikuti yang digunakan di Terraform Cloud. Saya juga deklarasikan versi provider hashicorp/aws yang digunakan dan versi Terraform yang digunakan di Terraform Cloud. Di akhir saya deklarikasn region yang digunakan akan mengacu ke variable aws_region, yang saya deklarasikan di file variables.tf dan akan saya jabarkan di poin berikutnya.
# Setup terraform cloud and workspace
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "lanandra"
workspaces {
name = "demo-terraform-s3"
}
}
}
# Setup terraform providers
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.72.0"
}
}
required_version = ">= 1.1.3"
}
# Setup AWS provider
provider "aws" {
region = var.aws_region
}
-
Berikutnya saya akan membahas file variables.tf, di file ini saya deklarasikan variable aws_region dengan default value ap-southeast-1.
# Setup AWS Region
variable "aws_region" {
type = string
description = "AWS Region"
default = "ap-southeast-1"
}
-
Berikutnya file s3.tf. Di file ini saya deklarasikan pembuatan resource S3 bucket dengan nama lanandra-demo-terraform-s3
resource "aws_s3_bucket" "lanandra_demo_terraform_s3" {
bucket = "lanandra-demo-terraform-s3"
tags = {
Name = "lanandra-demo-terraform-s3"
}
}
-
Kembali ke Terraform Cloud Workspace. Setelah konfigurasi awal workspace tadi sudah selesai, kita dapat mencoba menjalankan terraform plan. Klik menu Actions dan Start New Plan. Kemudian masukkan reason running plan.
-
Terraform Cloud akan membaca file dari source code yang ada di version control system. Plan akan membaca resource apa yang akan dibuat, karena di repository demo-terraform di-deklarasikan provision S3 bucket, maka terraform plan akan menampilkan rencana provision tersebut.
-
Jika sudah sesuai, klik Confirm Plan.
-
Terraform Cloud akan mulai menjalankan terraform apply. Tunggu hingga apply finished dan berhasil membuat resource.
-
Selanjutnya kita dapat memastikan via AWS Web Console, bahwa S3 bucket sudah berhasil terbentuk.
-
Di Terraform Cloud workspace, kita juga dapat memastikan bahwa workspace sudah menyimpan state untuk resource S3 bucket.
-
Selanjutnya saya akan mensimulasikan apa yang terjadi jika ada perubahan pada source code terraform kita. Di file s3.tf, saya tambahkan konfigurasi untuk menambahkan block public access s3.
resource "aws_s3_bucket_public_access_block" "lanandra_demo_terraform_s3" {
bucket = aws_s3_bucket.lanandra_demo_terraform_s3.id
block_public_acls = true
block_public_policy = true
}
-
Perubahan code di poin sebelumnya selanjutnya di-commit dan push ke version control system. Karena terraform cloud workspace sudah terintegrasi dengan VCS, maka secara otomatis akan menjalankan terraform plan berdasarkan perubahan tersebut.
-
Kita dapat memastikan perubahan yang ada di terraform plan apakah sesuai dengan yang dirubah di source codes. Jika terraform plan sudah sesuai, jalankan terraform apply.
-
Kita juga dapat memastikan perubahan yang dilakukan apakah sudah sesuai melalui AWS Web Console.
Kesimpulan
Akhirnya kita sampai di penghujung artikel ini. Pada artikel ini kita sudah membahas dasar-dasar konfigurasi yang diperlukan untuk membuat/provision AWS resources via Terraform Cloud.
Sekian artikel kali ini. Jika ada saran, kritik, atau masukan silahkan tinggalkan di kolom komentar.
Terima kasih.