Aws lambda 为什么AWS Lambda函数会从AWS ECS的EventBridge规则中继续循环?

Aws lambda 为什么AWS Lambda函数会从AWS ECS的EventBridge规则中继续循环?,aws-lambda,amazon-ecs,aws-sdk-nodejs,aws-event-bridge,Aws Lambda,Amazon Ecs,Aws Sdk Nodejs,Aws Event Bridge,我有一个EventBridge规则,在其中一个ECS任务启动时(状态:RUNNING),它调用Lambda函数(目标)。Lambda函数做了一些事情,然后在最后应该停止ECS任务 我有以下EventBridge规则: { "source": ["aws.ecs"], "detail-type": ["ECS Task State Change"], "detail": { &q

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

我有以下EventBridge规则:

{
  "source": ["aws.ecs"],
  "detail-type": ["ECS Task State Change"],
  "detail": {
    "clusterArn": ["<cluster-arn>"],
    "lastStatus": ["RUNNING"],
    "desiredStatus": ["RUNNING"]
  }
}
{
“来源”:[“aws.ecs”],
“明细类型”:[“ECS任务状态更改”],
“细节”:{
“clusterArn”:[“”],
“lastStatus”:[“RUNNING”],
“desiredStatus”:[“RUNNING”]
}
}
它调用Lambda函数

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

从“@aws sdk/client ecs”导入{ECSClient,StopTaskCommand};
导出常量处理程序=异步(事件、上下文、回调)=>{
//事件具有来自AWS ECS任务的EventBridge事件捕获
//做点什么
const ecs=new ECSClient({region:})
var taskArn=event.detail.containers[0].taskArn;
var stopTask=new stopTask命令({
群集:“”,
理由:“,
任务:taskArn
});
试一试{
const data=wait ecs.send(stopTask);
}捕获(错误){
console.log(错误)
}
}
当我启动ECS任务时,Lambda函数被调用并开始运行。在完成它应该做的事情之后,它会停止调用它的ECS任务。为此,我使用aws sdk的
v3,从Lambda函数的
event
参数中获取
taskArn
。Lambda函数可以成功停止ECS任务(我从send命令的结果中收到一个200 HTTP响应代码)。但是,Lambda函数会再次被调用,并且会一直重复(我检查了CloudWatch日志中的函数)


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

Lambda函数没有问题。是您ECS服务的理想行为

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

如果您的服务指示它应该有一个副本,那么如果您终止该任务,该服务将尝试启动一个新的副本,直到达到所需的数量。由于这个原因,你看到它一次又一次地恢复活动

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

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