为什么这个 AWS Lambda 函数不断从这个 AWS ECS 的 EventBridge 规则循环?

Why does this AWS Lambda function keep looping from this EventBridge rule for AWS ECS?

我有一个 EventBridge 规则,它在其中一个 ECS 任务启动时调用 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 从 Lambda 函数的 event 参数中获取 taskArn。 Lambda 函数可以成功停止 ECS 任务(我从发送命令的结果中收到 200 HTTP 响应代码)。但是,然后再次调用 Lambda 函数并永远重复此过程(我检查了该函数的 CloudWatch 日志)。

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

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

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

如果您的服务指示它应该有 1 个副本,那么如果您终止该任务,该服务将尝试启动一个新的副本,直到它达到所需的数量。出于这个原因,您会看到 returns 一遍又一遍地 activity。

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

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