故障排除 Amazon Batch - Amazon Batch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

故障排除 Amazon Batch

可能需要排除与计算环境、作业队列、作业定义或作业相关的问题。本章介绍如何排除和解决Amazon Batch环境中的此类问题。

Amazon Batch使用 IAM 策略、角色和权限,并在 Amazon EC2、Amazon ECS、Amazon Fargate和 Amazon Elastic Kubernetes Service 基础架构上运行。要解决与这些服务相关的问题,请参阅以下内容:

Amazon Batch

INVALID 计算环境

您可能错误地配置了托管计算环境。如果是这样,计算环境就会进入INVALID状态,无法接受作业放置。以下各节描述了可能的原因以及如何根据原因进行故障排除。

角色名称或 ARN 不正确

计算环境进入INVALID状态的最常见原因是Amazon Batch服务角色或 Amazon EC2 竞价型实例集角色的名称或 Amazon 资源名称(ARN)不正确。这种情况在使用Amazon CLI或Amazon SDK 创建的计算环境中更为常见。在Amazon Web Services Management Console中创建计算环境时,Amazon Batch可以帮助您选择正确的服务或竞价型实例集角色。但是,假设您手动输入了名称或 ARN,但输入不正确。然后,生成的计算环境也是INVALID

但是,假设在Amazon CLI命令或 SDK 代码中手动输入 IAM 资源的名称或 ARN。在这种情况下,Amazon Batch无法验证字符串。相反,Amazon Batch必须接受坏值并尝试创造环境。如果Amazon Batch创建环境失败,环境将进入INVALID状态,并出现以下错误。

对于无效的服务角色:

CLIENT_ERROR - Not authorized to perform sts:AssumeRole (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: dc0e2d28-2e99-11e7-b372-7fcc6fb65fe7)

对于无效的竞价型实例集角色:

CLIENT_ERROR - Parameter: SpotFleetRequestConfig.IamFleetRole is invalid. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidSpotFleetRequestConfig; Request ID: 331205f0-5ae3-4cea-bac4-897769639f8d) Parameter: SpotFleetRequestConfig.IamFleetRole is invalid

导致此问题的常见原因之一是以下情况。只能在使用Amazon CLI或Amazon SDK 时,指定一个 IAM 角色的名称,而不指定完整的 Amazon 资源名称(ARN)。根据创建角色的方式,ARN 可能包含aws-service-role路径前缀。例如,如果使用将服务相关角色用于 Amazon Batch中的程序手动创建Amazon Batch服务角色,服务角色 ARN 可能如下所示。

arn:aws:iam::123456789012:role/AWSBatchServiceRole

但是,如果在控制台首次运行向导中创建了服务角色,则服务角色 ARN 可能如下所示。

arn:aws:iam::123456789012:role/aws-service-role/AWSBatchServiceRole

如果将 AWS Batch 服务级别策略 (AWSBatchServiceRole) 附加到非服务角色,也会出现此问题。例如,在这种情况下,可能会收到类似于以下内容的错误消息:

CLIENT_ERROR - User: arn:aws:sts::account_number:assumed-role/batch-replacement-role/aws-batch is not authorized to perform: action on resource ...

要解决该问题,可以执行下列操作之一:

  • 创建Amazon Batch计算环境时,请为服务角色使用空字符串。

  • 采用以下格式指定服务角色:arn:aws:iam::account_number:role/aws-service-role/batch.amazonaws.com/AWSServiceRoleForBatch

使用Amazon CLI或Amazon SDK 时,如果只指定 IAM 角色的名称,Amazon Batch将假定 ARN 不使用aws-service-role路径前缀。因此,我们建议在创建计算环境时为 IAM 角色指定完整 ARN。

要修复以这种方式错误配置的计算环境,请参阅修复INVALID计算环境

修复INVALID计算环境

当拥有处于INVALID状态的计算环境时,请更新它以修复无效参数。对于角色名称或 ARN 不正确,可以使用正确的服务角色更新计算环境。

修复配置错误的计算环境
  1. 打开Amazon Batch控制台,地址:https://console.aws.amazon.com/batch/

  2. 从导航栏中,选择要使用的Amazon Web Services 区域。

  3. 在导航窗格中,选择计算环境

  4. 计算环境页面上,选择要编辑的计算环境旁边的单选按钮,然后选择编辑

  5. 更新计算环境页面上,对于服务角色,请选择要用于计算环境的 IAM 角色。Amazon Batch控制台仅显示与计算环境具有正确信任关系的角色。

  6. 选择保存以更新计算环境。

