Amazon ECR 目前不支持镜像存储库的自动创建。当开发人员向 Amazon ECR 推送一个新进项,如果与其对应的存储库不存在,推送就会失败。Amazon ECR 相比起其他公有云,他的镜像是必须要求 dockerhub.io/test/nginx:version, 这里 nginx 才会被是为一个镜像存储库,而 GCP 的 Artifact registry 是 test (Project )才会被视为一个镜像存储库。这样对于存储仓库就不需要额外创建了。
下文阐述 Amazon ECR创建仓库的方法
方法1:awscli
awscli 中有 create-repository 子命令,允许用户创建一个仓库
|
|
可以使用脚本来检测仓库是否存在 [1]
|
|
或 [1]
|
|
方法2:Lambda + EventBridge
Lambda 是 AWS 中的 serverless computing service, 他的名字来源于数学中的 Lambda Calculus(λ演算),在计算机科学中,他称为 lambda functions (anonymous functions)。在 AWS 中就是,程序执行不需要部署服务器,工作负载等程序,只需要提供代码就可以了。
EventBridge 是一个使用事件连接不同应用的 serverless service,可以很容易的构建出基于事件驱动 ( event-driven ) 的应用程序。EventBridge 包含两个组件,“事件总线” 和 “管道”。“事件总线” 接收事件,并将其传送到零个或多个目标的路由器。管道是源和目标之间的点到点继承管道,用于处理和传递单个目标。[2]
前提准备
创建 Lambda 执行角色
给 Amazon Lambda 函数创建一个执行角色(例如:ecr-repo-auto-create),让 Amazon Lambda 可以创建 Amazon ECR 映像库并将日志发送给 Amazon CloudTrail。这个执行角色至少需要拥有以下权限:
AWSCloudTrail_FullAccess 将日志发送给 Amazon CloudTrail
AmazonEC2ContainerRegistryFullAccess ECR所有访问权限
AWSLambda_FullAccess Lambda的所有权限
AmazonEventBridgeFullAccess EventBridge的所有权限
AmazonS3FullAccess S3 的所有权限
IAMReadOnlyAccess IAM 只读权限
最终创建出的角色如下图所示
创建 Amazon Lambda
步骤1:在 Amazon Lambda 服务中选择创建函数
步骤2:输入函数的名字(这里为:ecr-repo-auto-create),并选择 Python 3.13 作为运行环境
步骤3:点击权限下方的“更改默认执行角色”,选择“使用现有角色”,使用在前提条件当中创建 Amazon Lambda 的执行角色(这里选择上面创建的 ecr-repo-auto-create 用户)
步骤4:点击“创建函数”
步骤5:在 “代码” 部分创建文件 lambda_function.py,并将下面代码复制进入
|
|
步骤6:在 “配置”部分,选择 “环境变量”,添加 IMAGE_TAG_MUTABILITY
,REPO_SCAN_ON_PUSH
,REPO_TAGS
三个环境变量,并根据实际需求给环境变量赋值。
环境变量 | 值 |
---|---|
IMAGE_TAG_MUTABILITY | MUTABLE |
REPO_SCAN_ON_PUSH | false |
REPO_TAGS` |
创建 Amazon EventBridge 事件
步骤1:在 Amazon EventBridge 服务中选择“创建规则”
步骤2:填写规则的名字(这里使用:ecr-repo-auto-create),并点击“下一步”
步骤3:选择“编辑模式”,将下面内容复制粘贴到空白处。选择下一步
|
|
步骤4:将目标设置为“创建 Amazon Lambda” 中创建的 Amazon Lambda 函数 (ecr-repo-auto-create)
最后可以在 “规则” 中的监控查看函数自动执行的情况,或者报错。
下图展示了 Amazon EventBridge 执行的一些日志
上图展示了仓库已存在的日志报错。
上图展示了代码错误的日志
上图展示了成功创建仓库的日志。
通过这些日志可以很好的去对你的脚本进行错误排查
Reference
[1] Create AWS ECR repository if it doesn’t exist
[5] Dynamically create repositories upon image push to Amazon ECR