亚马逊AWS官方博客

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

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

1. 前提条件

管理员账户

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

  • AWSLambda_FullAccess
  • AmazonEventBridgeFullAccess
  • AmazonS3FullAccess
  • AWSCloudTrail_FullAccess
  • IAMReadOnlyAccess

Amazon Lambda 执行角色

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

  • AWSCloudTrail_FullAccess
  • AmazonEC2ContainerRegistryFullAccess

2. 方案介绍

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

3. 方案部署

3.1 创建 Amazon Lambda 函数

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

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

3)点击权限下方的“更改默认执行角色”,选择“使用现有角色”,使用在前提条件当中创建 Amazon 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 创建 Amazon EventBridge 事件

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

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

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

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

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

4. 验证

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

本篇作者

谭继聪

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