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

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

排除 Amazon Batch 的故障

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

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

Amazon Batch

INVALID计算环境

您可能错误地配置了托管计算环境。如果你这样做了,计算环境就会进入一种INVALID状态,无法接受职位空缺。以下部分描述了可能的原因以及如何根据原因进行故障排除。

角色名称或 ARN 不正确

计算环境进入INVALID状态的最常见原因是Amazon Batch服务角色或 Amazon EC2 Spot 队列角色的名称或亚马逊资源名称 (ARN) 不正确。这在使用Amazon CLI或Amazon SDK 创建的计算环境中更为常见。在中创建计算环境时Amazon Web Services Management Console,Amazon Batch可帮助您选择正确的服务或 Spot Fleet 角色。但是,假设您手动输入了名称或 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)

对于无效的 Spot 队列角色:

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软件开发工具包时指定 IAM 角色的名称,而不是完整的 Amazon Resource Name (ARN)。根据您创建角色的方式,ARN 可能包含aws-service-role路径前缀。例如,如果您使用中的过程手动创建Amazon Batch服务角色Amazon Batch服务 IAM 角色,则您的服务角色 ARN 可能如下所示。

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

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

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

当您仅在使用Amazon CLI或Amazon软件开发工具包时指定 IAM 角色的名称时,Amazon Batch假定您的 ARN 不使用aws-service-role路径前缀。因此,我们建议您在创建计算环境时为 IAM 角色指定完整 ARN。

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

修复INVALID计算环境

当您的计算环境处于某种INVALID状态时,请对其进行更新以修复无效的参数。对于角色名称或 ARN 不正确,使用正确的服务角色更新计算环境。

修复配置错误的计算环境
  1. 通过 https://console.aws.amazon.com/batch/ 打开Amazon Batch主机。

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

  3. 在导航窗格中,选择 Compute environments

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

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

  6. 选择 Save 以更新您的计算环境。

工作陷入困RUNNABLE

假设您的计算环境包含计算资源,但您的任务进展不会超过该RUNNABLE状态。然后,可能有一些东西阻止了任务实际放置在计算资源上。以下是此问题的一些常见原因:

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

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

资源不足

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

没有 Internet 访问权限,无法获得计算资源

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

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

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

Amazon EC2 实例限制已达到

您的账户可以在中启动的 Amazon EC2 实例数量由您Amazon Web Services 区域的 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 容代理。

有关更多信息,请参阅为什么我的BatcAmazon h 作业停留在 RUNNABLE 状态?Amazon知识中心中。

Spot 实例在创建时未加标签

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

要修复创建时的竞价型实例标记,请按照以下步骤将当前推荐的 IAM 托管策略应用于您的 Amazon EC2 Spot 队列角色。这样,future 使用该角色创建的任何竞价型实例都有权在创建实例时应用实例标签。

将当前的 IAM 托管策略应用于您的 Amazon EC2 Spot 队列角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 选择角色,然后选择您的 Amazon EC2 Spot 队列角色。

  3. 选择 Attach policy(附上策略)。

  4. 选择 A mazoneC2SpotFleetTaggingRole 并选择 “附加政策”。

  5. 再次选择您的 Amazon EC2 Spot 队列角色以删除之前的政策。

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

Spot 实例无法缩减规模

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

AmazoneC2SpotFleetTaggingRole 托管策略附加到您在 Spot Fleet 中的角色中Amazon Web Services Management Console

将当前的 IAM 托管策略应用于您的 Amazon EC2 Spot 队列角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 选择角色,然后选择您的 Amazon EC2 Spot 队列角色。

  3. 选择 Attach policy(附上策略)。

  4. 选择 A mazoneC2SpotFleetTaggingRole 并选择 “附加政策”。

  5. 再次选择您的 Amazon EC2 Spot 队列角色以删除之前的政策。

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

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

