如何解决在 ECS Fargate 任务中使用 AWS SDK 时收到的元数据错误?

2 分钟阅读
0

我想解决在 Amazon Elastic Container Service (Amazon ECS) 中使用 AWS 软件开发工具包 (AWS SDK) 执行 AWS Fargate 任务时收到的元数据错误。

简短描述

根据以下场景,对在 Amazon ECS 中使用 AWS SDK 执行 Fargate 任务时收到的元数据错误进行故障排除:

  • 无法检索 Fargate 任务的实例元数据。
  • 收到 Missing credentials in config or could not load credentials(配置中缺少凭证或无法加载凭证)错误。
  • 间歇性元数据错误
  • 收到来自实例元数据服务的超时错误。

解决方法

无法检索 Fargate 任务的实例元数据

如果您无法检索 Fargate 任务中的实例元数据,请完成以下步骤:

  1. 使用 Amazon ECS Exec 访问任务中的容器:
    **注意:**将 example-clustername 替换为您的集群名称,将 example-taskid 替换为所需的任务 ID,将 example-containername 替换为您的容器名称。

    aws ecs execute-command --cluster $example-clustername \
        --task $example-taskid \
        --container $example-containername \
        --interactive \
        --command "/bin/sh"
  2. 按如下方式检索元数据:
    对于在 Fargate 上使用平台版本 1.4.0 或更高版本的任务,请使用任务元数据端点版本 4

    curl ${ECS_CONTAINER_METADATA_URI_V4}/task

    对于在 Fargate 上使用早于 1.4.0 的平台版本的任务,请使用以下命令:

    curl ${ECS_CONTAINER_METADATA_URI}/task

收到“Missing credentials in config or could not load credentials(配置中缺少凭证或无法加载凭证)”错误

检查您是否收到了以下错误消息或类似信息:

“Missing credentials in config or Could not load credentials from any providers or Fail to retrieve token(配置中缺少凭证或无法从任何提供商加载凭证或无法检索令牌)”

当启动 Fargate 任务时未在其任务定义中添加任务角色时,就会出现此错误。当手动 RunTask API 操作中未指定任务角色覆盖且未提供其他 AWS 凭证时,也会出现此错误。

要解决此错误,请完成下面的步骤:

  1. 使用 Amazon ECS Exec 访问任务中的容器:
    **注意:**将 example-cluster-name 替换为您的集群名称,将 example-task-id 替换为所需的任务 ID,将 example-container-name 替换为您的容器名称。

    aws ecs execute-command --cluster $example-cluster-name \
        --task $example-task-id \
        --container $example-container-name \
        --interactive \
        --command "/bin/sh"
  2. 检查与您的任务关联的任务 AWS Identity and Access Management (IAM) 角色:

    curl -s 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

    输出示例:

    {
      "RoleArn": "arn:aws:iam::ACCOUNT_ID:role/<task_role_name>",
      "AccessKeyId": "XXXXXXXXXXXXXXXXX",
      "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "Token": "IQoJb......",
      "Expiration": "2024-03-29T19:19:25Z"
    }

    **注意:**如果 Fargate 任务在任务定义中没有任务 IAM 角色,则会返回 404 page not found(404 页面未找到)错误。

  3. 确保您的 AWS SDK 在 Fargate 任务应用程序代码中使用容器元数据的默认凭证提供商链。这样便可以从 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 系统环境变量加载凭证。

间歇性元数据错误

访问元数据端点时出现间歇性元数据错误的可能原因如下:

  • 资源耗尽,例如 CPU 和内存利用率过高
  • 同时运行大量线程或进程
  • CPU 峰值
  • 任务卷上的磁盘压力过大,这是由应用程序中运行的密集操作引起的
  • 一种在容器内高频查询的任务元数据服务,这种情况发生在您进行 API 调用时

要解决间歇性元数据错误,请执行以下操作:

  • 在任务定义中使用适量的 CPU 和内存容量配置 Fargate 任务。设置 CloudWatch Container Insights 以跟踪来自容器化应用程序的指标。
  • 使用 CloudWatch Container Insights 和 Amazon ECS 任务元数据端点监控任务存储利用率。检查磁盘利用率并确定是否必须提高该利用率。
  • 降低您的应用程序代码查询任务元数据服务的速率。例如,创建一次 AWS 对象。然后,在应用程序代码中进行后续的 API 调用时重复使用该实例。
  • 使用最新的 AWS SDK 版本。当您进行 API 调用时,较新版本的 AWS SDK 会自动从 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量获取凭证。

收到来自实例元数据服务的超时错误

如果您收到实例元数据服务的超时错误,则说明超过了应用程序代码中定义的超时阈值。当元数据服务请求因缺少 CPU 或内存而排队时,或者有大量正在运行的进程时,就会发生这种情况。

要解决此错误,请执行以下操作:

  • 检查应用程序代码中定义的超时时间。确保为实例元数据服务设置了适当的超时值。
  • 要检索凭证,请进行重试。此外,减少调用元数据服务的频率。
  • 在任务定义中使用适量的 CPU 和内存配置 Fargate 任务。

相关信息

Amazon ECS 任务角色

AWS 官方
AWS 官方已更新 6 个月前