Wednesday

18-06-2025 Vol 19

AWS EC2 Image Builder by example with Terraform

Membuat Image AMI Kustom dengan AWS EC2 Image Builder dan Terraform: Panduan Lengkap

Dalam dunia cloud computing yang serba cepat, memiliki image mesin (AMI) yang disesuaikan dan teroptimasi adalah kunci untuk penyebaran aplikasi yang efisien dan konsisten. AWS EC2 Image Builder menyediakan platform yang kuat untuk mengotomatiskan proses pembuatan dan pemeliharaan image. Dengan menggabungkannya dengan Terraform, Anda dapat mengelola infrastruktur image-building Anda sebagai kode, memastikan reproduktifitas dan kemudahan pengelolaan.

Mengapa AWS EC2 Image Builder dengan Terraform?

  • Otomatisasi: Otomatiskan seluruh proses pembuatan image, dari patch sistem operasi hingga instalasi aplikasi.
  • Keamanan: Terapkan hardening standar dan kepatuhan keamanan secara otomatis.
  • Konsistensi: Pastikan image seragam di seluruh lingkungan Anda.
  • Versioning: Kelola dan lacak perubahan image dengan mudah.
  • Infrastructure as Code (IaC): Definisikan dan kelola infrastruktur image-building dengan Terraform, memungkinkan reproduktifitas dan kolaborasi yang lebih baik.

Prasyarat

Sebelum kita mulai, pastikan Anda memiliki hal berikut:

  1. Akun AWS: Akun AWS aktif dengan izin yang sesuai untuk membuat dan mengelola sumber daya EC2 Image Builder dan IAM.
  2. Terraform: Terraform diinstal dan dikonfigurasi di mesin lokal Anda.
  3. AWS CLI: AWS Command Line Interface (CLI) diinstal dan dikonfigurasi dengan kredensial yang valid.
  4. Pemahaman Dasar AWS dan Terraform: Pemahaman dasar tentang konsep AWS seperti AMI, EC2, IAM, dan cara Terraform bekerja.

Langkah-Langkah Implementasi

Berikut adalah langkah-langkah untuk membuat image AMI kustom menggunakan AWS EC2 Image Builder dan Terraform:

1. Persiapan: Konfigurasi IAM Role

EC2 Image Builder memerlukan IAM role dengan izin untuk mengakses sumber daya AWS yang diperlukan. Kita akan membuat dua role: satu untuk instance builder (imagebuilder-instance-role) dan satu lagi untuk Image Builder (imagebuilder-service-role).

a. IAM Role untuk Instance Builder (imagebuilder-instance-role)

IAM Role ini akan digunakan oleh instance EC2 yang menjalankan proses pembuatan image. Ini harus memiliki izin untuk membaca image sumber, menjalankan skrip, dan menulis log ke CloudWatch.

Berikut adalah contoh konfigurasi Terraform:

“`terraform
resource “aws_iam_role” “imagebuilder_instance_role” {
name = “imagebuilder-instance-role”
assume_role_policy = jsonencode({
Version = “2012-10-17”
Statement = [
{
Action = “sts:AssumeRole”,
Principal = {
Service = “ec2.amazonaws.com”
},
Effect = “Allow”,
Sid = “”
}
]
})
}

resource “aws_iam_policy” “imagebuilder_instance_policy” {
name = “imagebuilder-instance-policy”
description = “Policy for EC2 Image Builder instance role”
policy = jsonencode({
Version = “2012-10-17”
Statement = [
{
Action = [
“ec2:Describe*”,
“ec2:Get*”,
“ec2:RunInstances”,
“ec2:CreateTags”,
“ssm:*”
],
Effect = “Allow”,
Resource = “*”
},
{
Action = [
“s3:GetObject”,
“s3:GetBucketLocation”,
“s3:ListBucket”
],
Effect = “Allow”,
Resource = [
“arn:aws:s3:::your-bucket-name”, # Ganti dengan nama bucket S3 Anda
“arn:aws:s3:::your-bucket-name/*” # Ganti dengan nama bucket S3 Anda
]
},
{
Action = [
“logs:CreateLogGroup”,
“logs:CreateLogStream”,
“logs:PutLogEvents”
],
Effect = “Allow”,
Resource = “arn:aws:logs:*:*:*”
}
]
})
}

resource “aws_iam_role_policy_attachment” “imagebuilder_instance_role_policy_attachment” {
role = aws_iam_role.imagebuilder_instance_role.name
policy_arn = aws_iam_policy.imagebuilder_instance_policy.arn
}
“`

