0

我有一个 EventBridge 规则,它在其中一个 ECS 任务启动(状态:RUNNING)时调用 Lambda 函数(目标)。Lambda 函数做了一些事情,然后它应该在最后停止 ECS 任务。

我有以下 EventBridge 规则:

{
  "source": ["aws.ecs"],
  "detail-type": ["ECS Task State Change"],
  "detail": {
    "clusterArn": ["<cluster-arn>"],
    "lastStatus": ["RUNNING"],
    "desiredStatus": ["RUNNING"]
  }
}

它调用 Lambda 函数。

以下是 Lambda 函数的简化版本:

import { ECSClient, StopTaskCommand } from "@aws-sdk/client-ecs";

export const handler = async (event, context, callback) => {
    // event has the EventBridge event capture from the AWS ECS Task
    // Do something
    const ecs = new ECSClient({ region: "<region>" })
    var taskArn = event.detail.containers[0].taskArn;
    var stopTask = new StopTaskCommand({
        cluster: "<cluster-arn>",
        reason: "<reason>",
        task: taskArn
    });
    try {
        const data = await ecs.send(stopTask);
    } catch (error) {
        console.log(error)
    }
}

当我启动 ECS 任务时,会调用 Lambda 函数并开始运行。在它完成它应该做的事情后,它会停止调用它的 ECS 任务。aws-sdk我为此使用v3,taskArneventLambda 函数的参数中获取。Lambda 函数可以成功停止 ECS 任务(我从发送命令的结果中收到 200 HTTP 响应代码)。但是,然后再次调用 Lambda 函数,并一直重复此过程(我检查了该函数的 CloudWatch 日志)。

我不确定为什么 Lambda 函数会再次启动,因为据我所知,EventBridge 规则不应该触发它。

4

1 回答 1

1

不是您的 Lambda 函数的问题。是您的 ECS 服务所期望的行为!

您的 ECS 服务有一个属性“期望计数”,它指示服务满足期望的状态。

如果您的服务表明它应该有 1 个副本,那么如果您终止该任务,该服务将尝试启动一个新副本,直到它满足所需的数量。出于这个原因,您会看到它一遍又一遍地恢复活动。

这可能不是终止服务的正确方法。

我要做的是将“所需计数”更改为零,而不使用 lambda 函数。

于 2021-04-17T22:24:19.080 回答