Skip to content
Chris Yuan | Blog
Go back

AWS ECR Create on Push:一個客戶敲碗敲了六年才有的基本功能

Edit page

Table of contents

Open Table of contents

問題根源

ECR(Amazon Elastic Container Registry)從設計之初就有個讓工程師抓狂的限制:

推送 image 之前,必須先手動建立 repository。

這和所有主流 container registry 的行為完全相反。Docker HubGCRACRQuayHarborArtifactory——每一家的邏輯都是 「不用管 repository 在不在,不在的話推了就會自動建立」。ECR 是業界的異類。

實際開發上這很煩:

# 天下工程師都在寫這段
aws ecr describe-repositories --repository-names "$REPO" 2>/dev/null || \
  aws ecr create-repository --repository-name "$REPO"
docker push "$IMAGE"

Issue #853 的誕生(2020 年 4 月)

2020 年 4 月,GitHub 用戶 rpnguyenAWS containers roadmap 提出了這個需求,訴求非常直白:

「推送 image 時,如果 repository 不存在,請自動建立它。」

Issue 標籤被設為 Work in Progress,然後……就沒有然後了。

這個 issue 最終累積了:

社群留言大概長這樣:

「這是我們遷移到 ECR 的最大障礙,難以置信竟然還沒有這個功能。」(2022 年 7 月)

「我們真的需要這個功能,否則根本沒辦法使用 ECR。」(2022 年 10 月)


漫長等待與 Workaround 年代(2020–2024)

在 AWS 遲遲不動作的這幾年,工程師們發展出各種民間解法。其中最流行的是一套「CloudTrail + EventBridge + Lambda 組合拳」:

docker push ECR 回傳 RepositoryNotFoundException CloudTrail 記錄 InitiateLayerUpload 事件 EventBridge 規則觸發 Lambda Lambda 呼叫 ECR API 建立 repository Docker 自動 retry,push 成功 ✓

這個架構要串接四個 AWS 服務,外加 Terraform 模組管理 IAM Role、Lambda 函數、EventBridge Rule。只為了完成一個 docker push

AWS 的神奇操作

2024 年 10 月,AWS 在官方部落格發了一篇文章 Dynamically create repositories upon image push to Amazon ECR,手把手教大家怎麼搭上述 workaround 架構。

很微妙吧?知道是痛點,但選擇「教你繞過去」而不是「直接修掉」。社群的反應大致是:

謝謝你教我怎麼用四個服務解決一個本來不該存在的問題。


終於 Shipped(2025 年 12 月 19 日)

距離 issue 提出整整 五年八個月 後,AWS 正式發布 ECR 原生支援 Create on Push

功能運作方式

做法是先建好 Repository Creation Template,定義 repository 的預設設定。之後 push 到不存在的 repo 時,ECR 就會自動套用 template 建立:

docker push myapp/frontend:v1.0 Repository 'myapp/frontend' 不存在 ECR 查找匹配的 Repository Creation Template 匹配 prefix 'myapp' 的 template,啟用 CREATE_ON_PUSH 依 template 設定自動建立 repository Image 推送成功 ✓

Terraform 設定範例

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecr_repository_creation_template
resource "aws_ecr_repository_creation_template" "example" {
  prefix      = "myapp"
  description = "Auto-create repos for myapp services"

  applied_for = [
    "CREATE_ON_PUSH",
  ]

  image_tag_mutability = "IMMUTABLE"

  encryption_configuration {
    encryption_type = "AES256"
  }
}

功能已在所有 AWS 商業區域與 GovCloud (US) 上線。


時間軸總結

時間事件
2020 年 4 月Issue #853 提出,標記為 Work in Progress
2020–2022社群各自摸索 workaround,留言越積越多
2022 年下半年留言出現「這是最大障礙」、「無法使用 ECR」等強烈反應
2024 年 10 月AWS 官方發文教大家「怎麼用 Lambda workaround」
2025 年 12 月 19 日AWS 正式 ship 原生 Create on Push,issue 關閉

其他 registry 生來就有的功能,ECR 讓全世界工程師等了將近六年才補上。就這樣。


完整文件參閱:Amazon ECR Repository Creation Templates


Edit page
Share this post on:

Next Post
寶雅、美華泰、名佳美:一個台南家族的零售三國志