tl;dr Cara konfigurasi membuat Amazon ECR Repository via Terraform. Kemudian build dan release container image dari GitLab CI/CD pipeline ke Amazon ECR Repository
Jika kita berbicara metode pembuatan dan rilis container image pastilah banyak sekali metodenya. Begitu juga dengan tempat menyimpan container image atau yang sering disebut container registry, banyak sekali media yang dapat digunakan. Di Amazon Web Services (AWS), kita juga dapat menggunakan service untuk menyimpan container image yang dinamakan Amazon Elastic Container Registry (ECR). Untuk mengetahui lebih detail terkait Amazon ECR, silahkan melihat dokumentasi ini.
Pada artikel ini, saya akan mencoba mendiskusikan cara build (membuat) dan release (merilis) container image dari Version Control System (VCS)/Git Repository GitLab ke Amazon ECR. ECR Repository yang digunakan adalah private repository dan akan dibuat/provision menggunakan metode Infrastructure as Code (IaC). IaC tools yang digunakan adalah Terraform dengan backend Terraform Cloud. Jika diilustrasikan topologinya kurang lebih seperti berikut ini:
Konfigurasi
Pada artikel ini, struktur file yang digunakan oleh terraform code sebagai berikut:
ecr/
├─ ecr-apse1/
│ ├─ ecr.tf
│ ├─ main.tf
│ ├─ variables.tf
- Sebagai langkah awal, 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"
}
- Selanjutnya saya akan membahas file ecr.tf. Di file ini, saya mendeklarasikan konfigurasi ECR. Saya membuat sebuah ECR repository dengan nama lanandra-ip-reader. Kemudian fitur image_tag_mutability nya saya buat menjadi mutable. Dengan membuat image tag mutable, maka image tag dapat di-overwrite. Selengkapnya silahkan cek dokumentasi ini. Dan terakhir saya aktifkan fitur container image scan untuk dapat memberikan laporan vulnerability di container image.
# Create ECR Repository
resource "aws_ecr_repository" "lanandra_ip_reader" {
name = "lanandra-ip-reader"
image_tag_mutability = "MUTABLE"
image_scanning_configuration {
scan_on_push = true
}
}
- 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 repository. Masuk ke halaman service ECR, kemudian pilih menu Repositories > Private. Pastikan repository sudah berhasil terbentuk.
- Berikutnya adalah konfigurasi di sisi GitLab repository. Dimulai dengan konfigurasi file yang digunakan oleh CI/CD pipeline (.gitlab-ci.yml). Saya membuat sebuah stage untuk melakukan build dan push docker/container image ke Amazon ECR. File Dockerfile yang saya digunakan sebagai referensi untuk build image tidak saya jelaskan lebih detail di artikel ini
# Define stages
stages:
- build and release container image to ecr
# Build and release container image to Amazon ECR
build-and-release-container-image-to-ecr:
image:
name: amazon/aws-cli
entrypoint: [""]
stage: build and release container image to ecr
services:
- docker:dind
before_script:
- amazon-linux-extras install docker
- aws --version
- docker --version
script:
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY
- docker build -t lanandra-ip-reader .
- docker tag lanandra-ip-reader:latest $ECR_REPOSITORY:latest
- docker tag lanandra-ip-reader:latest $ECR_REPOSITORY:0.0.3
- docker push $ECR_REPOSITORY:latest
- docker push $ECR_REPOSITORY:0.0.3
only:
- main
-
Seperti yang di-deklarasikan di file .gitlab-ci.yml di poin 6 di atas, saya menggunakan beberapa environment variable. Disamping ada beberapa environment variable yang wajib diperlukan oleh GitLab untuk CI/CD pipeline ke AWS seperti yang ada di dokumentasi ini, yaitu AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY dan AWS_DEFAULT_REGION. Masuk ke GitLab repository/project setting, kemudian pilih CI/CD dan tambahkan beberapa variable yang diperlukan.
Berikut variable yang saya gunakan dan sesuaikan nilai/value nya sesuai environment/resource yang anda miliki.
AWS_ACCESS_KEY_ID='YOUR_ACCESS_KEY'
AWS_SECRET_ACCESS_KEY='YOUR_SECRET_KEY'
AWS_DEFAULT_REGION='ap-southeast-1'
DOCKER_HOST='tcp://docker:2375'
ECR_REGISTRY='your-aws-id.dkr.ecr.ap-southeast-1.amazonaws.com'
ECR_REPOSITORY='your-aws-id.dkr.ecr.ap-southeast-1.amazonaws.com/your-repository'
- Selanjutkan jalankan pipeline dan pastikan job berhasil dan pipeline sukses.
- Selanjutnya kembali ke halaman AWS Web Console dan masuk ke halaman repository yang sudah dibuat. Pastikan container image tag yang sudah didefiniskan di .gitlab-ci.yml sudah berhasil terkirim/pushed ke repository.
- Selanjutnya kita juga dapat mencoba login ke ECR registry dan mencoba download container image yang sudah terupload dari CI/CD pipeline. Pastikan docker login dan docker pull image nya berhasil.
Kesimpulan
Akhirnya kita sampai di penghujung artikel ini. Ada beberapa kesimpulan atau key takeaways yang ingin saya sampaikan:
- AWS memiliki sebuah service yang bertindak sebagai container registry yaitu Amazon ECR
- Kita dapat mengintegrasikan CI/CD pipeline dari VCS yang kita gunakan (misal dalam artikel ini contohnya GitLab) untuk melakukan build dan release image dari CI/CD pipeline ke Amazon ECR.
- Konfigurasi ECR dapat dilakukan dengan pendekatan IaC. Sehingga kita memiliki state file dari infrastruktur ECR 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.