ECR — registry image
ECR adalah registry privat yang terintegrasi dengan IAM, jadi tidak ada kredensial registry yang harus disimpan. Yang perlu diputuskan sejak awal: bagaimana image diberi tag, dan berapa lama disimpan.
Intisari
- Tag dengan SHA commit, bukan
latest. Tanpa itu, rollback tidak mengembalikan apa pun. - Nyalakan
imageTagMutability: IMMUTABLE— tag yang sudah dipakai tidak bisa ditimpa. - Pemindaian kerentanan bisa ditingkatkan (terus-menerus) atau dasar (saat push).
- Kebijakan umur (lifecycle policy) wajib — tanpa itu ratusan image lama menumpuk dan ditagih.
- Autentikasi lewat IAM:
aws ecr get-login-password, tanpa kredensial permanen.
Menyiapkan repositori
aws ecr create-repository \
--repository-name toko/server \
--image-tag-mutability IMMUTABLE \
--image-scanning-configuration scanOnPush=true \
--encryption-configuration encryptionType=AES256 \
--region ap-southeast-1
IMMUTABLE adalah setelan yang paling sering disesali kalau tidak dinyalakan.
Dengan tag yang bisa ditimpa, v1.4.2 hari ini bisa berisi kode yang berbeda dari
v1.4.2 minggu lalu — dan investigasi insiden jadi mustahil karena tidak ada yang tahu apa
yang sebenarnya berjalan. Nyalakan sejak repositori dibuat; mengubahnya nanti tidak memperbaiki image
yang sudah terlanjur tertimpa.
Push
AKUN=123456789012
WILAYAH=ap-southeast-1
REPO=$AKUN.dkr.ecr.$WILAYAH.amazonaws.com/toko/server
# Login lewat IAM — tanpa sandi registry yang disimpan
aws ecr get-login-password --region $WILAYAH \
| docker login --username AWS --password-stdin $REPO
TAG=$(git rev-parse --short HEAD)
docker build -t $REPO:$TAG .
docker push $REPO:$TAG
Strategi penamaan tag
| Tag | Untuk | Catatan |
|---|---|---|
a1b2c3d (SHA commit) | Deploy | Selalu unik; menunjuk persis satu commit |
v1.4.2 | Rilis yang diberi label | Untuk manusia dan catatan rilis |
main | Petunjuk terbaru dari cabang | Hanya untuk staging |
latest | Jangan dipakai | Rollback jadi tidak berarti apa-apa |
Task definition ECS harus menunjuk tag SHA, bukan tag bergerak. Kalau ia menunjuk
latest, "rollback ke revisi task definition sebelumnya" akan menarik image yang sama persis
dengan yang barusan rusak — karena latest sudah berubah. Ini kegagalan rollback yang paling
umum, dan baru ketahuan saat kamu paling membutuhkannya.
Kebijakan umur
{
"rules": [
{
"rulePriority": 1,
"description": "Simpan 10 image produksi terakhir",
"selection": {
"tagStatus": "tagged",
"tagPrefixList": ["v"],
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": { "type": "expire" }
},
{
"rulePriority": 2,
"description": "Hapus image tanpa tag setelah 7 hari",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 7
},
"action": { "type": "expire" }
}
]
}
Sisakan cukup banyak image untuk rollback yang sungguhan. Menyimpan hanya tiga image terakhir terasa hemat sampai kamu perlu kembali ke versi lima deploy yang lalu — dan menemukan image-nya sudah dihapus. Sepuluh image Go berukuran ~17 MB praktis tidak ada biayanya.
Pemindaian kerentanan
| Mode | Kapan memindai | Cakupan |
|---|---|---|
| Dasar | Saat push | Paket OS saja |
| Ditingkatkan (Inspector) | Saat push dan terus-menerus | Paket OS + dependensi Go |
Untuk image Go berbasis distroless, pemindaian dasar hampir selalu bersih — memang tidak ada
paket OS di dalamnya. Yang benar-benar berguna adalah pemindaian yang membaca dependensi Go di dalam
binari. Dan pelengkapnya di sisi kode adalah govulncheck (Fase 8), yang tahu apakah
kerentanannya benar-benar bisa dijangkau kodemu.
Menarik image dari VPC privat
Task Fargate di subnet privat butuh jalan keluar untuk menarik image:
Opsi A: NAT Gateway
✅ paling sederhana
❌ ditagih per jam DAN per GB — biaya tetap yang sering mengejutkan
Opsi B: VPC Endpoint (ecr.api, ecr.dkr, s3 gateway, logs)
✅ lalu lintas tidak pernah keluar dari jaringan AWS
✅ lebih murah pada volume tinggi, dan lebih cepat
❌ beberapa endpoint yang harus dibuat
Yang sering terlewat: ECR menyimpan lapisan image di S3, jadi VPC endpoint untuk ECR saja tidak cukup — kamu juga butuh gateway endpoint untuk S3. Tanpa itu, tarikan image gagal dengan pesan timeout yang tidak menyebut S3 sama sekali.
Latihan: buat repositori ECR dengan tag immutable, push image dengan tag SHA commit, lalu coba
push ulang tag yang sama dan baca penolakannya. Pasang kebijakan umur, lalu jalankan
aws ecr describe-images untuk melihat hasil pemindaian kerentanannya.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.