Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWS Lambda函数触发两次_Python_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Python AWS Lambda函数触发两次

Python AWS Lambda函数触发两次,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,我正在使用AWS Lambda函数(用python编写)在对象上传到预设S3 bucket时发送电子邮件。该对象通过AWS PHP SDK上传到S3 bucket中,并使用多部分上传。每当我测试我的代码(在Lambda代码编辑器页面中)时,它似乎工作正常,我只收到一封电子邮件 但是,当通过PHPSDK上传对象时,Lambda函数运行两次并发送两封电子邮件,两封邮件的消息ID都不同。我尝试了不同的电子邮件地址,但每个地址都会收到两封重复的电子邮件 谁能告诉我哪里会出错?我正在使用与示例python

我正在使用AWS Lambda函数(用python编写)在对象上传到预设S3 bucket时发送电子邮件。该对象通过AWS PHP SDK上传到S3 bucket中,并使用多部分上传。每当我测试我的代码(在Lambda代码编辑器页面中)时,它似乎工作正常,我只收到一封电子邮件

但是,当通过PHPSDK上传对象时,Lambda函数运行两次并发送两封电子邮件,两封邮件的消息ID都不同。我尝试了不同的电子邮件地址,但每个地址都会收到两封重复的电子邮件


谁能告诉我哪里会出错?我正在使用与示例python代码一起导入的boto3库来发送电子邮件。

是的,我们也有这个库,它没有链接到电子邮件,而是链接到S3,为一次上载触发多个事件。与许多消息传递系统一样,Amazon不保证从S3“一次性传递”事件通知,因此您的Lambda函数需要自行处理

不是最好的,但可行


某种形式的缓存,包含前几次请求的详细信息,以便您可以查看是否已经处理了特定的事件消息。

我也面临同样的问题,在我的情况下,在S3存储桶中的每个PUT事件上,lambda都应该触发,它使用相同的
aws\u request\u id
aws\u lambda\u arn
触发两次


要解决此问题,请跟踪某个位置的aws请求id(此id对于每个lambda事件都是唯一的),并检查处理程序。如果相同的
aws\u请求\u id
存在,则不执行任何操作,否则将照常处理。

首先请检查您是否没有上载两次。PutObject是否触发lambda?两封重复的电子邮件之间的时差是多少?@helloV该对象确实被上传到S3存储桶一次。在正确发送和接收电子邮件时,PutObject确实会触发lambda。这两封电子邮件的接收间隔正好是两秒钟。如何在Lambda函数中进行缓存?可能使用Redis或DynamoDB之类的工具。缓存需要在Lambda调用之间存活,因此它需要在Lambda函数之外。如何存储x-amz-request-id的值以防止多次触发,第二个触发器触发一个没有可比较变量的新Lambda。除非您建议请求id必须存储在RDS实例中。@Shek要么将id保存在缓存(如Redis)中,要么使用合理的TTL将其存储在DynamoDB中,要么构建一个幂等进程(例如写入数据库,这取决于重复的标识不存在)。