如何更新 Amazon ECS 容器代理上的私有存储库凭证?

2 分钟阅读
0

我想更新 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 容器代理配置

身份验证格式

相关视频

AWS 官方
AWS 官方已更新 3 年前