我想解决在 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 任务中的实例元数据,请完成以下步骤:
-
使用 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"
-
按如下方式检索元数据:
对于在 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 凭证时,也会出现此错误。
要解决此错误,请完成下面的步骤:
-
使用 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"
-
检查与您的任务关联的任务 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 页面未找到)错误。
-
确保您的 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 任务角色