作业在RUNNABLE状态卡住

假设计算环境包含计算资源,但作业不会超出RUNNABLE状态。然后,可能有一些因素阻碍了将作业实际放置在计算资源上。以下是此问题的一些常见原因:

计算资源上未配置awslogs日志驱动程序

Amazon Batch作业将其日志信息发送到 CloudWatch 日志。为了做到这一点,必须将计算资源配置为使用awslogs日志驱动程序。假设计算资源 AMI 基于 Amazon ECS 优化 AMI(或 Amazon Linux)。然后,该驱动程序默认会注册到ecs-init软件包中。假设现在使用的是不同的基础 AMI。然后,必须验证在启动 Amazon ECS 容器代理时,是否使用ECS_AVAILABLE_LOGGING_DRIVERS环境变量将awslogs日志驱动程序指定为可用的日志驱动程序。有关更多信息,请参阅计算资源 &AMI; 规范创建计算资源 &AMI;

资源不足

如果作业定义指定的 CPU 或内存资源超出可分配的计算资源量,则作业将永远不会被放置。例如,假设作业指定了 4 GiB 的内存,而计算资源少于可用内存。那么,作业就不能放置在这些计算资源上。在这种情况下,必须减少作业定义中指定的内存,或者向环境中添加更大的计算资源。为 Amazon ECS 容器代理和其他关键系统进程保留了部分内存。有关更多信息,请参见 计算资源内存管理

无法通过互联网访问计算资源

计算资源需要访问才能与 Amazon ECS 服务端点通信。这可以通过接口 VPC 端点或具有公共 IP 地址的计算资源实现。

有关接口 VPC 端点的更多信息,请参阅 Amazon Elastic Container Service 开发人员指南中的 Amazon ECS 接口 VPC 端点(Amazon PrivateLink)

如果没有配置接口 VPC 端点,并且计算资源没有公共 IP 地址,则必须使用网络地址转换 (NAT) 来提供这种访问。有关更多信息,请参阅《Amazon VPC 用户指南》中的。有关更多信息,请参见 创建 VPC

已达到 Amazon EC2 实例限制

账户在Amazon Web Services 区域中可以启动的 Amazon EC2 实例数量由 EC2 实例配额确定。某些实例类型也有配 per-instance-type额。有关账户的 Amazon EC2 实例配额(包括如何请求提高限制)的更多信息,请参阅《Amazon EC2 用户指南(适用于 Linux 实例)》中的 Amazon EC2 服务限制

未安装 Amazon ECS 容器代理

必须将 Amazon ECS 容器代理安装在亚马逊机器映像(AMI)上才能使Amazon Batch运行作业。Amazon ECS 容器代理默认安装在 Amazon ECS 优化 AMI 上。有关 Amazon ECS 容器代理的更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的 Amazon ECS 容器代理

有关更多信息,请参阅 Amazon 知识中心中的为什么我的 Amazon 批处理作业卡在 RUNNABLE 状态?

创建时未标记的竞价型实例

从 2017 年 10 月 25 日起支持对Amazon Batch计算资源标记竞价型实例。以前,Amazon EC2 竞价型实例角色的推荐 IAM 托管策略 (AmazonEC2SpotFleetRole) 不包含在启动时标记竞价型实例的权限。推荐使用的新 IAM 托管策略称为AmazonEC2SpotFleetTaggingRole。它支持在启动时标记竞价型实例。

要修复创建竞价型实例时的标记问题,请按照以下步骤将当前推荐的 IAM 托管策略应用到 Amazon EC2 竞价型实例集角色。这样,今后使用该角色创建的任何竞价型实例在创建时都有权限应用实例标签。

要将当前 IAM 托管策略应用于 Amazon EC2 竞价型实例集角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 选择角色,然后选择 Amazon EC2 竞价型实例集角色。

  3. 选择附上策略

  4. 选择 AmazonEC2 SpotFleetTaggingRole 并选择附加策略

  5. 再次选择 Amazon EC2 竞价型实例集角色,以移除以前的策略。

  6. 选择 AmazonEC2 SpotFleetRole 政策右侧的 x,然后选择 “分离”。

