本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
故障排除 Amazon Batch
可能需要排除与计算环境、作业队列、作业定义或作业相关的问题。本章介绍如何排除和解决Amazon Batch环境中的此类问题。
Amazon Batch使用 IAM 策略、角色和权限,并在 Amazon EC2、Amazon ECS、Amazon Fargate和 Amazon Elastic Kubernetes Service 基础架构上运行。要解决与这些服务相关的问题,请参阅以下内容:
-
《IAM 用户指南》中的 IAM 故障排除
-
Amazon Elastic Container Service 开发人员指南中的Amazon ECS 故障排除
-
《Amazon EKS 用户指南》中的 Amazon EKS 故障排除
-
《Amazon EC2 用户指南(适用于 Linux 实例)》中的 EC2 实例故障排除
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 不正确,可以使用正确的服务角色更新计算环境。
修复配置错误的计算环境
-
打开Amazon Batch控制台,地址:https://console.aws.amazon.com/batch/
。 -
从导航栏中,选择要使用的Amazon Web Services 区域。
-
在导航窗格中,选择计算环境。
-
在计算环境页面上,选择要编辑的计算环境旁边的单选按钮,然后选择编辑。
-
在更新计算环境页面上,对于服务角色,请选择要用于计算环境的 IAM 角色。Amazon Batch控制台仅显示与计算环境具有正确信任关系的角色。
-
选择保存以更新计算环境。
作业在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 竞价型实例集角色
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
选择角色,然后选择 Amazon EC2 竞价型实例集角色。
-
选择附上策略。
-
选择 AmazonEC2 SpotFleetTaggingRole 并选择附加策略。
-
再次选择 Amazon EC2 竞价型实例集角色,以移除以前的策略。
-
选择 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 竞价型实例集角色
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
选择角色,然后选择 Amazon EC2 竞价型实例集角色。
-
选择附上策略。
-
选择 AmazonEC2 SpotFleetTaggingRole 并选择附加策略。
-
再次选择 Amazon EC2 竞价型实例集角色,以移除以前的策略。
-
选择 AmazonEC2 SpotFleetRole 政策右侧的 x,然后选择 “分离”。
将 AmazonEC2 SpotFleetTaggingRole 托管策略附加到您的 Spot 队列角色中 Amazon CLI
示例命令假设您的 Amazon EC2 竞价队列角色名为 AmazonEC2 SpotFleetRole
。如果角色使用不同的名称,请调整命令以使其匹配。
将 AmazonEC2 SpotFleetTaggingRole 托管策略附加到您的 Spot 队列角色
-
要将 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
-
要将 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 结构memory
和vcpus
成员中指定的内存和 vCPU 覆盖不能覆盖任务定义的 ResourceRequiredes 结构中指定的内存和 vCPU 要求。SubmitJob
如果尝试覆盖这些资源需求,可能会出现以下错误消息:
“此值是在已弃用的密钥中提交的,可能与作业定义的资源需求提供的值冲突。”
要更正此问题,请在 containerOverrides 的 resourceRequirements 成员中指定内存和 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 操作或 UpdateComputeEnvironment
API 操作以创建或更新计算环境时,可能会看到类似于以下内容的错误消息。如果在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 EKS 节点 IAM 角色。
-
子网配置不正确。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS VPC 和子网要求和注意事项。
-
安全组配置不正确。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 安全组要求和注意事项。
注意
在 Personal Health Dashboard (PHD) 中也可能会出现错误通知。
Amazon EKS 作业上的Amazon Batch停留在RUNNABLE
状态
使用eksctl
创建托管节点组时或创建节点组时自动创建aws-auth
ConfigMap
并应用于集群。最初创建的aws-auth
ConfigMap
目的是允许节点加入集群。但是,也可以使用aws-auth
ConfigMap
为用户和角色添加基于角色的访问控制 (RBAC)。
验证aws-auth
ConfigMap
是否配置正确。
-
检索
aws-auth
ConfigMap
中的映射角色:$
kubectl get configmap -n kube-system aws-auth -o yaml
-
验证
roleARN
是否按以下方式配置。rolearn: arn:aws:iam::
aws_account_number
:role/AWSServiceRoleForBatch注意
还可以查看 Amazon EKS 控制面板日志。有关更多信息,请参阅《Amazon EKS 用户指南》中的 Amazon EKS 控制面板日志。
要解决作业停留在RUNNABLE
状态的问题,建议使用kubectl
重新应用清单。有关更多信息,请参见 第 1 步:为 Amazon Batch 准备好 EKS 集群。或者,可以kubectl
使用手动编辑aws-auth
ConfigMap
。有关更多信息,请参阅《Amazon EKS 用户指南》中的启用 IAM 用户和您的集群的角色访问权限。
验证aws-auth ConfigMap
是否配置正确。
验证aws-auth
ConfigMap
是否配置正确。
-
检索
aws-auth
ConfigMap
中的映射角色。$
kubectl get configmap -n kube-system aws-auth -o yaml
-
验证
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-auth
ConfigMap
。有关更多信息,请参阅《Amazon EKS 用户指南》中的启用 IAM 用户和您的集群的角色访问权限。
RBAC 权限或绑定配置不正确
如果遇到任何 RBAC 权限或绑定问题,请验证aws-batch
Kubernetes角色是否可以访问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
-nmy-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 集群。