【问题标题】:Why does this AWS Lambda function keep looping from this EventBridge rule for AWS ECS?为什么此 AWS Lambda 函数不断从 AWS ECS 的此 EventBridge 规则循环?
【发布时间】:2021-07-12 12:38:44
【问题描述】:

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

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

【问题讨论】:

    标签: aws-lambda amazon-ecs aws-sdk-nodejs aws-event-bridge


    【解决方案1】:

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

    您的 ECS 服务有一个属性“desired count”,它指示服务满足所需状态。

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

    杀死服务可能不是正确的方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多