任务的私有注册表身份验证
通过使用 Amazon Secrets Manager 对任务进行私有注册表身份验证,您可以在任务定义中安全地存储并随后引用您的凭证。这提供了一种方法来引用存在于 Amazon 以外的私有注册表中的容器镜像,这需要在任务定义中进行身份验证。在 Fargate 上托管的任务、Amazon EC2 实例以及使用 Amazon ECS Anywhere 的外部实例都支持此功能。
如果您的任务定义引用了存储在 Amazon ECR 中的映像,则此主题不适用。有关更多信息,请参阅 Amazon Elastic Container Registry 用户指南中的使用 Amazon ECR 和 Amazon ECS。
对于 Amazon EC2 实例上托管的任务,此功能要求您具有版本 1.19.0
或更高版本的容器代理。但是,我们建议使用最新的容器代理版本。有关如何检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。
对于 Fargate 上托管的任务,此功能需要平台版本 1.2.0
或更高版本。有关信息,请参阅 Amazon Fargate 平台版本。
在容器定义中,使用您创建的密钥的详细信息指定 repositoryCredentials
对象。您引用的密钥可以来自与使用此密钥的任务不同的Amazon Web Services 区域或不同的账户。
使用 Amazon ECS API、Amazon CLI 或 Amazon SDK 时,如果密钥存在于要启动的任务所在的Amazon Web Services 区域,可以使用密钥的完整 ARN 或名称。如果密钥存在于另一个账户中,则必须指定密钥的完整 ARN。使用 Amazon Web Services Management Console 时,必须始终指定密钥的完整 ARN。
下面是显示必需参数的任务定义代码段:
"containerDefinitions": [ { "image": "
private-repo/private-image
", "repositoryCredentials": { "credentialsParameter": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name
" } } ]
启用私有注册表身份验证的另一种方法使用 Amazon ECS 容器代理环境变量向私有注册表进行身份验证。此方法仅支持 Amazon EC2 实例上托管的任务。有关更多信息,请参阅容器实例的私有注册表身份验证。
私有注册表身份验证所需的 IAM 权限
使用此功能需要 Amazon ECS 任务执行角色。这允许容器代理拉取容器映像。有关更多信息,请参阅Amazon ECS 任务执行 IAM 角色。
要提供对您创建的密钥的访问权限,请将以下权限作为内联策略添加到任务执行角色。有关更多信息,请参阅添加和删除 IAM policy。
-
secretsmanager:GetSecretValue
-
kms:Decrypt
- 仅当密钥使用自定义 KMS 密钥而不是原定设置密钥时才需要。您的自定义密钥的 Amazon 资源名称(ARN)必须添加为资源。
下面是添加所需权限的示例内联策略。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "ssm:GetParameters", "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:secret_name", "arn:aws:kms:<region>:<aws_account_id>:key/key_id" ] } ] }
启用私有注册表身份验证
创建基本密钥
使用 Amazon Secrets Manager 为您的私有注册表凭证创建密钥。
-
打开位于 https://console.aws.amazon.com/secretsmanager/
的 Amazon Secrets Manager 控制台。 -
选择 Store a new secret (存储新密钥)。
-
对于选择密钥类型,选择其他密钥类型。
-
选择纯文本文件并使用以下格式输入您的私有注册表凭证:
{ "username" : "
privateRegistryUsername
", "password" : "privateRegistryPassword
" } -
选择 Next (下一步)。
-
对于 Secret name(密钥名称),请输入可选的路径和名称,如
production/MyAwesomeAppSecret
或development/TestSecret
,然后选择 Next(下一步)。您可以选择添加描述以帮助记住该密钥以后的用途。密钥名称应仅包含 ASCII 字母、数字或以下任意字符:
/_+=.@-
。 -
(可选) 此时,您可以为密钥配置轮换。对于此程序,请将其保留为禁用自动轮换,然后选择下一步。
有关如何为新的或现有的密钥配置轮换的说明,请参阅轮换 Amazon Secrets Manager 密钥。
-
检查您的设置,然后选择 Store secret(存储密钥)以将输入的所有内容作为新密钥保存在 Secrets Manager 中。
创建使用私有注册表身份验证的任务定义
打开位于 https://console.aws.amazon.com/ecs/
的 Amazon ECS 控制台。 -
在导航窗格中,选择 Task Definitions。
-
在 Task Definitions (任务定义) 页面上,选择 Create new Task Definition (创建新任务定义)。
-
在 Select launch type compatibility (选择启动类型兼容性) 页面上,选择任务的启动类型,然后选择 Next step (下一步)。
注意 此步骤仅适用于支持使用 Amazon Fargate 的 Amazon ECS 的区域。有关更多信息,请参阅Amazon Fargate 上的 Amazon ECS。
-
在 task definition Name(任务定义名称)中,为任务定义输入名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。
-
对于 Task execution role(任务执行角色),选择现有任务执行角色,或者选择 Create new role(创建新角色)。此角色授权 Amazon ECS 提取任务的私有映像。有关更多信息,请参阅私有注册表身份验证所需的 IAM 权限。
重要 如果 Task execution role(任务执行角色)字段未显示,请选择 Configure via JSON(通过 JSON 配置)并添加
executionRoleArn
字段来指定您的任务执行角色。下面显示语法:"executionRoleArn": "arn:aws:iam::
aws_account_id
:role/ecsTaskExecutionRole" -
对于您的任务定义中要创建的每个容器,请完成以下步骤:
-
在 Container Definitions (容器定义) 部分,选择 Add container (添加容器)。
-
对于 Container name (容器名称),键入容器的名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。
-
对于 Image (映像),键入映像名称或到您私有映像的路径。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。
-
选择 Private repository authentication (私有存储库身份验证) 选项。
-
对于 Secrets manager ARN (密钥管理器 ARN),输入您之前创建的密钥的完整 Amazon Resource Name (ARN)。值的长度必须介于 20 到 2048 个字符之间。
-
填写剩余的必填字段和要在您的容器定义中使用的任何可选字段。更多容器定义参数将可用于 Advanced container configuration (高级容器配置) 菜单中。有关更多信息,请参阅任务定义参数。
-
选择 Add(添加)。
-
-
当添加您的容器时,请选择 Create (创建)。