竞价型实例无法缩减

Amazon Batch2021 年 3 月 10 日推出了AWSServiceRoleForBatch与服务相关的角色。如果在计算环境的serviceRole参数中未指定任何角色,则此服务相关角色将用作服务角色。但是,假设在 EC2 竞价计算环境中使用服务相关角色,但使用的竞价角色不包括 AmazonEC2 SpotFleetTaggingRole 托管策略。这样,竞价型实例就不会缩减。因此,您将收到一条错误信息,内容如下:“您无权执行此操作”。使用以下步骤更新spotIamFleetRole参数中使用的竞价型实例集角色。有关更多信息,请参阅《IAM 用户指南》中的使用服务相关角色创建将权限委托给Amazon服务的角色

AmazonEC2 SpotFleetTaggingRole 托管策略附加到您的 Spot 队列角色中 Amazon Web Services Management Console

要将当前 IAM 托管策略应用于 Amazon EC2 竞价型实例集角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 选择角色,然后选择 Amazon EC2 竞价型实例集角色。

  3. 选择附上策略

  4. 选择 AmazonEC2 SpotFleetTaggingRole 并选择附加策略

  5. 再次选择 Amazon EC2 竞价型实例集角色,以移除以前的策略。

  6. 选择 AmazonEC2 SpotFleetRole 政策右侧的 x,然后选择 “分离”。

AmazonEC2 SpotFleetTaggingRole 托管策略附加到您的 Spot 队列角色中 Amazon CLI

示例命令假设您的 Amazon EC2 竞价队列角色名为 AmazonEC2 SpotFleetRole。如果角色使用不同的名称,请调整命令以使其匹配。

AmazonEC2 SpotFleetTaggingRole 托管策略附加到您的 Spot 队列角色
  1. 要将 AmazonEC2 SpotFleetTaggingRole 托管 IAM 策略附加到您的 AmazonEC2 SpotFleetRole 角色,请使用运行以下命令。Amazon CLI

    $ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole \ --role-name AmazonEC2SpotFleetRole
  2. 将 AmazonEC2 SpotFleetRole 托管 IAM 策略与您的 A mazonEC2 SpotFleetRole 角色分离,请使用运行以下命令。Amazon CLI

    $ aws iam detach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetRole \ --role-name AmazonEC2SpotFleetRole

无法检索 Secrets Manager 密文

如果将 AMI 与早于 1.16.0-1 版本的 Amazon ECS 代理一起使用,则必须使用 Amazon ECS 代理配置变量ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true才能使用此功能。可以在创建新容器实例时将其添加到该实例的./etc/ecs/ecs.config文件中。或者,可以将其添加到现有实例。如果将其添加到现有实例中,则必须在添加 ECS 代理后重新启动 ECS 代理。有关更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的 Amazon ECS 容器代理配置

无法覆盖作业定义资源需求

在传递给的 C ontainerOverrides 结构memoryvcpus成员中指定的内存和 vCPU 覆盖不能覆盖任务定义的 ResourceRequiredes 结构中指定的内存和 vCPU 要求。SubmitJob

如果尝试覆盖这些资源需求,可能会出现以下错误消息:

“此值是在已弃用的密钥中提交的,可能与作业定义的资源需求提供的值冲突。”

要更正此问题,请在 containerOverridesresourceRequirements 成员中指定内存和 vCPU 需求。例如,如果在以下行中指定了内存和 vCPU 替代项。

"containerOverrides": { "memory": 8192, "vcpus": 4 }

将其更改为以下内容:

"containerOverrides": { "resourceRequirements": [ { "type": "MEMORY", "value": "8192" }, { "type": "VCPU", "value": "4" } ], }

对作业定义的 containerProperties 对象中指定的内存和 vCPU 需求进行相同的更改。例如,如果在以下几行中指定了内存和 vCPU 需求。