示例命令假设您的 Amazon EC2 Spot 队列角色名为 AmazoneC2SpotFleetRole。如果您的角色使用其他名称,请调整命令以使其匹配。

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

    $ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole \ --role-name AmazonEC2SpotFleetRole
  2. 要将 A mazoneC2SpotFleetRole 托管 IAM 策略与您的 A mazoneC2SpotFleetRole 角色分离,请使用运行以下命令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 Agent 后重新启动 ECS 代理。有关更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的 Amazon ECS 容器代理配置

无法改写任务定义资源需求

在传递给 conta inerOverrides 结构的memoryvcpus成员中指定的内存和 vCPU 替代项无法覆盖在作业定义的资源要求结构中指定的内存和 vCPU 要求SubmitJob

如果您尝试改写这些资源需求,您可能会看到以下错误消息:

“此值是以过时的密钥提交的,可能与作业定义的资源要求提供的值相冲突。”

要更正此问题,请在 ContainerOverrides 的资源要求成员中指定内存和 vCPU 要求。例如,如果在以下几行中指定了您的内存和 vCPU 替代项。

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

将它们更改为以下内容:

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

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

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

将它们更改为以下内容:

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

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

使用Amazon Batch API 更新所需的 vCPUs (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值必须介于minvCpusmaxvCpus值之间。

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

Amazon EKS 上的 Amazon Batch

INVALID计算环境

您可能错误地配置了托管计算环境。如果你这样做了,计算环境就会进入一种INVALID状态,无法接受职位空缺。以下部分描述了可能的原因以及如何根据原因进行故障排除。

不支持的Kubernetes版本

如果计算环境是在不支持的Kubernetes版本上创建的,则 AmazAmazon Batch on EKS 会将计算环境状态更改为INVALID。您会看到statusReason参数中设置的错误类似于以下内容:

reason=CLIENT_ERROR - ... EKS Cluster version [1.xx] is unsupported

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

如果您在使用或 UpdateComputeEnvironmentAPI 操作创建或更新计算环境时指定了不支持的KubernetesCreateComputeEnvironment版本,则会看到一条类似于以下内容的错误消息。

At least one imageKubernetesVersion in EC2Configuration is not supported.

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

Amazon Batch在亚马逊上,EKS 目前支持以下Kubernetes版本:

  • 1.24

  • 1.23

  • 1.22

实例配置文件不存在

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

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

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

Kubernetes命名空间无效

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

您会看到在statusReason参数中设置的错误消息,如下所示。

CLIENT_ERROR - Unable to validate Kubernetes Namespace

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

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

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

  • Amazon Batch无权访问亚马逊 EKSKubernetes API 服务器终端节点。

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

已删除计算环境

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

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

节点不加入 Amazon EKS 集群

Amazon Batch在 Amazon EKS 上,如果确定并非所有节点都加入了 Amazon EKS 集群,则会缩小计算环境的规模。Amazon Batch在 Amazon EKS 上向下扩展计算环境时,计算环境状态将更改为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 Batch在亚马逊上 EKS 任务处于停滞RUNNABLE状态

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

要验证配置是否正确,请执行以下操作:aws-authConfigMap

  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:为您的 EKS 集群做准备Amazon Batch:或者,您可以kubectl使用手动编辑aws-authConfigMap。有关更多信息,请参阅 A mazon EKS 用户指南中的启用 IAM 用户和角色访问您的集群

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

要验证配置是否正确,请执行以下操作:aws-authConfigMap

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

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

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

    注意

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

    注意

    您也可以查看 Amazon EKS 控制平面日志。有关更多信息,请参阅 Amazon EKS 用户指南中的 Amazon EKS 控制层面日志

要解决任务卡在RUNNABLE状态下的问题,我们建议您kubectl使用清单重新申请。有关更多信息,请参阅步骤 1:为您的 EKS 集群做准备Amazon Batch:或者,您可以kubectl使用手动编辑aws-authConfigMap。有关更多信息,请参阅 A mazon 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:为您的 EKS 集群做准备Amazon Batch