亚马逊AWS官方博客

实现 HAQM ECR 映像存储库的自动创建

HAQM Elastic Container Registry(ECR)是 AWS 托管容器映像注册表服务。像 Docker Hub 一样,HAQM ECR 允许用户推送、提取和管理 Docker 映像、Open Container Initiative(OCI)映像和 OCI 兼容构件。但不同的是,HAQM ECR 目前不支持映像存储库的自动创建。当开发人员向 HAQM ECR 推送一个新映像的时候,如果与其对应的存储库不存在,推送就会失败,给映像开发和管理人员带来了很大的不便。本文将演示如何使用 HAQM Lambda 和 HAQM EventBridge 来实现 HAQM ECR 映像存储库的自动创建。

1. 前提条件

管理员账户

在部署这个方案的时候,尽量使用拥有管理员权限的账户,避免因为缺少权限而导致部署失败。如果无法使用管理员账户,用来部署方案的账户至少需要拥以下 IAM 权限:

  • AWSLambda_FullAccess
  • HAQMEventBridgeFullAccess
  • HAQMS3FullAccess
  • AWSCloudTrail_FullAccess
  • IAMReadOnlyAccess

HAQM Lambda 执行角色

给 HAQM Lambda 函数创建一个执行角色(例如:ecr-repo-auto-create),让 HAQM Lambda 可以创建 HAQM ECR 映像库并将日志发送给 HAQM CloudTrail。这个执行角色至少需要拥有以下权限:

  • AWSCloudTrail_FullAccess
  • HAQMEC2ContainerRegistryFullAccess

2. 方案介绍

当使用 Docker 客户端推送映像文件到 HAQM ECR 的时候,如果映像库不存在,会导致推送失败。使用 HAQM EventBridge 监控 HAQM ECR 的事件,当监测到日志中存在 RepositoryNotFoundException 的事件,触发 HAQM Lambda 调用 API 在 HAQM ECR 中创建相应的映像库。当 Docker 客户端自动重试推送的时候,就可以成功推送镜像文件了。

3. 方案部署

3.1 创建 HAQM Lambda 函数

1)在 HAQM Lambda 服务中选择创建函数

2)输入函数的名字(例如:ecr-repo-auto-create),并选择 Python 3.11 作为运行环境

3)点击权限下方的“更改默认执行角色”,选择“使用现有角色”,使用在前提条件当中创建 HAQM Lambda 的执行角色(例如:ecr-repo-auto-create)

4)点击“创建函数”

5)点击“上传”并选择用 zip 的方式将 github 上面的压缩文件上传。原始代码可以在 lambda_function.py 查看到

6)点击“配置”,选择“环境变量”,添加 IMAGE_TAG_MUTABILITY,REPO_SCAN_ON_PUSH,REPO_TAGS 三个环境变了,并根据自己的实际需求给环境变了赋值

7)保存更改

3.2 创建 HAQM EventBridge 事件

1)在 HAQM EventBridge 服务中选择“创建规则”

2)填写规则的名字(例如:ecr-repo-auto-create),并点击“下一步”

3)选择“修改格式”,将 ecr-repo-not-found.json 里的内容复制粘贴到空白处。选择下一步

4)将目标设置为第 3.1 步中创建的 HAQM Lambda 函数

5)一直选择“下一步”,最后选择“创建”

4. 验证

使用 Docker 客户端将新映像推送到一个不存在的映像库中,Docker 客户端在经历过一次重试后会成功推送映像。

本篇作者

谭继聪

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,并专注于数据库和数据分析技术方向。