跳至内容

如何解决尝试为 ECS 任务拉取密钥或检索 Amazon ECR 身份验证信息时出现的“ResourceInitializationError”?

4 分钟阅读
0

当我启动 Amazon Elastic Container Service (Amazon ECS) 任务时,我收到 ResourceInitializationError 消息。

简短描述

当您使用 Fargate 启动类型启动 Amazon ECS 任务时,您可能会收到以下错误消息之一:

  • “ResourceInitializationError:无法拉取密钥或注册表身份验证:拉取命令失败:信号:已终止”
  • “ResourceInitializationError:无法拉取密钥或注册表身份验证:执行资源检索失败:无法从 asm 检索密钥:服务调用已重试。”
  • “ResourceInitializationError:无法拉取密钥或注册表身份验证:执行资源检索失败:无法检索 ecr 注册表身份验证:服务调用已重试 3 次: RequestError:发送请求失败,原因是: Post“https://api.ecr..amazonaws.com/”:dial tcp …443:I/O 超时。请检查您的任务网络配置。”
  • “ResourceInitializationError:无法拉取密钥或注册表身份验证:执行资源检索失败:无法从 asm 检索密钥:服务调用已重试 5 次:无法获取密钥 arn:aws:secretsmanager…”
  • “ResourceInitializationError:无法拉取密钥或注册表身份验证:执行资源检索失败:无法从 asm 检索密钥:服务调用已重试 1 次:未能从 Secrets Manager 获取密钥 arn:aws:secretsmanager:<region>:<accountID>:secret:<secretName> : InvalidParameter: 发现 1 个验证错误。–(最小字段大小为 32/ 最大字段大小为 64),GetSecretValueInput.VersionId。”
  • “ResourceInitializationError:无法拉取密钥或注册表身份验证:执行资源检索失败:无法从 asm 检索密钥:服务调用已重试 1 次:未能从 Secrets Manager 获取密钥 rn:aws:secretsmanager:<region>:<accountID>:secret:<secretName> : AccessDeniedException: 用户 arn:aws:sts::<accountID>::assumed-role/<roleName> 未获授权,无法对以下资源执行 secretsmanager:GetSecretValue 操作:rn:aws:secretsmanager:<region>:<accountID>:secret:<secretName> 因为没有基于身份的策略允许 secretsmanager:GetSecretValue 操作状态代码: 400”

AWS Fargate 版本 1.4.0 使用任务弹性网络接口来拉取映像和密钥。所有网络流量都会流经您的 Amazon Virtual Private Cloud (Amazon VPC) 内的网络接口。您可以使用 VPC 流日志来查看流量。但是,任务将使用您的网络配置,因为 Fargate 将网络接口置于您的 Amazon VPC 中。

Amazon ECS 容器代理使用任务执行 AWS Identity and Access Management (IAM) 角色来从 Parameter Store(AWS Systems Manager 的一项功能)和 AWS Secrets Manager 中获取信息。

对于使用客户自主管理型 AWS Key Management Service (AWS KMS) 密钥加密的数据,请向任务执行 IAM 角色授予以下权限:

  • ssm:GetParameters
  • secretsmanager:GetSecretValue
  • kms:Decrypt

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

使用 TroubleshootECSTaskFailedToStart 运行手册

通过 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册,对无法启动的 Amazon ECS 任务进行故障排除。

重要事项:请在您的 ECS 集群资源所在的同一 AWS 区域中使用运行手册。请使用最近失败的任务 ID,以便任务状态清理不会中断分析。如果失败的任务是 Amazon ECS 服务的一部分,请使用服务中最近失败的任务。在运行 Automation 时,失败的任务必须在 ECS:DescribeTasks 中可见。默认情况下,已停止的 ECS 任务会在进入已停止状态后的 1 小时内保持可见。

要运行 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册,请完成以下步骤:

  1. 打开 AWS Systems Manager 控制台
  2. 在导航窗格的变更管理下,选择自动化
  3. 选择执行自动化
  4. 选择 Owned by Amazon(由 Amazon 所有)选项卡。
  5. Automation document(自动化文档)下,在搜索栏中输入 TroubleshootECSTaskFailedToStart
  6. 选择 AWSSupport-TroubleshootECSTaskFailedToStart 卡。
    **注意:**不要选择带有超链接的自动化名称。
  7. 选择 Next(下一步)。
  8. 对于 Execute automation document(执行自动化文档),选择 Simple execution(简单执行)。
  9. Input parameters(输入参数)部分,对于 AutomationAssumeRole,输入允许 Automation 执行操作的角色的 ARN。
    **注意:**请确保服务角色或 IAM 用户或角色拥有运行 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册所需的 IAM 权限。如果未指定 IAM 角色,Automation 将使用运行此运行手册的 IAM 用户或角色的权限。有关如何为 Automation 创建服务角色的信息,请参阅任务 1: 为 Automation 创建服务角色
  10. 对于 ClusterName,输入任务启动失败的集群名称。
  11. 对于 TaskId,输入最近失败的任务的标识。
  12. 选择 Execute(执行)。
    **注意:**执行后,分析结果将填充到 Global output(全局输出)部分。但是,请等待文档状态变为 Success(成功)。此外,请查看 Output(输出)部分中是否有任何异常。

您也可以手动对问题进行故障排除。

检查从您的子网到互联网的路由

如果您的 Fargate 任务位于公有子网中,请验证您是否为该任务分配了公有 IP 地址。此外,请确认任务有通往互联网网关的默认路由 (0.0.0.0/0)。当您启动新任务或创建新服务时,请启用 Auto-assign public(自动分配公有 IP)。