{ "containerProperties": { "memory": 4096, "vcpus": 2, }

将其更改为以下内容:

"containerProperties": { "resourceRequirements": [ { "type": "MEMORY", "value": "4096" }, { "type": "VCPU", "value": "2" } ], }

更新desiredvCpus设置时出现错误消息

使用Amazon Batch API 更新所需的 vCPU (desiredvCpus) 设置时会出现以下错误消息。

Manually scaling down compute environment is not supported. Disconnecting job queues from compute environment will cause it to scale-down to minvCpus.

如果更新的desiredvCpus值小于当前desiredvCpus值,则会出现此问题。更新desiredvCpus值时,必须满足以下两个条件:

  • desiredvCpus值必须介于minvCpus值和maxvCpus值之间。

  • 更新的desiredvCpus值必须大于或等于当前的desiredvCpus值。

Amazon EKS 上的Amazon Batch

INVALID 计算环境

您可能错误地配置了托管计算环境。如果是这样,计算环境就会进入INVALID状态,无法接受作业放置。以下各节描述了可能的原因以及如何根据原因进行故障排除。

不支持的Kubernetes版本

当使用 CreateComputeEnvironment API 操作或 UpdateComputeEnvironmentAPI 操作以创建或更新计算环境时,可能会看到类似于以下内容的错误消息。如果在EC2Configuration中指定不受支持的Kubernetes版本,则会出现此问题。

At least one imageKubernetesVersion in EC2Configuration is not supported.

要解决此问题,请删除计算环境,然后使用支持的Kubernetes版本重新创建。

可以在 Amazon EKS 集群上执行次要版本升级。例如,即使不支持次要版本,也可以将集群从1.xx升级到1.yy

但是,主要版本更新后,计算环境的状态可能会更改为INVALID。例如,如果将主要版本从1.xx升级到2.yy。如果主要版本不受Amazon Batch支持,则会出现类似于以下内容的错误消息。

reason=CLIENT_ERROR - ... EKS Cluster version [2.yy] is unsupported

要解决此问题,请在使用 API 操作创建或更新计算环境时指定支持的Kubernetes版本。

Amazon EKS 上的Amazon Batch目前支持以下Kubernetes版本:

  • 1.28

  • 1.27

  • 1.26

  • 1.25

  • 1.24

  • 1.23

  • 1.22

实例配置文件不存在

如果指定的实例配置文件不存在,则 Amazon EKS 上的Amazon Batch计算环境状态将更改为INVALID。在statusReason参数中会出现类似于以下内容的错误集。

CLIENT_ERROR - Instance profile arn:aws:iam::...:instance-profile/<name> does not exist

要解决此问题,请指定或创建有效的实例配置文件。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 节点 IAM 角色

Kubernetes命名空间无效

如果 Amazon EKS 上的Amazon Batch无法验证计算环境的命名空间,则计算环境状态将更改为INVALID。例如,如果命名空间不存在,则可能会出现此问题。

statusReason参数中会出现类似于以下内容的错误消息集。

CLIENT_ERROR - Unable to validate Kubernetes Namespace

在满足以下任一条件时,可能出现此问题:

  • CreateComputeEnvironment调用中的Kubernetes命名空间字符串不存在。有关更多信息,请参阅CreateComputeEnvironment

  • 管理命名空间所需的基于角色的访问控制 (RBAC) 权限配置不正确。

  • Amazon Batch无权访问 Amazon EKS Kubernetes API 服务器端点。

要解决此问题,请参阅验证aws-auth ConfigMap是否配置正确。。有关更多信息,请参阅开始使用 Amazon EKS 上的 Amazon Batch

已删除的计算环境

假设在删除 Amazon EKS 计算环境上连接的Amazon Batch之前删除了 Amazon EKS 集群。然后,计算环境状态更改为INVALID。在这种情况下,如果使用相同的名称重新创建 Amazon EKS 集群,则计算环境将无法正常运行。

要解决此问题,请删除 Amazon EKS 上的Amazon Batch计算环境,然后重新创建。

节点未加入 Amazon EKS 集群

如果计算环境确定并非所有节点都加入了 Amazon EKS 集群,则 Amazon EKS 上的Amazon Batch会缩减计算环境。当 Amazon EKS 上的Amazon Batch缩减计算环境时,计算环境的状态将更改为INVALID

注意

Amazon Batch不会立即更改计算环境状态以便调试问题。

statusReason参数中会出现类似于以下内容的错误消息集:

Your compute environment has been INVALIDATED and scaled down because none of the instances joined the underlying ECS Cluster. Common issues preventing instances joining are the following: VPC/Subnet configuration preventing communication to ECS, incorrect Instance Profile policy preventing authorization to ECS, or customized AMI or LaunchTemplate configurations affecting ECS agent.

Your compute environment has been INVALIDATED and scaled down because none of the nodes joined the underlying EKS Cluster. Common issues preventing nodes joining are the following: networking configuration preventing communication to EKS Cluster, incorrect EKS Instance Profile or Kubernetes RBAC policy preventing authorization to EKS Cluster, customized AMI or LaunchTemplate configurations affecting EKS/Kubernetes node bootstrap.

使用默认 Amazon EKS AMI 时,导致此问题的最常见原因如下:

Amazon EKS 作业上的Amazon Batch停留在RUNNABLE状态

使用eksctl创建托管节点组时或创建节点组时自动创建aws-authConfigMap并应用于集群。最初创建的aws-authConfigMap目的是允许节点加入集群。但是,也可以使用aws-authConfigMap为用户和角色添加基于角色的访问控制 (RBAC)。

验证aws-auth ConfigMap是否配置正确。

  1. 检索aws-authConfigMap中的映射角色:

    $ kubectl get configmap -n kube-system aws-auth -o yaml
  2. 验证roleARN是否按以下方式配置。

    rolearn: arn:aws:iam::aws_account_number:role/AWSServiceRoleForBatch

    注意

    还可以查看 Amazon EKS 控制面板日志。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 控制面板日志

要解决作业停留在RUNNABLE状态的问题,建议使用kubectl重新应用清单。有关更多信息,请参见 第 1 步:为 Amazon Batch 准备好 EKS 集群。或者,可以kubectl使用手动编辑aws-authConfigMap。有关更多信息,请参阅《Amazon EKS 用户指南》中的启用 IAM 用户和您的集群的角色访问权限

验证aws-auth ConfigMap是否配置正确。

验证aws-auth ConfigMap是否配置正确。

  1. 检索aws-auth ConfigMap中的映射角色。

    $ kubectl get configmap -n kube-system aws-auth -o yaml
  2. 验证roleARN是否按以下方式配置。

    rolearn: arn:aws:iam::aws_account_number:role/AWSServiceRoleForBatch

    注意

    已从服务相关角色的 ARN 中删除路径aws-service-role/batch.amazonaws.com/。这是因为 aws-auth 配置映射存在问题。有关更多信息,请参阅aws-authconfigmap中带路径的角色在其 ARN 中包含路径时不起作用

    注意

    还可以查看 Amazon EKS 控制面板日志。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 控制面板日志

要解决作业停留在RUNNABLE状态的问题,建议使用kubectl重新应用清单。有关更多信息,请参见 第 1 步:为 Amazon Batch 准备好 EKS 集群。或者,可以kubectl使用手动编辑aws-authConfigMap。有关更多信息,请参阅《Amazon EKS 用户指南》中的启用 IAM 用户和您的集群的角色访问权限

RBAC 权限或绑定配置不正确

如果遇到任何 RBAC 权限或绑定问题,请验证aws-batchKubernetes角色是否可以访问Kubernetes命名空间:

$ kubectl get namespace namespace --as=aws-batch
$ kubectl auth can-i get ns --as=aws-batch

还可以使用kubectl describe命令查看集群角色或Kubernetes命名空间的授权。

$ kubectl describe clusterrole aws-batch-cluster-role

下面是示例输出。

Name: aws-batch-cluster-role Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- configmaps [] [] [get list watch] nodes [] [] [get list watch] pods [] [] [get list watch] daemonsets.apps [] [] [get list watch] deployments.apps [] [] [get list watch] replicasets.apps [] [] [get list watch] statefulsets.apps [] [] [get list watch] clusterrolebindings.rbac.authorization.k8s.io [] [] [get list] clusterroles.rbac.authorization.k8s.io [] [] [get list] namespaces [] [] [get]
$ kubectl describe role aws-batch-compute-environment-role -n my-aws-batch-namespace

下面是示例输出。

Name: aws-batch-compute-environment-role Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [create get list watch delete patch] serviceaccounts [] [] [get list] rolebindings.rbac.authorization.k8s.io [] [] [get list] roles.rbac.authorization.k8s.io [] [] [get list]

要解决此问题,请重新应用 RBAC 权限和rolebinding命令。有关更多信息,请参阅 第 1 步:为 Amazon Batch 准备好 EKS 集群