启动亚 Amazon Elastic Container Service(Amazon ECS)时,我收到“unable to pull secrets or registry auth”错误消息。
概述
当您启动 Amazon ECS 任务时,您收到了以下任一错误消息:
- “ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed”
- “ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried”
AWS Fargate 平台版本 1.4.0 使用任务弹性网络接口来拉取映像和密钥。所有网络流量都流经您的 Amazon Virtual Private Cloud(Amazon VPC)内的弹性网络接口。通过 Amazon VPC 流日志查看此流量。但是,该任务使用您的网络配置,因为弹性网络接口位于您的 Amazon VPC 中。
Amazon ECS 容器代理使用任务执行 AWS Identity and Access Management(IAM)角色来从以下服务获取信息:
- AWS Systems Manager Parameter Store
- AWS Secrets Manager
对于使用客户托管的 AWS Key Management Service(AWS KMS)密钥来加密数据,请向任务执行 IAM 角色授予以下权限:
- ssm:GetParameters
- secretsmanager:GetSecretValue
- kms:Decrypt
解决方案
通过 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册,对无法启动的 Amazon ECS 任务进行故障排除。如果运行手册的输出中未提供建议,请使用下一节中的手动故障排除步骤。
重要事项:
- 在您的 ECS 集群资源所在的 AWS 区域使用运行手册。
- 使用运行手册时,使用最近失败的任务 ID,这样任务状态清理就不会在自动化期间中断分析。如果失败的任务是 Amazon ECS 服务的一部分,则使用服务中最近失败的任务。在自动化执行期间,失败的任务必须在 ECS:DescribeTasks 中可见。默认情况下,已停止的 ECS 任务将在进入已停止状态后的 1 小时内保持可见。
使用 TroubleshootECSTaskFailedToStart 运行手册
要运行 ****AWSSupport-TroubleshootECSTaskFailedToStart 运行手册,请完成以下步骤:
- 打开 AWS Systems Manager 控制台。
- 在导航窗格的变更管理下,选择自动化。
- 选择执行自动化。
- 选择由 Amazon 所有选项卡。
- 在自动化文档下,搜索 TroubleshootECSTaskFailedToStart。
- 选择 AWSSupport-TroubleshootECSTaskFailedToStart 卡。
**注意:**确保选择卡上的单选按钮,而不是超链接的自动化名称。
- 选择下一步。
注意:执行后,分析结果将填充到全局输出部分。但是,请等待文档状态变为成功。此外,请注意输出部分中的任何异常。
- 对于执行自动化文档,选择简单执行。
- 在输入参数部分,对于 AutomationAssumeRole,输入允许 Systems Manager Automation 执行操作的角色的 ARN。
**注意:**确保 AutomationAssumeRole 或 IAM 用户或角色拥有运行 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册所需的 IAM 权限。如未指定 IAM 角色,Systems Manager Automation 将使用运行此运行手册的 IAM 用户或角色的权限。有关如何为 Systems Manager Automation 创建代入角色的详细信息,请参阅任务 1: 为自动化创建服务角色。
- 对于 ClusterName,输入任务启动失败的群集名称。
- 对于 TaskId,请输入最近失败的任务的标识。
- 选择执行。
根据自动化的输出,使用以下任一手动故障排除步骤。
检查从您的子网到互联网的路由
如果您的 Fargate 任务在公有子网中,请验证您的任务是否已分配公有 IP 地址。此外,确认任务有通往互联网网关的默认路由(0.0.0.0/0)。当您启动新任务或创建新服务时,请启用自动分配公有 IP。
如果使用以下配置,则不要使用公有子网中的互联网网关来访问 Secrets Manager 或 Systems Manager。
- Secrets Manager 或 Systems Manager VPC 端点位于公有子网中。
- 您在 Amazon VPC DHCP 设置中启用了 AmazonProvidedDNS。
而是使用 Amazon VPC 端点:
注意:您无法为现有任务启用自动分配公有 IP。要重新配置现有服务,请使用 AWS 命令行界面(AWS CLI)。不要使用 AWS 管理控制台。如果您使用 AWS CloudFormation 堆栈创建 Amazon ECS 服务,请修改 AWS::ECS::Service 的 NetworkConfiguration 属性 来更新该服务。
如果您的 Fargate 任务位于私有子网中,请验证您的任务是否有通往互联网连接源的默认路由(0.0.0.0/0)。
互联网连接源可以是 NAT 网关、AWS PrivateLink 或其他来源。
- 如果您使用 NAT 网关,请将 NAT 网关放置于公有子网中。有关详细信息,请参阅使用互联网网关和 NAT 网关的架构。
- 如果您使用 PrivateLink,请确保您的 Fargate 基础设施可以使用您的 Amazon VPC 端点的安全组。
- 如果您使用自定义域名服务器,请确认 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、Systems Manager 参数或 Amazon CloudWatch Logs,则可能需要定义端点。有关更多信息,请参阅以下文档:
对于 PrivateLink,请检查 Amazon VPC 的安全组是否允许来自 Fargate 任务安全组或位于 TCP 端口 443 上的Fargate 任务 VPC CIDR 范围的流量。
要确认 Fargate 基础设施具有服务访问权限,请检查 VPC 端点策略与 Amazon Simple Storage Service(Amazon S3)的端点策略。
检查您的 IAM 角色和权限
任务执行角色向 Amazon ECS 容器和 Fargate 代理授予对任务进行 API 调用所需的权限。当您执行以下操作时,Fargate 需要此角色:
- Amazon ECR 提取容器镜像。
- 使用 awslogs 日志驱动程序。
- 使用私有注册表身份验证。
- 使用 Secrets Manager 密钥或 Systems Manager Parameter Store 参数来引用敏感数据。
如果您的用例涉及上述任何场景,则在您的任务执行角色中定义所需的权限。有关所需权限的完整列表,请参阅 Amazon ECS 任务执行 IAM 角色。
检查 Amazon ECS 任务定义中引用的敏感信息
**注意:**如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI。
检查密钥和参数名称是否与 Amazon ECS 任务定义中的引用名称相匹配。然后,检查容器定义中值是否与您的 Amazon ECS 任务定义中的值相匹配。有关详细信息,请参阅如何将密钥或敏感信息安全传递到 Amazon ECS 任务中的容器?
如果 Systems Manager Parameter Store 参数和任务位于同一区域,则使用完整的 ARN 或密钥名称。如果参数存在于其他区域,则必须指定完整的 ARN。
要检查 Systems Manager 参数名称和 ARN,请完成以下步骤:
- 打开 AWS Systems Manager 控制台。
- 在导航窗格中,选择 Parameter Store,然后确认您的 Parameter Store 名称。
- 要获取参数的 ARN,请使用 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 版本控制或历史记录功能。有关详细信息,请参阅限制。
相关信息
检查已停止的任务是否有错误