如何解决为什么这个 AWS Lambda 函数会从 AWS ECS 的这个 EventBridge 规则循环?
我有一个 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 函数的 taskArn
参数中获取 event
。 Lambda 函数可以成功停止 ECS 任务(我从发送命令的结果中收到 200 HTTP 响应代码)。但是,随后再次调用 Lambda 函数,并永远重复此操作(我检查了该函数的 CloudWatch 日志)。
我不确定为什么 Lambda 函数会再次启动,因为据我所知,EventBridge 规则不应触发它。
解决方法
您的 Lambda 函数没有问题。是您的 ECS 服务所需的行为!
您的 ECS 服务有一个“期望计数”属性,它指示服务满足期望的状态。
如果您的服务表明它应该有 1 个副本,那么如果您终止该任务,该服务将尝试启动一个新的副本,直到达到所需的数量。出于这个原因,您会看到它一次又一次地恢复活动。
这可能不是终止服务的正确方法。
我要做的是将“所需计数”更改为零,而不使用 lambda 函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。