我想知道如何处理 AWS Fargate Spot 任务中的 Spot 终止通知。
解决方法
增加 stopTimeout 值
stopTimeout 参数的默认值为 30 秒。将 task definition(任务定义)中的 stopTimeout 值增加到最大 120 秒,以便容器在强制停止之前有足够的时间退出。如果超过此配额,您会收到 "The stopTimeout value must not exceed 120 seconds." 错误消息。
更新服务定义参数
更新您的 Amazon ECS 服务定义参数。对于 minimumHealthyPercent,输入必须继续运行的任务的最小百分比。对于 maximumPercent,输入部署期间可以运行的任务的最大百分比。
监控您的 Amazon ECS 事件,检查调度器在任务中断时是否查找到新容量。如果调度器无法为新任务查找到容量,则旧任务将在 stopTimeout 之后结束。
更新取消注册延迟值
作为 FARGATE_SPOT 运行的任务使用负载均衡器目标组。这些任务在进入 STOPPED(已停止)状态之前,会一直保持向目标组注册的状态。将目标组取消注册延迟设置为少于 2 分钟,以适配 Spot 终止窗口。
监控竞价型中断和容量置放失败
要监控因任务中断或容量置放失败而导致的 Fargate Spot 终止情况,请使用 Amazon EventBridge 规则。
完成以下步骤:
-
创建 Amazon Simple Notification Service (Amazon SNS) 主题。
-
定义 EventBridge 规则。
-
构建事件模式,然后选择以下选项:
在 Sample events(示例事件)部分中,选择 AWS 事件。
在 Creation method(创建方法)部分中,对于 Method(方法),选择 Custom pattern (JSON editor)(自定义模式(JSON 编辑器))。
-
针对您要监控的问题,添加以下模式之一。
竞价型中断:
{
"source": ["aws.ecs"],
"detail-type": ["ECS Task State Change"],
"detail": {
"stopCode": ["SpotInterruption"],
"clusterArn": ["arn:aws:ecs:REGION:ACCOUNT:cluster/CLUSTER"]
}
}
容量置放失败:
{
"source": ["aws.ecs"],
"detail-type": ["ECS Service Action"],
"detail": {
"eventName": ["SERVICE_TASK_PLACEMENT_FAILURE"],
"clusterArn": ["arn:aws:ecs:REGION:ACCOUNT:cluster/CLUSTER"],
"reason": ["RESOURCE:FARGATE"]
}
}
**注意:**在上述模式中,将 REGION 替换为您的 AWS 区域,将 ACCOUNT 替换为您的 AWS 账户 ID,并将 CLUSTER 替换为您的集群名称。
-
选择 Next(下一步)。
-
选择以下选项来选择您的目标:
对于 Target types(目标类型),选择 AWS service(AWS 服务)。
对于 Select a target(选择目标),选择 SNS。
对于 Topic(主题),选择您的 SNS 主题。
-
选择 Next(下一步)。
-
(可选)添加标签。
-
查看规则配置,然后选择 Create rule(创建规则)。
相关信息
Fargate Spot 终止通知