tl;dr Membuat ECR lifecycle policy untuk menghapus untagged container image di Amazon ECR menggunakan Terraform.
Jika pada blogpost sebelumnya, Build dan Release Container Image dari GitLab CI/CD Pipeline ke Amazon Elastic Container Registry (ECR), saya mendiskusikan cara build dan push container image dari GitLab CI/CD pipeline ke Amazon ECR. Pada blogpost kali ini saya akan mendiskusikan kembali hal atau konfigurasi yang terkait dengan ECR.
Umumnya jika kita melakukan build dan push image dari repository ke container registry, dalam hal ini contohnya ECR. Akan dijumpai kondisi dimana kemungkinan muncul untagged container image. Untagged container image biasanya terbentuk karena ada proses build dan push image dengan tag yang sama, kemudian container image yang lama akan kehilangan tag nya (untagged). Umumnya untagged container image ini sudah tidak digunakan dan kita dapat menghapus container image tersebut.
Pada artikel kali ini saya akan mendiskusikan cara membuat automation untuk menghapus untagged container image di ECR menggunakan ECR Lifecycle Policy. Pembuatan atau provisioning lifecycle policy ini menggunakan metode Infrastructure as Code (IaC). IaC tools yang digunakan adalah Terraform dengan backend remote (Terraform Cloud).
Konfifgurasi
Pada artikel ini, struktur file yang digunakan oleh terraform code sebagai berikut:
ecr/
├─ ecr-apse-1/
│ ├─ json-policies/
│ │ ├─ lanandra-ip-reader.json
│ ├─ ecr.tf
│ ├─ main.tf
│ ├─ variables.tf
- Sebelum memulai rangkaian konfigurasi, saya ingin menampilkan contoh untagged container image yang ada di repository ECR seperti pada gambar di bawah ini:
- Kemudian sebagai langkah awal konfigurasi, saya mulai dengan membuat satu file dengan nama main.tf. Di file ini saya akan mendeklarasikan konfigurasi terraform yang akan mengacu ke terraform cloud (app.terraform.io) sebagai backend. Dan mereferensikan nama organisasi dan workspace yang digunakan. Kemudian saya juga deklarasikan terraform provider yang digunakan yaitu hashisorp/aws dengan versi terkait. Di akhir saya deklarasikan region aws yang digunakan, mengacu ke variable aws_region yang ada di file variables.tf yang berikutnya akan saya jelaskan.
# Setup terraform cloud and workspace
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "lanandra"
workspaces {
name = "ecr-ap-southeast-1"
}
}
}
# Setup terraform providers
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.8.0"
}
}
required_version = ">= 1.1.7"
}
# Setup AWS provider
provider "aws" {
region = var.aws_region
}
- Langkah berikutnya yaitu dengan membuat variable di file variables.tf. Di file ini saya deklarasikan variable aws_region. Variable aws_region digunakan untuk menentukan default AWS region yang digunakan yaitu ap-southeast-1.
# Setup AWS Region
variable "aws_region" {
type = string
description = "AWS Region"
default = "ap-southeast-1"
}
- Berikutnya di file json-policies/lanandra-ip-reader.json. Saya mendeklarasikan rule untuk menghapus/expire container image dengan status untagged yang sudah berada selama 14 hari sejak image di-push ke ECR. Untuk mengetahui lebih detail parameter yang digunakan dalam ECR lifecycle policy, dapat melihat dokumentasi ECR berikut
{
"rules": [
{
"rulePriority": 1,
"description": "Expire images older than 14 days",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 14
},
"action": {
"type": "expire"
}
}
]
}
- Berikutnya saya akan mendiskusikan file ecr.tf. Di file ini, saya membuat konfigurasi ECR lifecycle policy dengan mengacu ke rule yang sudah di-deklarasikan di json-policies/lanandra-ip-reader.json.
resource "aws_ecr_lifecycle_policy" "lanandra_ip_reader" {
repository = aws_ecr_repository.lanandra_ip_reader.name
policy = file("./json-policies/lanandra-ip-reader.json")
}
- Berikutnya adalah melakukan commit dan push terraform code ke repository. Dan lakukan terraform plan dan terraform apply di Terraform Cloud workspace agar infrastructure dapat dibuat/provisioned. Untuk bagian ini hanya saya tampilkan simulasinya saja. Jika ingin melihat lebih detail bagaimana proses provisioning resource AWS via Terraform Cloud, silahkan lihat blogpost saya berikut ini.
- Setelah provision resource di Terraform Cloud selesai dan berhasil, hal yang dapat kita lakukan adalah verifikasi resource via AWS Web Console. Saya mulai dengan verifikasi ECR lifecycle policy. Masuk ke halaman service ECR, lalu masuk dan pilih repository. Kemudian masuk ke menu Lifecycle Policy. Pastikan rule lifecycle policy yang sudah di-definisikan di terraform code sudah berhasil terbentuk. Secara default, container image yang terpengaruh oleh rule lifecycle policy akan dihapus setelah 24 jam, seperti yang tercantum di dokumentasi ECR berikut
- Setelah 24 jam, kita dapat kembali lagi ke halaman service ECR untuk memastikan untagged container image sudah berhasil terhapus secara otomatis dengan bantuan lifecycle policy.
Kesimpulan
Akhirnya kita sampai di penghujung artikel ini. Ada beberapa kesimpulan atau key takeaways yang ingin saya sampaikan:
- Untagged container image yang ada di dalam ECR dapat dihapus secara otomatis atau secara automation menggunakan ECR lifecycle policy
- Konfigurasi ECR lifecyle policy dapat dilakukan dengan pendekatan IaC. Sehingga kita memiliki state file dari infrastruktur ECR lifecycle policy yang sudah kita buat
Silahkan kunjungi GitHub repo saya untuk melihat source code konfigurasi ECR via terraform yang saya gunakan pada artikel ini.
Sekian artikel kali ini. Jika ada saran, kritik, atau masukan silahkan tinggalkan di kolom komentar.
Tinggalkan Balasan