如果您使用 AWS CloudFormation 堆栈创建 Amazon ECS 服务,请修改 AWS::ECS::ServiceNetworkConfiguration 属性来更新该服务。要更新现有服务的配置,请使用 CloudFormation 启用 AssignPublicIp 参数。或者,运行以下 AWS CLI 命令 update-service

aws ecs update-service --service serviceName --region regionName "awsvpcConfiguration={subnets=[subnet-123,subnet-456],securityGroups=[sg-123,sg-456],assignPublicIp=ENABLED}"

**注意:**请将 regionName 替换为您的区域。

如果您使用以下配置,请不要使用公有子网中的互联网网关来访问 Secrets Manager 或 Systems Manager:

  • Secrets Manager 或 Systems Manager VPC 端点位于公有子网中。
  • 您在 Amazon VPC DHCP 设置中启用了 AmazonProvidedDNS

而是使用 Amazon VPC 端点。

**注意:**您无法为现有任务启用 Auto-assign public(自动分配公有 IP)。要重新配置现有服务,请使用 AWS CLI 而不是 AWS 管理控制台。

如果您的 Fargate 任务位于私有子网中,请验证您的任务是否有通往互联网连接源的默认路由 (0.0.0.0/0)。

互联网连接源可以是 NAT 网关、AWS PrivateLink 或自定义域名服务器。

如果您使用 NAT 网关,请将 NAT 网关置于公有子网中。有关详细信息,请参阅使用 AWS Network Firewall 并配有互联网网关和 NAT 网关的架构。如果您使用 PrivateLink,请验证 Amazon VPC 端点的安全组是否允许流量流向 Fargate 任务。如果您使用自定义域名服务器,请确认 DNS 查询的设置。查询必须在端口 53 上具有出站访问权限,且使用 UDP 和 TCP 协议。查询还必须在端口 443 上具有 HTTPS 访问权限。

检查您的网络 ACL 和安全组设置

确认网络访问控制列表和安全组不会阻止子网对端口 443 的出站访问。有关详细信息,请参阅使用安全组控制指向 AWS 资源的流量

**注意:**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

有关更多信息,请参阅 Considerations for Amazon Elastic Container Registry (Amazon ECR) VPC endpoints

**注意:**如果您的任务定义使用 Secrets Manager、Parameter Store 或 Amazon CloudWatch Logs,请务必定义端点。有关详细信息,请参阅使用 AWS Secrets Manager VPC 端点为 Amazon ECS 创建 VPC 端点

对于 PrivateLink,请检查 Amazon VPC 安全组是否允许来自 Fargate 任务安全组或 VPC CIDR 范围的流量通过 TCP 端口 443。

要确认 Fargate 基础设施是否具有服务访问权限,请检查 VPC 端点策略Amazon Simple Storage Service (Amazon S3) 网关端点策略

检查您的 IAM 角色和权限

任务执行角色向 Amazon ECS 容器和 Fargate 代理授予对任务进行 API 调用所需的权限。

当您执行以下操作时,Fargate 需要此任务执行角色:

  • 从 Amazon ECR 拉取容器映像。
  • 使用 awslogs 日志驱动程序。
  • 使用私有注册表身份验证
  • 使用 Secrets Manager 密钥或 Parameter Store 参数来引用敏感数据。

在上述场景中,请在您的任务执行角色中定义所需的权限。当您访问 Secrets Manager 密钥或 Parameter Store 参数以检索敏感数据时,请确认您拥有所需的 secretsmanager:GetSecretValuessm:GetParameters 权限。有关所需权限的列表,请参阅 Secrets Manager 或 Systems Manager 权限

检查 Amazon ECS 任务定义中的敏感数据

检查密钥和参数名称是否与 Amazon ECS 任务定义中的引用名称相匹配。然后,检查容器定义中的值是否与您的 Amazon ECS 任务定义中的值相匹配。有关详细信息,请参阅如何将密钥或敏感信息安全传递到 Amazon ECS 任务中的容器?

确保使用任务定义中指定的相同 ARN 或名称配置密钥或参数。如果资源存在于不同的区域,则必须提供完整的 ARN。

使用 GetSecretValueInput 中的 VersionId 参数来指定检索到的密钥值的版本。如果您不需要特定版本,请删除 VersionId 字段。默认情况下,Secrets Manager 会检索最新版本。

如果 Parameter Store 参数和任务位于同一区域,请使用完整的 ARN 或密钥名称。如果参数存在于不同的区域,则必须指定完整的 ARN。

要检查参数名称和 ARN,请完成以下步骤:

  1. 打开 AWS Systems Manager 控制台
  2. 在导航窗格中,选择 Parameter Store,然后确认您的 Parameter Store 名称。
  3. 要获取参数的 ARN,请运行以下 AWS CLI 命令 get-parameter
    aws ssm get-parameter --name name_of_parameter_store_secret --with-decryption
    **注意:**请将 name_of_parameter_store_secret 替换为您的 Parameter Store 密钥名称。引用 Secrets Manager 密钥的参数不能使用 Parameter Store 版本或历史记录功能。有关详细信息,请参阅限制

相关信息

查看 Amazon ECS 已停止任务错误

Fargate 启动类型的 Amazon ECS 任务联网选项

Amazon ECR 接口 VPC 端点 (AWS PrivateLink)

将 CloudWatch Logs 与接口 VPC 端点配合使用