Provisioning Instance AWS EC2 dengan Terraform: Panduan Lengkap
AWS EC2 (Elastic Compute Cloud) adalah tulang punggung infrastruktur cloud banyak perusahaan, menyediakan mesin virtual sesuai permintaan untuk berbagai beban kerja. Terraform, alat Infrastruktur sebagai Kode (IaC) populer, memungkinkan Anda untuk mendefinisikan dan mem-provision infrastruktur AWS Anda secara deklaratif dan berulang. Dalam panduan komprehensif ini, kita akan menjelajahi cara mem-provision instance AWS EC2 dengan Terraform, mulai dari konsep dasar hingga praktik terbaik lanjutan. Kita akan membahas setiap langkah dengan detail, menyediakan contoh kode yang jelas, dan membahas pertimbangan penting untuk penyebaran yang sukses.
Daftar Isi
- Pengantar Terraform dan AWS EC2
- Prasyarat
- Menyiapkan Konfigurasi Terraform
- Mendefinisikan Sumber Daya AWS EC2
- Mengonfigurasi Network
- Menambahkan Data Pengguna (User Data)
- Menggunakan Tag
- Mengelola Kunci SSH
- Membuat dan Menerapkan Infrastruktur
- Memverifikasi Instance EC2
- Praktik Terbaik Terraform untuk AWS EC2
- Contoh Konfigurasi Lanjutan
- Memecahkan Masalah Umum
- Membersihkan Sumber Daya
- Kesimpulan
1. Pengantar Terraform dan AWS EC2
AWS EC2: AWS EC2 adalah layanan komputasi awan yang menyediakan kapasitas komputasi yang dapat diubah ukurannya di cloud Amazon. Ini memungkinkan Anda meluncurkan instans virtual dengan berbagai sistem operasi, perangkat lunak, dan opsi jaringan.
Terraform: Terraform adalah alat Infrastruktur sebagai Kode (IaC) yang memungkinkan Anda mendefinisikan dan menyediakan infrastruktur cloud menggunakan bahasa konfigurasi deklaratif. Dengan Terraform, Anda dapat mengelola infrastruktur Anda sebagai kode, melacak perubahan, dan mengotomatiskan penyebaran.
Manfaat Menggunakan Terraform dengan AWS EC2:
- Infrastruktur sebagai Kode (IaC): Mengelola infrastruktur Anda sebagai kode meningkatkan versi, kolaborasi, dan pengulangan.
- Otomatisasi: Mengotomatiskan penyebaran instance EC2 mengurangi kesalahan manusia dan meningkatkan efisiensi.
- Infrastruktur yang Dapat Diubah: Terraform memungkinkan Anda membuat dan menghancurkan infrastruktur dengan mudah, memastikan lingkungan yang bersih dan konsisten.
- Multi-Penyedia: Terraform mendukung beberapa penyedia cloud, memungkinkan Anda mengelola infrastruktur di berbagai platform.
- Manajemen Keadaan: Terraform melacak keadaan infrastruktur Anda, memastikan bahwa perubahan diterapkan dengan benar.
2. Prasyarat
Sebelum kita mulai, pastikan Anda memiliki prasyarat berikut:
- Akun AWS: Anda membutuhkan akun AWS aktif.
- AWS CLI: Instal dan konfigurasi AWS CLI dengan kredensial Anda. Anda dapat mengunduh dan menginstal AWS CLI dari situs web AWS. Setelah terinstal, konfigurasikan dengan `aws configure` dan masukkan ID kunci akses AWS, kunci rahasia akses, wilayah AWS, dan format output (biasanya ‘json’).
- Terraform: Instal Terraform di sistem Anda. Anda dapat mengunduh Terraform dari situs web Terraform. Pastikan direktori yang berisi executable Terraform ada di PATH sistem Anda.
- Editor Kode: Editor kode pilihan Anda (misalnya, VS Code, Sublime Text).
3. Menyiapkan Konfigurasi Terraform
Pertama, buat direktori untuk file konfigurasi Terraform Anda. Di direktori ini, buat file bernama `main.tf` dan `variables.tf`.
`main.tf`
File `main.tf` berisi definisi sumber daya utama untuk infrastruktur Anda.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
required_version = ">= 0.14.0"
}
provider "aws" {
region = var.aws_region
}
Kode di atas mendefinisikan blok `terraform` yang diperlukan untuk mengonfigurasi penyedia AWS. Ini juga mendefinisikan blok `provider` untuk mengonfigurasi penyedia AWS dengan wilayah yang ditentukan oleh variabel `aws_region`.
`variables.tf`
File `variables.tf` berisi definisi variabel untuk konfigurasi Anda.
variable "aws_region" {
type = string
default = "us-east-1"
description = "The AWS region to deploy resources to."
}
variable "instance_type" {
type = string
default = "t2.micro"
description = "The EC2 instance type."
}
variable "ami_id" {
type = string
default = "ami-0c55b4719dadf7510" # Amazon Linux 2 AMI
description = "The AMI ID for the EC2 instance."
}
variable "key_name" {
type = string
default = "your-key-pair-name"
description = "The name of the SSH key pair to use for the instance."
}
Dalam file `variables.tf`, kita mendefinisikan variabel untuk wilayah AWS, jenis instans, ID AMI, dan nama key pair SSH. Pastikan untuk mengganti `your-key-pair-name` dengan nama key pair SSH Anda yang valid di AWS.
4. Mendefinisikan Sumber Daya AWS EC2
Sekarang, mari kita definisikan sumber daya AWS EC2 di file `main.tf`.
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
tags = {
Name = "Terraform-EC2-Instance"
}
}
Kode ini mendefinisikan sumber daya `aws_instance` bernama “example”. Ini mengonfigurasi instance EC2 dengan ID AMI, jenis instans, nama key pair, dan tag yang ditentukan.
5. Mengonfigurasi Network
Untuk memastikan bahwa instans EC2 Anda dapat diakses dari internet, Anda perlu mengonfigurasi network Anda dengan benar. Ini melibatkan pembuatan VPC, subnet, dan grup keamanan.
VPC (Virtual Private Cloud)
VPC adalah network yang terisolasi secara logis di cloud AWS tempat Anda dapat meluncurkan sumber daya AWS.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "Terraform-VPC"
}
}
Kode di atas mendefinisikan sumber daya `aws_vpc` bernama “main” dengan blok CIDR 10.0.0.0/16.
Subnet
Subnet adalah subdivisi dari VPC Anda. Anda dapat meluncurkan sumber daya AWS ke subnet tertentu.
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "${var.aws_region}a"
tags = {
Name = "Terraform-Public-Subnet"
}
}
Kode di atas mendefinisikan sumber daya `aws_subnet` bernama “public” di VPC yang baru dibuat dan menetapkannya blok CIDR 10.0.1.0/24. Ini juga menentukan availability zone.
Internet Gateway
Internet Gateway memungkinkan instans di subnet publik Anda berkomunikasi dengan internet.
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "Terraform-Internet-Gateway"
}
}
Kode di atas mendefinisikan sumber daya `aws_internet_gateway` bernama “gw” dan melampirkannya ke VPC yang baru dibuat.
Route Table
Route Table berisi sekumpulan aturan, yang disebut rute, yang menentukan ke mana lalu lintas network diarahkan.
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
Name = "Terraform-Public-Route-Table"
}
}
Kode di atas mendefinisikan sumber daya `aws_route_table` bernama “public” dan menambahkan rute ke internet melalui internet gateway.
Route Table Association
Route Table Association mengaitkan route table dengan subnet.
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
Kode di atas mengaitkan route table publik dengan subnet publik.
Security Group
Security Group bertindak sebagai firewall virtual untuk instans EC2 Anda, mengontrol lalu lintas masuk dan keluar.
resource "aws_security_group" "allow_ssh" {
name = "allow_ssh"
description = "Allow SSH traffic"
vpc_id = aws_vpc.main.id
ingress {
description = "SSH from everywhere"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "Allow SSH"
}
}
Kode di atas mendefinisikan sumber daya `aws_security_group` bernama “allow_ssh” yang memungkinkan lalu lintas SSH masuk dari mana saja dan semua lalu lintas keluar.
Penting: Membuka SSH untuk semua alamat IP (0.0.0.0/0) meningkatkan risiko keamanan. Dalam lingkungan produksi, batasi lalu lintas SSH masuk hanya untuk alamat IP atau rentang yang diperlukan.
Mengintegrasikan Security Group ke EC2 Instance
Tambahkan argumen `vpc_security_group_ids` ke definisi `aws_instance` Anda:
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.allow_ssh.id]
tags = {
Name = "Terraform-EC2-Instance"
}
}
6. Menambahkan Data Pengguna (User Data)
Data Pengguna memungkinkan Anda untuk menjalankan skrip ketika instans EC2 diluncurkan. Ini dapat digunakan untuk mengotomatiskan tugas konfigurasi.
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.allow_ssh.id]
user_data = <<-EOF
#!/bin/bash
echo "Hello, Terraform!" > /tmp/hello.txt
EOF
tags = {
Name = "Terraform-EC2-Instance"
}
}
Dalam contoh ini, kita menggunakan data pengguna untuk menulis “Hello, Terraform!” ke file `/tmp/hello.txt`.
Penting: Data pengguna dijalankan dengan hak akses root, jadi berhati-hatilah saat menjalankan skrip dengan data pengguna. Simpan skrip data pengguna sesingkat dan seaman mungkin.
7. Menggunakan Tag
Tag memungkinkan Anda memberi metadata ke sumber daya AWS Anda. Ini dapat digunakan untuk organisasi, akuntansi, dan manajemen sumber daya.
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.allow_ssh.id]
tags = {
Name = "Terraform-EC2-Instance"
Environment = "Development"
Project = "MyProject"
}
}
Dalam contoh ini, kita menambahkan tag `Name`, `Environment`, dan `Project` ke instans EC2.
8. Mengelola Kunci SSH
Kunci SSH digunakan untuk terhubung ke instans EC2 Anda dengan aman. Anda harus membuat key pair di AWS dan menentukan nama key pair di konfigurasi Terraform Anda.
Membuat Key Pair
Anda dapat membuat key pair menggunakan AWS Management Console, AWS CLI, atau Terraform.
Menggunakan AWS CLI:
aws ec2 create-key-pair --key-name your-key-pair-name --query 'KeyMaterial' --output text > your-key-pair-name.pem
chmod 400 your-key-pair-name.pem
Ganti `your-key-pair-name` dengan nama yang Anda inginkan untuk key pair Anda. Perintah ini membuat key pair dan menyimpan kunci privat ke file `your-key-pair-name.pem`. Simpan file `.pem` di lokasi yang aman.
Menggunakan Terraform:
resource "tls_private_key" "example" {
algorithm = "RSA"
rsa_bits = 4096
}
resource "aws_key_pair" "example" {
key_name = "your-key-pair-name"
public_key = tls_private_key.example.public_key_openssh
}
resource "local_file" "private_key" {
content = tls_private_key.example.private_key_pem
filename = "your-key-pair-name.pem"
}
Konfigurasi ini membuat key pair SSH dan menyimpan kunci privat ke file lokal. Sekali lagi, pastikan untuk menyimpan file `.pem` di lokasi yang aman dan memberikan izin yang sesuai (misalnya, `chmod 400 your-key-pair-name.pem`). Ganti `your-key-pair-name` dengan nama yang Anda inginkan.
Menentukan Nama Key Pair di Terraform
Pastikan untuk menentukan nama key pair yang benar di file `variables.tf` Anda:
variable "key_name" {
type = string
default = "your-key-pair-name"
description = "The name of the SSH key pair to use for the instance."
}
Ganti `your-key-pair-name` dengan nama key pair yang Anda buat.
9. Membuat dan Menerapkan Infrastruktur
Setelah Anda mendefinisikan konfigurasi Terraform Anda, Anda dapat membuat dan menerapkan infrastruktur menggunakan perintah berikut:
- Inisialisasi Terraform:
- Format Konfigurasi Terraform:
- Validasi Konfigurasi Terraform:
- Tinjau Rencana Terraform:
- Terapkan Konfigurasi Terraform:
terraform init
Perintah ini mengunduh plugin penyedia yang diperlukan dan menginisialisasi direktori kerja Terraform Anda.
terraform fmt
Perintah ini memformat file konfigurasi Terraform Anda agar sesuai dengan standar gaya yang konsisten.
terraform validate
Perintah ini memvalidasi file konfigurasi Terraform Anda untuk kesalahan sintaks dan kesalahan konfigurasi.
terraform plan
Perintah ini membuat rencana eksekusi yang menunjukkan perubahan yang akan dilakukan oleh Terraform pada infrastruktur Anda.
terraform apply
Perintah ini menerapkan perubahan yang ditentukan dalam rencana eksekusi dan mem-provision infrastruktur Anda.
Anda akan diminta untuk mengonfirmasi aplikasi. Ketik `yes` dan tekan Enter untuk melanjutkan.
10. Memverifikasi Instance EC2
Setelah Terraform selesai menerapkan konfigurasi Anda, Anda dapat memverifikasi bahwa instance EC2 telah dibuat dengan benar.
- AWS Management Console: Buka AWS Management Console dan navigasikan ke layanan EC2. Anda akan melihat instance EC2 yang baru dibuat terdaftar.
- AWS CLI: Gunakan perintah berikut untuk menggambarkan instance EC2:
aws ec2 describe-instances --filters "Name=tag:Name,Values=Terraform-EC2-Instance"
Perintah ini akan menampilkan detail instans EC2 yang baru dibuat.
Menghubungkan ke Instance EC2
Untuk terhubung ke instance EC2 Anda menggunakan SSH, Anda perlu mendapatkan alamat IP publik instance dan menggunakan kunci privat Anda.
- Dapatkan Alamat IP Publik: Temukan alamat IP publik instans EC2 Anda di AWS Management Console atau menggunakan AWS CLI.
- Hubungkan Menggunakan SSH: Gunakan perintah berikut untuk terhubung ke instance EC2 Anda:
ssh -i "your-key-pair-name.pem" ec2-user@your-instance-public-ip
Ganti `your-key-pair-name.pem` dengan jalur ke kunci privat Anda dan `your-instance-public-ip` dengan alamat IP publik instans Anda. Jika Anda menggunakan AMI selain Amazon Linux, nama pengguna mungkin berbeda (misalnya, `ubuntu` untuk AMI Ubuntu).
11. Praktik Terbaik Terraform untuk AWS EC2
Berikut adalah beberapa praktik terbaik untuk menggunakan Terraform dengan AWS EC2:
- Gunakan Modul: Modul memungkinkan Anda untuk mengelompokkan dan menggunakan kembali konfigurasi Terraform Anda. Ini meningkatkan keterbacaan kode dan pengulangan.
- Gunakan Variabel: Variabel memungkinkan Anda untuk menyesuaikan konfigurasi Terraform Anda tanpa mengubah kode.
- Gunakan Output: Output memungkinkan Anda untuk mengekspos nilai dari konfigurasi Terraform Anda. Ini dapat digunakan untuk mendapatkan alamat IP publik instans EC2 Anda atau informasi penting lainnya.
- Gunakan State Backend: Secara default, Terraform menyimpan keadaannya secara lokal. Untuk kolaborasi dan stabilitas, gunakan backend state jarak jauh seperti AWS S3 atau Terraform Cloud.
- Gunakan Versi Kontrol: Simpan file konfigurasi Terraform Anda di sistem versi kontrol seperti Git. Ini memungkinkan Anda melacak perubahan, berkolaborasi dengan orang lain, dan kembali ke versi sebelumnya jika perlu.
- Uji Konfigurasi Terraform Anda: Sebelum menerapkan konfigurasi Terraform Anda ke lingkungan produksi, uji di lingkungan pengembangan atau pementasan.
12. Contoh Konfigurasi Lanjutan
Menambahkan EBS Volume
EBS (Elastic Block Storage) volume menyediakan penyimpanan blok yang persisten untuk instans EC2 Anda.
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.allow_ssh.id]
root_block_device {
volume_size = 10
volume_type = "gp2"
}
tags = {
Name = "Terraform-EC2-Instance"
}
}
Kode di atas mengonfigurasi volume root dengan ukuran 10 GB dan tipe `gp2` (General Purpose SSD).
Anda juga dapat melampirkan volume EBS tambahan ke instans EC2 Anda:
resource "aws_ebs_volume" "example" {
availability_zone = "${var.aws_region}a"
size = 20
type = "gp2"
tags = {
Name = "Terraform-EBS-Volume"
}
}
resource "aws_volume_attachment" "example" {
device_name = "/dev/sdh"
volume_id = aws_ebs_volume.example.id
instance_id = aws_instance.example.id
}
Kode di atas membuat volume EBS 20 GB dan melampirkannya ke instans EC2 pada `/dev/sdh`.
Elastic IP
Elastic IP adalah alamat IP statis yang dapat Anda kaitkan dengan instans EC2 Anda. Ini berguna jika Anda membutuhkan alamat IP publik statis untuk instans Anda.
resource "aws_eip" "example" {
domain = "vpc"
depends_on = [aws_internet_gateway.gw]
vpc = true
}
resource "aws_eip_association" "example" {
instance_id = aws_instance.example.id
allocation_id = aws_eip.example.id
}
Kode di atas membuat Elastic IP dan mengaitkannya dengan instans EC2.
Auto Scaling Group (ASG)
Auto Scaling Groups (ASG) memungkinkan Anda untuk secara otomatis menskalakan jumlah instans EC2 berdasarkan permintaan. Ini memastikan bahwa aplikasi Anda selalu memiliki kapasitas yang cukup untuk menangani lalu lintas.
Sebelum membuat ASG, Anda memerlukan Launch Template atau Launch Configuration. Launch Template lebih disukai karena menyediakan fitur yang lebih baru.
resource "aws_launch_template" "example" {
name_prefix = "terraform-asg-"
image_id = var.ami_id
instance_type = var.instance_type
key_name = var.key_name
network_interface {
subnet_id = aws_subnet.public.id
security_groups = [aws_security_group.allow_ssh.id]
}
tag_specifications {
resource_type = "instance"
tags = {
Name = "Terraform-ASG-Instance"
}
}
user_data = base64encode(<<-EOF
#!/bin/bash
echo "Hello, Auto Scaling Group!" > /tmp/hello.txt
EOF
)
}
resource "aws_autoscaling_group" "example" {
desired_capacity = 2
max_size = 5
min_size = 1
vpc_zone_identifier = [aws_subnet.public.id]
launch_template {
id = aws_launch_template.example.id
version = "$Latest"
}
tag {
key = "Name"
value = "Terraform-ASG"
propagate_at_launch = true
}
}
Kode di atas membuat Launch Template dan Auto Scaling Group dengan kapasitas yang diinginkan 2, ukuran maksimum 5, dan ukuran minimum 1. Ini menggunakan subnet publik yang kita buat sebelumnya.
13. Memecahkan Masalah Umum
Berikut adalah beberapa masalah umum yang mungkin Anda temui saat mem-provision instance AWS EC2 dengan Terraform dan cara mengatasinya:
- Kesalahan Kredensial: Pastikan bahwa AWS CLI dikonfigurasi dengan benar dengan kredensial yang benar.
- Kesalahan Izin: Pastikan bahwa akun IAM Anda memiliki izin yang diperlukan untuk membuat dan mengelola sumber daya AWS.
- Kesalahan Kuota: Pastikan bahwa Anda tidak melebihi kuota AWS Anda. Anda dapat meminta kuota yang lebih tinggi dari AWS Support.
- Kesalahan Network: Pastikan bahwa konfigurasi network Anda sudah benar. Periksa VPC, subnet, route table, dan security group Anda.
- Kesalahan Data Pengguna: Jika data pengguna Anda gagal dieksekusi, periksa log instans EC2 untuk kesalahan.
- Kesalahan Nama Key Pair: Pastikan nama key pair yang Anda tentukan dalam konfigurasi Terraform Anda cocok dengan nama key pair yang Anda buat di AWS.
14. Membersihkan Sumber Daya
Setelah Anda selesai dengan infrastruktur Anda, penting untuk membersihkan sumber daya untuk menghindari biaya yang tidak perlu. Untuk menghancurkan semua sumber daya yang dibuat oleh Terraform, gunakan perintah berikut:
terraform destroy
Anda akan diminta untuk mengonfirmasi penghancuran. Ketik `yes` dan tekan Enter untuk melanjutkan.
15. Kesimpulan
Dalam panduan komprehensif ini, kita telah menjelajahi cara mem-provision instance AWS EC2 dengan Terraform. Kita telah membahas konsep dasar, praktik terbaik lanjutan, dan contoh konfigurasi lanjutan. Dengan mengikuti langkah-langkah ini, Anda dapat mengotomatiskan penyebaran instans EC2 Anda dan mengelola infrastruktur Anda sebagai kode. Ingatlah untuk selalu menerapkan praktik terbaik keamanan dan membersihkan sumber daya Anda saat Anda selesai menggunakannya.
Semoga panduan ini membantu Anda memulai Terraform dan AWS EC2! Selamat membuat kode!
“`