我想更新 Amazon Elastic Container Service (Amazon ECS) 容器代理上通过 AWS Secrets Manager 或环境变量提供的私有存储库凭证。
简短描述
您可以在任务定义或环境变量中使用 Secrets Manager 来为 Amazon ECS 容器代理提供私有存储库凭证。
选择以下任意一种方案:
- 如果您使用 Secrets Manager 提供私有存储库凭证,则按照使用 Secrets Manager 更新私有存储库凭证部分的步骤操作。
- 如果您使用实例用户数据和环境变量来提供私有存储库凭证,则请按照通过环境变量更新私有存储库凭证部分的步骤操作。
注意:在容器实例上以明文形式存储凭据不是安全最佳实践。最佳实践是使用 Secrets Manager,除非相关架构要求直接在容器实例中存储注册表凭证。
解决方法
使用 Secrets Manager 更新私有存储库凭证
1. 打开 Secrets Manager 控制台。
2. 选择您的密钥,然后选择检索密钥值。
3. 选择编辑。
4. 更新已存储的私有注册表凭证,然后选择保存。
然后完成测试更新后的私有存储库凭证部分的步骤。
通过环境变量更新私有存储库凭证
1. 连接到您的容器实例。
2. 要了解如何为 ECS 容器代理提供 Docker 凭证,请运行以下命令:
$ cat /etc/ecs/ecs.config
此命令将返回 /etc/ecs/ecs.config 文件的内容。
如果将 ECS_ENGINE_AUTH_TYPE 变量的值设置为 docker,则可以纯文本形式将 Docker 凭证直接传递到 ECS 容器代理。但应避免使用这种方法,而应使用 Secrets Manager 或者获取新的 Docker 身份验证值部分的 ckercfg 格式方法。
如果将 ECS_ENGINE_AUTH_TYPE 变量设置为 dockercfg,则会以 Docker 生成的身份验证值(由 docker login 命令生成)的形式传递 Docker 凭证。然后完成获取新的 Docker 身份验证值部分的步骤。
获取新的 Docker 身份验证值
1. 要本地登录 Docker,请运行以下命令,然后输入您的新凭证:
$ docker login
2. 要串联您的 config.json 文件,请运行以下命令,然后再复制 Docker 生成的身份验证密钥值。
$ cat ~/.docker/config.json
3. 要更新 ECS_ENGINE_AUTH_DATA 变量,请运行以下命令:
$ sudo vi /etc/ecs/ecs.config
4. 在 vi 编辑器中,将 ECS_ENGINE_AUTH_DATA 变量的值更新为第 2 步中的 Docker 身份验证密钥值。例如:
ECS_CLUSTER=TestECSCluster
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth","a2vpdGhhd3M6UGFzc3dvcmQ="}}
然后完成重启 ECS 容器代理部分的步骤。
重启 ECS 容器代理
1. 要重新启动 ECS 容器代理,请根据运行容器实例的 Amazon 系统映像 (AMI) 来运行下面的一种命令。
Amazon Linux ECS 优化的 AMI:
$ sudo stop ecs && sudo start ecs
Amazon Linux 2 ECS 优化的 AMI:
$ sudo systemctl restart ecs
注意:要更新 ECS 集群中其他容器实例上的 /etc/ecs/ecs.config 文件,请返回通过环境变量更新私有存储库凭证部分。然后,对每个容器实例执行更新流程。
然后完成测试更新后的私有存储库凭证部分的步骤。
测试更新后的私有存储库凭证
以下步骤假定您在集群中部署更新后的映像。
1. 打开 Amazon ECS 控制台。
2. 在导航窗格中,选择集群,然后选择您的集群。
3. 选择您的服务,然后选择更新。
4. 选择强制执行新部署复选框。
5. 对于最低正常运行百分比,请输入 50。
6. 完成安装向导中的其余步骤,然后选择更新服务。
7. 选择查看服务。
8. 在部署选项卡上,查看新的部署。Amazon ECS 会逐渐停止前一部署的任务,然后在新部署下重新启动这些任务,同时尝试执行新的映像拉取。
注意:第 8 步假定集群具有足够的资源来成功执行滚动更新部署类型。
9. 选择任务选项卡,然后检查每个单独的任务及其状态。
如果任务状态设置为正在运行,则表示该服务已成功更新此任务且无错误。
如果任务状态设置为正在运行 (CannotPullContainerError),则表示该服务已更新此任务,但存在错误。ECS 容器代理无法拉取新容器映像,并且使用旧的缓存映像。验证您的凭证是否已更新,然后再次执行服务部署更新。
注意:要显示任务的完整详细信息,并查看“拉取访问被拒绝”错误,请选择您的各个任务状态的下拉箭头。例如:
CannotPullContainerError: Error response from daemon: pull access denied for user/reponame, repository does not exist or may require 'docker login'
相关信息
Amazon ECS 容器代理配置
身份验证格式