← Semua pembelajaran / Go Nol → Enterprise
Fase 10 · Deploy di AWS

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

TagUntukCatatan
a1b2c3d (SHA commit)DeploySelalu unik; menunjuk persis satu commit
v1.4.2Rilis yang diberi labelUntuk manusia dan catatan rilis
mainPetunjuk terbaru dari cabangHanya untuk staging
latestJangan dipakaiRollback 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

ModeKapan memindaiCakupan
DasarSaat pushPaket OS saja
Ditingkatkan (Inspector)Saat push dan terus-menerusPaket 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.