aws lambda函数为单个事件触发多次
aws lambda function triggering multiple times for a single event
我正在使用 aws lambda 函数将存储桶中上传的 wav 文件转换为 mp3 格式,然后将文件移动到另一个存储桶。它工作正常。但是触发有问题。当我上传小的 wav 文件时,lambda 函数被调用一次。但是当我上传一个大尺寸的wav文件时,这个函数会被多次触发
这个问题我google了一下,发现是无状态的,所以会被多次调用(不确定这个触发是多次上传还是一次上传)。
https://aws.amazon.com/lambda/faqs/
有什么方法可以单次上传调用一次这个函数吗?
短版:
尝试在您的 lambda 函数配置中增加超时设置。
长版:
我猜你是 运行 在这里超时的 lambda 函数。
S3 事件本质上是异步的,监听 S3 事件的 lambda 函数在该事件被拒绝之前至少重试 3 次。您提到您的 lambda 函数在您进行转换和重新上传的较小尺寸上传期间仅执行一次(没有错误)。您的代码转换和重新上传所需的时间可能大于您的 lambda 函数的超时设置。
因此,您可能想尝试增加 lambda 函数配置中的超时设置。
顺便说一句,确认您的 lambda 函数被多次调用的一种方法是查看 cloudwatch 日志中的事件 ID (67fe6073-e19c-11e5-1111-6bqw43hkbea3) 出现 -
START RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Version: $LATEST
此事件 ID 表示为其调用了 lambda 的特定事件,并且对于负责同一 S3 事件的所有 lambda 执行应该相同。
此外,您可以在以下标记一个 lambda 执行结束的日志行中查找执行时间 (Duration) -
REPORT RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Duration: 244.10 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 20 MB
即使不是解决方案,它至少会给您一些空间,让您在正确的方向上进行调试。让我知道进展如何。
context
对象包含有关您当前处理的请求 ID 的信息。即使多次触发同一事件,此 ID 也不会更改。您可以在每次事件触发时保存此 ID,然后检查您处理的最后一个 ID 是否与当前 ID 不同。
这是我解决此问题的最终代码(带有 MongooseJS 数据库处理程序的 NodeJS):
exports.handler = function(event, context, lambdaCallback) {
Events.findOneAndUpdate(
{ name: 'some-event-name' },
{ lastRequestId: context.awsRequestId }).then(function(event) {
if(event.lastRequestId == context.awsRequestId) {
return;
}
/* Run the actual job */
...
});
}
希望对您有所帮助!
多次执行 Lambda 的任何事件都是由于 AWS document 中指定的 Lambda 重试行为所致。
您的代码可能会引发异常、超时或 运行 内存不足。 运行 执行代码的时间可能会遇到错误并停止。您可能 运行 无法并发并受到限制。
Lambda 中可能存在一些错误,导致客户端或服务调用 Lambda 函数重试。
使用 CloudWatch 日志查找错误并解决它可以解决问题。
我也遇到了同样的问题,在我的情况下是因为应用程序错误,解决它对我有帮助。
最近 AWS Lambda 有新的 属性 来更改默认的重试性质。在异步调用设置下将重试次数设置为 0(默认为 2)。
在 Lambda 配置中查找“异步调用”,有一个选项“重试次数”,它是函数 returns 出错时重试的最大次数。
这里还可以配置Dead-letter队列服务
我正在使用 aws lambda 函数将存储桶中上传的 wav 文件转换为 mp3 格式,然后将文件移动到另一个存储桶。它工作正常。但是触发有问题。当我上传小的 wav 文件时,lambda 函数被调用一次。但是当我上传一个大尺寸的wav文件时,这个函数会被多次触发
这个问题我google了一下,发现是无状态的,所以会被多次调用(不确定这个触发是多次上传还是一次上传)。
https://aws.amazon.com/lambda/faqs/
有什么方法可以单次上传调用一次这个函数吗?
短版: 尝试在您的 lambda 函数配置中增加超时设置。
长版:
我猜你是 运行 在这里超时的 lambda 函数。
S3 事件本质上是异步的,监听 S3 事件的 lambda 函数在该事件被拒绝之前至少重试 3 次。您提到您的 lambda 函数在您进行转换和重新上传的较小尺寸上传期间仅执行一次(没有错误)。您的代码转换和重新上传所需的时间可能大于您的 lambda 函数的超时设置。
因此,您可能想尝试增加 lambda 函数配置中的超时设置。
顺便说一句,确认您的 lambda 函数被多次调用的一种方法是查看 cloudwatch 日志中的事件 ID (67fe6073-e19c-11e5-1111-6bqw43hkbea3) 出现 -
START RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Version: $LATEST
此事件 ID 表示为其调用了 lambda 的特定事件,并且对于负责同一 S3 事件的所有 lambda 执行应该相同。
此外,您可以在以下标记一个 lambda 执行结束的日志行中查找执行时间 (Duration) -
REPORT RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Duration: 244.10 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 20 MB
即使不是解决方案,它至少会给您一些空间,让您在正确的方向上进行调试。让我知道进展如何。
context
对象包含有关您当前处理的请求 ID 的信息。即使多次触发同一事件,此 ID 也不会更改。您可以在每次事件触发时保存此 ID,然后检查您处理的最后一个 ID 是否与当前 ID 不同。
这是我解决此问题的最终代码(带有 MongooseJS 数据库处理程序的 NodeJS):
exports.handler = function(event, context, lambdaCallback) {
Events.findOneAndUpdate(
{ name: 'some-event-name' },
{ lastRequestId: context.awsRequestId }).then(function(event) {
if(event.lastRequestId == context.awsRequestId) {
return;
}
/* Run the actual job */
...
});
}
希望对您有所帮助!
多次执行 Lambda 的任何事件都是由于 AWS document 中指定的 Lambda 重试行为所致。
您的代码可能会引发异常、超时或 运行 内存不足。 运行 执行代码的时间可能会遇到错误并停止。您可能 运行 无法并发并受到限制。
Lambda 中可能存在一些错误,导致客户端或服务调用 Lambda 函数重试。
使用 CloudWatch 日志查找错误并解决它可以解决问题。
我也遇到了同样的问题,在我的情况下是因为应用程序错误,解决它对我有帮助。
最近 AWS Lambda 有新的 属性 来更改默认的重试性质。在异步调用设置下将重试次数设置为 0(默认为 2)。
在 Lambda 配置中查找“异步调用”,有一个选项“重试次数”,它是函数 returns 出错时重试的最大次数。
这里还可以配置Dead-letter队列服务