为什么这个 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 函数。
我有一个 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 函数。