如何对 Amazon ECS 中的“unable to pull secrets or registry auth”(无法提取密钥或注册表身份验证)错误进行故障排除?
我在启动 Amazon Elastic Container Service (Amazon ECS) 任务时收到了以下错误之一: ResourceInitializationError: 无法提取密钥或注册表身份验证: 提取命令失败: : 信号: 终止 ResourceInitializationError: 无法提取密钥或注册表身份验证: 执行资源检索失败: 无法从 asm 检索密钥: 服务调用已重试
简短描述
AWS Fargate 平台版本 1.4.0 使用任务弹性网络接口提取映像和密钥。所有网络流量都流经 Amazon Virtual Private Cloud (Amazon VPC) 内的弹性网络接口。您可以通过 Amazon VPC 流日志查看此流量。但是,任务使用您的网络配置,而不使用 Fargate 拥有的弹性网络接口。这是因为弹性网络接口放置于您的 Amazon VPC 中。
Amazon ECS 容器代理使用任务执行 AWS Identity and Access Management (IAM) 角色从 AWS Systems Manager Parameter Store 或 AWS Secrets Manager 中获取信息。如果您使用客户托管式 AWS Key Management Service (AWS KMS) 密钥对 Systems Manager Parameter Store 或 Secrets Manager 中的数据进行加密,则必须向任务执行 IAM 角色授予执行以下操作的权限:ssm:GetParameters、secretsmanager:GetSecretValue 和kms:Decrypt。
解决方法
检查您的子网到互联网的路由
如果您在公有子网中有 Fargate 任务,请验证您的任务是否有已分配的公有 IP 地址和通往互联网网关的默认路由(0.0.0.0/0)。启动新任务或创建新服务时,请确保启用自动分配公有。如果您在公有子网中使用 Secrets Manager 或 Systems Manager VPC 终端节点,并且在 Amazon VPC 的 DHCP 选项设置中启用了 AmazonProvidedDNS,则 Amazon VPC 终端节点将用于访问 Secrets Manager 或 Systems Manager,而不是公有子网中的互联网网关。
注意: 您无法为现有任务启用此选项。对于现有服务,您无法使用 AWS 管理控制台启用此选项。但是,您可以使用 AWS Command Line Interface (AWS CLI) 来重新配置现有服务。如果您使用 AWS CloudFormation 堆栈创建了 Amazon ECS 服务,则可以通过修改 AWS:ECS:Service 的 NetworkConfiguration 属性来更新该服务。
如果您在私有子网中有 Fargate 任务,请验证您的任务是否有通往 NAT 网关、AWS PrivateLink 或其他互联网连接来源的默认路由(0.0.0.0/0)。
- 如果您使用 NAT 网关,请将 NAT 网关放置于公有子网中。有关详细信息,请参阅使用互联网网关和 NAT 网关的架构。
- 如果您使用 PrivateLink,请确保您的 Fargate 基础设施可以使用您的 Amazon VPC 终端节点的安全组。
- 如果您使用自定义域名服务器,请确保 DNS 查询使用 UDP 和 TCP 协议在端口 53 上具有出站访问权限,在端口 443 上具有 HTTPS 访问权限。
检查您的网络 ACL 和安全组设置
验证您的网络访问控制列表(ACL)和安全组是否不会阻止从子网对端口 443 的出站访问。有关更多信息,请参阅您的 VPC 的安全组。
注意: Fargate 任务必须对端口 443 具有出站访问权限,才能允许传出流量并访问 Amazon ECS 终端节点。
检查您的 Amazon VPC 终端节点
如果您使用 PrivateLink,请确保您创建了所需的终端节点。
Fargate 平台版本 1.4.0 或更高版本所需的终端节点如下:
- com.amazonaws.region.ecr.dkr
- com.amazonaws.region.ecr.api
- S3 网关终端节点
- com.amazonaws.region.logs
有关更多信息,请参阅 Amazon ECR VPC 终端节点的注意事项。
注意: 如果您的任务定义使用 Secrets Manager、Systems Manager 参数或 Amazon CloudWatch Logs,则可能需要定义终端节点。有关更多信息,请参阅使用带有 VPC 终端节点的 Secrets Manager、为 Amazon ECS 创建 VPC 终端节点和使用带有接口 VPC 终端节点的 CloudWatch Logs。
如果您使用 PrivateLink,请确保附加到 Amazon VPC 终端节点的安全组允许来自 TCP 端口 443 上的 Fargate 任务安全组或 Fargate 任务 VPC CIDR 范围的流量。
检查 VPC 终端节点策略和 Amazon Simple Storage Solution (Amazon S3) 的终端节点策略,以确保允许 Fargate 基础设施访问服务。
检查您的 IAM 角色和权限
任务执行角色向 Amazon ECS 容器和 Fargate 代理授予所需的权限,以为任务进行 API 调用。在您执行以下操作时,Fargate 需要此角色:
- 从 Amazon Elastic Container Registry (Amazon ECR) 中提取容器映像。
- 使用 awslogs 日志驱动程序。
- 使用私有注册表身份验证。
- 使用 Secrets Manager 密钥或 Systems Manager Parameter Store 参数引用敏感数据。
如果您的使用案例涉及前述任何方案,请确保您拥有在任务执行角色中定义的所需权限。有关所需权限的完整列表,请参阅 Amazon ECS 任务执行 IAM 角色。
检查 Amazon ECS 任务定义中引用的敏感信息
检查密钥/参数名称是否与您的 Amazon ECS 任务定义中引用的名称匹配。然后,检查任务定义内的容器定义中的值是否与您的 Amazon ECS 任务定义中的值匹配。有关更多信息,请参阅如何将密钥或敏感信息安全地传递给 Amazon ECS 任务中的容器?
如果 Systems Manager Parameter Store 参数与您要启动的任务位于同一区域中,则可以使用完整 ARN 或密钥的名称。如果参数位于其他区域中,则必须指定完整的 ARN。
要检查 System Manager 参数名称和 ARN,请执行以下操作:
1. 打开 AWS Systems Manager 控制台。
2. 在导航窗格中,选择 Parameter Store(参数存储),然后确认您的 Parameter store name(参数存储名称)。
3. 然后,要获取有关参数的 ARN 信息,请使用 AWS Command Line Interface (AWS CLI) 并运行以下命令:
**注意:**将 name_of_parameter_store_secret 替换为您的 Parameter Store 密钥名称。
$ aws ssm get-parameter —name <name_of_parameter_store_secret> —with-decryption
**注意:**引用 Secrets Manager 密钥的参数不能使用 Parameter Store 版本控制或历史记录功能。有关详细信息,请参阅限制。
相关信息

相关内容
- 已提问 21 天前lg...
- 已提问 5 个月前lg...
- 已提问 4 个月前lg...
- 已提问 6 个月前lg...
- AWS 官方已更新 9 个月前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 3 年前