Penjelasan:

  • aws_iam_role: Mendefinisikan IAM Role dengan nama “imagebuilder-instance-role”.
  • assume_role_policy: Kebijakan yang memungkinkan EC2 untuk mengambil peran ini.
  • aws_iam_policy: Mendefinisikan IAM Policy yang memberikan izin yang diperlukan.
    • ec2:*: Izin untuk berinteraksi dengan EC2.
    • s3:*: Izin untuk mengakses bucket S3 (ganti your-bucket-name dengan nama bucket Anda).
    • logs:*: Izin untuk menulis log ke CloudWatch.
    • ssm:*: Izin untuk menggunakan Systems Manager.
  • aws_iam_role_policy_attachment: Menghubungkan kebijakan ke role.

b. IAM Role untuk Image Builder (imagebuilder-service-role)

IAM Role ini digunakan oleh layanan EC2 Image Builder untuk membuat dan mengelola image. Ini harus memiliki izin untuk meluncurkan instance EC2, membuat snapshot, dan mengakses sumber daya lain yang diperlukan.

Berikut adalah contoh konfigurasi Terraform:

“`terraform
resource “aws_iam_role” “imagebuilder_service_role” {
name = “imagebuilder-service-role”
assume_role_policy = jsonencode({
Version = “2012-10-17”
Statement = [
{
Action = “sts:AssumeRole”,
Principal = {
Service = “imagebuilder.amazonaws.com”
},
Effect = “Allow”,
Sid = “”
}
]
})
}

resource “aws_iam_policy” “imagebuilder_service_policy” {
name = “imagebuilder-service-policy”
description = “Policy for EC2 Image Builder service role”
policy = jsonencode({
Version = “2012-10-17”
Statement = [
{
Action = [
“ec2:DescribeImages”,
“ec2:CreateSnapshot”,
“ec2:DeleteSnapshot”,
“ec2:ModifyImageAttribute”,
“ec2:CopyImage”,
“ec2:RegisterImage”,
“ec2:RunInstances”,
“ec2:TerminateInstances”,
“ec2:CreateTags”
],
Effect = “Allow”,
Resource = “*”
}
]
})
}

resource “aws_iam_role_policy_attachment” “imagebuilder_service_role_policy_attachment” {
role = aws_iam_role.imagebuilder_service_role.name
policy_arn = aws_iam_policy.imagebuilder_service_policy.arn
}
“`

Penjelasan:

  • aws_iam_role: Mendefinisikan IAM Role dengan nama “imagebuilder-service-role”.
  • assume_role_policy: Kebijakan yang memungkinkan layanan Image Builder untuk mengambil peran ini.
  • aws_iam_policy: Mendefinisikan IAM Policy yang memberikan izin yang diperlukan.
    • ec2:*: Izin untuk berinteraksi dengan EC2 (membuat snapshot, mendaftarkan image, dll.).
  • aws_iam_role_policy_attachment: Menghubungkan kebijakan ke role.

Penting: Sesuaikan kebijakan IAM sesuai dengan kebutuhan spesifik Anda. Pastikan untuk memberikan izin minimal yang diperlukan.

2. Membuat Image Recipe

Image Recipe menentukan konfigurasi image dasar, komponen yang akan diterapkan, dan pengaturan pengujian. Ini seperti resep untuk membuat AMI kustom Anda.

Berikut adalah contoh Image Recipe yang menggunakan AMI Amazon Linux 2 sebagai dasar, menginstal Apache web server, dan menjalankan pengujian dasar:

“`terraform
resource “aws_imagebuilder_image_recipe” “example” {
name = “example-image-recipe”
version = “1.0.0”
parent_image = “arn:aws:ec2:us-east-1::image/ami-0c55b65c5d006094d” # Ganti dengan AMI ID yang sesuai

block_device_mappings {
device_name = “/dev/xvda”
ebs {
delete_on_termination = true
volume_size = 30
volume_type = “gp2”
}
}

component {
component_arn = “arn:aws:imagebuilder:us-east-1:aws:component/install-apache/1.0.0” # Ganti dengan ARN komponen yang sesuai
}

component {
component_arn = “arn:aws:imagebuilder:us-east-1:aws:component/test-apache/1.0.0” # Ganti dengan ARN komponen yang sesuai
}

}
“`

