我想在通过 AWS Secrets Manager 或环境变量提供的 Amazon Elastic Container Service (Amazon ECS) 容器代理上更新我的私有存储库凭证。
简短描述
要向 Amazon ECS 容器代理提供私有存储库凭证,请在您的任务定义中使用 Secrets Manager 或环境变量。
**注意:**在容器实例上以明文形式存储凭证并不是一种安全最佳实践。除非在架构上存在直接依赖关系,必须在容器实例中存储注册表凭证,否则请改用 Secrets Manager。
解决方法
使用 Secrets Manager 更新您的私有存储库凭证
完成以下步骤:
- 打开 Secrets Manager 控制台。
- 选择您的密钥,然后选择 Retrieve secret value(检索密钥值)。
- 选择 Edit(编辑)。
- 更新您的私有注册表的存储凭证,然后选择 Save(保存)。
- 完成“测试更新后的私有存储库凭证”部分中的步骤。
使用环境变量更新您的私有存储库凭证
完成以下步骤:
- 连接到您的容器实例。
- 要查看如何向 ECS 容器代理提供 Docker 凭证,请运行以下命令:
$ cat /etc/ecs/ecs.config
此命令将返回 /etc/ecs/ecs.config 文件的内容。
如果 ECS_ENGINE_AUTH_TYPE 变量设置为 docker,则您可以通过明文形式直接将 Docker 凭证传递给 ECS 容器代理。但是,使用此方法并不是最佳实践。相反,请使用 Secrets Manager。或者,使用以下“**获取新的 Docker 身份验证值”**部分中的 dockercfg 格式方法。
如果 ECS_ENGINE_AUTH_TYPE 变量设置为 dockercfg,则您可以通过 docker login 命令生成的 Docker 所生成的身份验证值来传递 Docker 凭证。如果您使用此方法,请完成“获取新的 Docker 身份验证值”部分中的步骤。
获取新的 Docker 身份验证值
完成以下步骤:
-
要在本地登录您的 Docker 账户,请运行以下命令,然后输入您的新凭证:
$ docker login
-
要连接您的 config.json 文件,请运行以下命令,然后复制 Docker 生成的身份验证密钥值:
$ cat ~/.docker/config.json
-
要更新 ECS_ENGINE_AUTH_DATA 变量,请运行以下命令:
$ sudo vi /etc/ecs/ecs.config
-
在 vi 编辑器中,将 ECS_ENGINE_AUTH_DATA 变量的值更新为 Docker 身份验证密钥值。示例:
ECS_CLUSTER=TestECSCluster
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"a2vpdGhhd3M6UGFzc3dvcmQ=","email":"email@example.com"}}
-
完成“重启 ECS 容器代理”部分中的步骤。
重启 ECS 容器代理
完成以下步骤:
- 要重启 ECS 容器代理,请根据您的容器实例正在运行的亚马逊机器映像 (AMI) 运行以下任一命令。
Amazon Linux 2 ECS 优化型 AMI:
$ sudo systemctl restart ecs
**注意:**Amazon Linux 1 于 2023 年 12 月 31 日终止了生命周期。Amazon Linux AMI 将不再接收任何安全更新或错误修复。有关详细信息,请参阅“关于 Amazon Linux AMI 生命周期终止的更新”。
Amazon Linux ECS 优化型 AMI:
$ sudo stop ecs && sudo start ecs
**注意:**要在 ECS 集群中的其他容器实例上更新 /etc/ecs/ecs.config 文件,请参阅“使用环境变量更新私有存储库凭证”。然后,按照每个容器实例的更新过程进行操作。
- 完成“测试更新后的私有存储库凭证”部分中的步骤。
测试更新后的私有存储库凭证
**注意:**在以下测试示例中,更新后的映像将部署在集群中。
完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群),然后选择您的集群。
- 选择您的服务,然后选择 Update(更新)。
- 选中 Force new deployment(强制实施新部署)复选框。
- 选择 Update(更新)。
- 在 Deployments(部署)选项卡上,查看新部署。Amazon ECS 会逐步停止先前部署下的任务。然后,Amazon ECS 会重新启动新部署下的任务,同时 ECS 会尝试拉取新的映像。
**注意:**如果您使用 EC2 启动类型任务,则您的集群必须有足够的资源才能成功执行滚动更新部署类型。
- 选择 Tasks(任务)选项卡,然后查看每个单独的任务及其状态。
如果新任务的状态设置为 Running(正在运行),则表明服务成功更新了任务,且未出现错误。
如果新任务的最后状态设置为 Stopped | Task failed to start(已停止 | 任务启动失败),则表明服务更新了此任务,然后遇到了错误。ECS 容器代理无法拉取新的容器映像,正在使用旧的缓存映像。验证您的凭证是否已更新,然后再次执行服务部署更新操作。
**注意:**要显示任务的完整详细信息并查看“pull access denied”(拉取访问被拒绝)错误,请选择失败的任务 ID。在 Description(描述)页面的 Containers(容器)下,选择 Stopped(已停止)。
错误消息示例:
“CannotPullContainerError: 来自进程守护程序的错误响应:对用户/存储库名称的拉取访问被拒绝,存储库不存在或可能需要 'docker login'”
相关信息
Amazon ECS 容器代理配置
身份验证格式