Penjelasan:

  • aws_imagebuilder_image_recipe: Mendefinisikan Image Recipe.
  • name: Nama untuk Image Recipe.
  • version: Versi Image Recipe.
  • parent_image: AMI dasar yang akan digunakan (ganti dengan AMI ID yang sesuai dengan wilayah Anda).
  • block_device_mappings: Konfigurasi disk.
  • component: Daftar komponen yang akan diterapkan ke image.
    • component_arn: ARN dari komponen yang akan digunakan. Anda dapat menggunakan komponen yang disediakan oleh AWS atau membuat komponen kustom Anda sendiri. Contoh di atas menggunakan komponen yang disediakan AWS untuk menginstal dan menguji Apache.

3. Membuat Component (Opsional)

Komponen adalah kumpulan instruksi yang melakukan tugas-tugas tertentu pada image, seperti menginstal perangkat lunak, menjalankan konfigurasi, atau mengamankan sistem. Anda dapat menggunakan komponen yang disediakan oleh AWS atau membuat komponen kustom sendiri.

Berikut adalah contoh komponen yang menginstal Apache web server menggunakan bash script:

“`terraform
resource “aws_imagebuilder_component” “install_apache” {
name = “install-apache”
platform = “Linux”
version = “1.0.0”
data = <Penjelasan:

  • aws_imagebuilder_component: Mendefinisikan Component.
  • name: Nama untuk Component.
  • platform: Platform yang didukung oleh Component (Linux atau Windows).
  • version: Versi Component.
  • data: Definisi Component dalam format YAML.
    • name: Nama Component.
    • description: Deskripsi Component.
    • schemaVersion: Versi skema Component.
    • phases: Daftar fase yang akan dijalankan. Fase build biasanya digunakan untuk menginstal perangkat lunak dan mengkonfigurasi sistem.
    • steps: Daftar langkah yang akan dijalankan dalam setiap fase. Langkah ExecuteBash menjalankan perintah bash.
    • inputs: Input untuk setiap langkah. Dalam contoh ini, inputnya adalah daftar perintah bash yang akan dijalankan.

Anda dapat membuat komponen yang lebih kompleks untuk mengotomatiskan berbagai tugas konfigurasi dan instalasi.

4. Membuat Infrastructure Configuration

Infrastructure Configuration menentukan lingkungan di mana image akan dibuat, termasuk jenis instance, subnet, dan keamanan. Ini menentukan bagaimana Image Builder akan meluncurkan instance EC2 untuk membuat image.

Berikut adalah contoh Infrastructure Configuration:

“`terraform
resource “aws_imagebuilder_infrastructure_configuration” “example” {
name = “example-infrastructure-configuration”
instance_types = [“t3.medium”]
subnet_id = “subnet-0abcdef1234567890” # Ganti dengan Subnet ID Anda
security_group_ids = [“sg-0abcdef1234567890”] # Ganti dengan Security Group ID Anda
instance_profile_name = aws_iam_role.imagebuilder_instance_role.name
terminate_instance_on_failure = true

logging {
s3_logs {
s3_bucket_name = “your-bucket-name” # Ganti dengan nama bucket S3 Anda
s3_key_prefix = “imagebuilder-logs”
}
}
}
“`

Penjelasan:

  • aws_imagebuilder_infrastructure_configuration: Mendefinisikan Infrastructure Configuration.
  • name: Nama untuk Infrastructure Configuration.
  • instance_types: Jenis instance EC2 yang akan digunakan.
  • subnet_id: Subnet ID di mana instance EC2 akan diluncurkan (ganti dengan Subnet ID Anda).
  • security_group_ids: Security Group IDs yang akan diterapkan ke instance EC2 (ganti dengan Security Group ID Anda).
  • instance_profile_name: Nama Instance Profile (IAM Role untuk instance builder).
  • terminate_instance_on_failure: Apakah instance EC2 harus dihentikan jika proses pembuatan image gagal.
  • logging: Konfigurasi logging.
    • s3_logs: Konfigurasi logging ke S3.
      • s3_bucket_name: Nama bucket S3 untuk menyimpan log (ganti dengan nama bucket S3 Anda).
      • s3_key_prefix: Awalan kunci S3 untuk log.

5. Membuat Distribution Configuration

Distribution Configuration menentukan bagaimana image yang dibuat akan didistribusikan, termasuk wilayah, akun, dan pengaturan AMI. Ini menentukan ke mana Image Builder akan menyalin AMI yang telah dibuat.

Berikut adalah contoh Distribution Configuration:

“`terraform
resource “aws_imagebuilder_distribution_configuration” “example” {
name = “example-distribution-configuration”

distribution {
region = “us-east-1” # Ganti dengan wilayah Anda

ami_distribution_configuration {
name = “example-ami-{{imagebuilder:buildDate}}”
description = “AMI yang dibuat oleh Image Builder”
launch_permission {
user_ids = [“123456789012”] # Ganti dengan Account ID Anda (opsional)
}
tag_block = {
Name = “Example AMI”
}
}
}
}
“`

Penjelasan:

  • aws_imagebuilder_distribution_configuration: Mendefinisikan Distribution Configuration.
  • name: Nama untuk Distribution Configuration.
  • distribution: Daftar distribusi.
    • region: Wilayah tempat image akan didistribusikan (ganti dengan wilayah Anda).
    • ami_distribution_configuration: Konfigurasi distribusi AMI.
      • name: Nama untuk AMI yang didistribusikan. Anda dapat menggunakan variabel Image Builder seperti {{imagebuilder:buildDate}} untuk membuat nama yang unik.
      • description: Deskripsi untuk AMI.
      • launch_permission: Izin peluncuran untuk AMI. Anda dapat menentukan daftar User IDs yang diizinkan untuk meluncurkan instance dari AMI.
      • tag_block: Tag yang akan diterapkan ke AMI.

6. Membuat Image Pipeline

Image Pipeline mengikat semua sumber daya yang telah kita buat sebelumnya (Image Recipe, Infrastructure Configuration, dan Distribution Configuration) dan mengotomatiskan proses pembuatan image. Ini adalah jantung dari workflow Image Builder.

Berikut adalah contoh Image Pipeline:

“`terraform
resource “aws_imagebuilder_image_pipeline” “example” {
name = “example-image-pipeline”
image_recipe_arn = aws_imagebuilder_image_recipe.example.arn
infrastructure_configuration_arn = aws_imagebuilder_infrastructure_configuration.example.arn
distribution_configuration_arns = [aws_imagebuilder_distribution_configuration.example.arn]
image_tests_configuration {
image_tests_enabled = true
timeout_minutes = 60
}
status = “ENABLED”
}
“`

Penjelasan:

  • aws_imagebuilder_image_pipeline: Mendefinisikan Image Pipeline.
  • name: Nama untuk Image Pipeline.
  • image_recipe_arn: ARN dari Image Recipe yang akan digunakan.
  • infrastructure_configuration_arn: ARN dari Infrastructure Configuration yang akan digunakan.
  • distribution_configuration_arns: Daftar ARN dari Distribution Configurations yang akan digunakan.
  • image_tests_configuration: Konfigurasi pengujian image.
    • image_tests_enabled: Apakah pengujian image diaktifkan.
    • timeout_minutes: Waktu habis untuk pengujian image.
  • status: Status Image Pipeline (ENABLED atau DISABLED).

7. Menerapkan Konfigurasi Terraform

Setelah Anda mendefinisikan semua sumber daya yang diperlukan, Anda dapat menerapkan konfigurasi Terraform:

“`bash
terraform init
terraform plan
terraform apply
“`

Perintah ini akan membuat sumber daya AWS yang diperlukan dan memulai proses pembuatan image.

8. Memantau Proses Pembuatan Image

Anda dapat memantau proses pembuatan image di konsol AWS EC2 Image Builder. Konsol akan menampilkan status pipeline, log, dan informasi lainnya.

9. Menggunakan AMI yang Dibuat

Setelah proses pembuatan image selesai, Anda dapat menggunakan AMI yang dibuat untuk meluncurkan instance EC2. AMI akan memiliki semua konfigurasi dan perangkat lunak yang Anda tentukan dalam Image Recipe dan komponen.

Contoh Konfigurasi Lanjutan

Berikut adalah beberapa contoh konfigurasi lanjutan yang dapat Anda gunakan dengan AWS EC2 Image Builder dan Terraform:

  • Menggunakan Parameter: Anda dapat menggunakan parameter untuk membuat Image Recipe yang lebih fleksibel dan dapat digunakan kembali. Parameter memungkinkan Anda untuk menyesuaikan konfigurasi image pada runtime.
  • Menggunakan Skrip Kustom: Anda dapat menggunakan skrip kustom untuk melakukan tugas-tugas konfigurasi dan instalasi yang lebih kompleks.
  • Menggunakan Pengujian yang Lebih Canggih: Anda dapat menggunakan pengujian yang lebih canggih untuk memastikan bahwa image yang dibuat memenuhi persyaratan Anda.
  • Integrasi dengan CI/CD Pipeline: Anda dapat mengintegrasikan Image Builder dengan CI/CD pipeline Anda untuk mengotomatiskan proses pembuatan image.

Contoh 1: Menggunakan Parameter dalam Image Recipe

Anda dapat menggunakan parameter untuk membuat Image Recipe yang lebih fleksibel. Misalnya, Anda dapat menggunakan parameter untuk menentukan versi perangkat lunak yang akan diinstal.

“`terraform
resource “aws_imagebuilder_image_recipe” “example_with_parameter” {
name = “example-image-recipe-with-parameter”
version = “1.0.0”
parent_image = “arn:aws:ec2:us-east-1::image/ami-0c55b65c5d006094d” # Ganti dengan AMI ID yang sesuai

block_device_mappings {
device_name = “/dev/xvda”
ebs {
delete_on_termination = true
volume_size = 30
volume_type = “gp2”
}
}

component {
component_arn = “arn:aws:imagebuilder:us-east-1:aws:component/install-apache-with-version/1.0.0” # Ganti dengan ARN komponen yang sesuai
parameter {
name = “apache_version”
value = [“2.4”] # Parameter akan diisi saat pipeline dijalankan
}
}

}
“`

Dalam contoh di atas, kita menambahkan parameter bernama apache_version ke komponen install-apache-with-version. Komponen ini akan menggunakan parameter ini untuk menentukan versi Apache yang akan diinstal.

Contoh 2: Komponen dengan Parameter

Komponen install-apache-with-version dapat didefinisikan sebagai berikut:

“`terraform
resource “aws_imagebuilder_component” “install_apache_with_version” {
name = “install-apache-with-version”
platform = “Linux”
version = “1.0.0”
data = <Dalam contoh di atas, kita menambahkan bagian parameters ke definisi komponen. Bagian ini mendefinisikan parameter apache_version dengan tipe string dan nilai default “latest”. Kita kemudian menggunakan parameter ini dalam perintah yum install.

Praktik Terbaik

  • Gunakan Infrastructure as Code (IaC): Kelola semua sumber daya Image Builder dengan Terraform untuk memastikan reproduktifitas dan kemudahan pengelolaan.
  • Versioning: Gunakan versioning untuk Image Recipe dan komponen untuk melacak perubahan.
  • Keamanan: Terapkan hardening standar dan kepatuhan keamanan secara otomatis.
  • Pengujian: Gunakan pengujian untuk memastikan bahwa image yang dibuat berfungsi dengan benar.
  • Minimal Privilege: Berikan izin minimal yang diperlukan ke IAM role.
  • Monitoring: Pantau proses pembuatan image untuk mendeteksi masalah sedini mungkin.

Tips Pemecahan Masalah

  • Periksa Log: Periksa log di CloudWatch Logs dan S3 untuk mengidentifikasi masalah.
  • Verifikasi Izin: Pastikan IAM role memiliki izin yang diperlukan.
  • Periksa Konfigurasi: Pastikan konfigurasi Image Recipe, Infrastructure Configuration, dan Distribution Configuration benar.
  • Uji Komponen Secara Terpisah: Uji komponen secara terpisah untuk memastikan bahwa mereka berfungsi dengan benar.

Kesimpulan

AWS EC2 Image Builder adalah alat yang ampuh untuk mengotomatiskan proses pembuatan dan pemeliharaan image AMI. Dengan menggabungkannya dengan Terraform, Anda dapat mengelola infrastruktur image-building Anda sebagai kode, memastikan reproduktifitas, kemudahan pengelolaan, dan konsistensi. Panduan ini memberikan contoh langkah demi langkah untuk membantu Anda memulai. Dengan mengikuti praktik terbaik dan tips pemecahan masalah yang disarankan, Anda dapat memanfaatkan kekuatan EC2 Image Builder dan Terraform untuk membuat dan mengelola image AMI kustom yang teroptimasi untuk kebutuhan Anda.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *