【问题标题】:Trigger S3 create event触发 S3 创建事件
【发布时间】:2018-03-13 06:07:00
【问题描述】:

我使用 S3 创建事件来触发 AWS-Lambda。如果我的处理失败,我想做一些魔术,然后再次触发“事件”以开始我的处理。到目前为止,我看到的唯一选择是重新上传文件。

我可以在不重新上传文件的情况下“再次”触发事件吗?

我使用 Python 和 boto3。

【问题讨论】:

    标签: events amazon-s3


    【解决方案1】:

    我今天遇到了类似的情况,在文件已经在 S3 中之后,我需要重新触发 Lamda 函数。我的一位同事想出了以下对我们有用的方法:

    1. 安装AWS cli tool
    2. 执行如下操作:

      aws lambda invoke
          --function-name <lambda function name>
          --payload '{
              "Records":[{
                  "s3":{
                      "bucket":{
                          "name":"<bucket name>"
                      },
                      "object":{
                          "key": "<key name>"
                      }
                  }
              }]
          }' outfile
      

    【讨论】:

      【解决方案2】:

      如果不重新上传文件,就不可能再次触发 S3 事件。但是,对于失败的处理事件,如果您使用的是 Lambda,它将根据 FAQ 自动重试 3 次:

      对于 Amazon S3 存储桶通知和自定义事件,AWS Lambda 将 在发生以下情况时尝试执行您的函数三次 代码中的错误情况或超出服务或资源 限制。

      如果您的处理失败并且您希望对重试有更多控制权,您可以改为使用 SQS 来接收 S3 事件。这样,您的应用程序就能够从队列中读取消息,并且如果处理失败/终止,最终将达到可见性超时,并且可以再次处理 SQS 消息。这样您就可以无限期地重试,还可以控制连续重试之间的可见性超时时间。

      如果您正在使用 Lambda 并希望组合使用 SQS,这仍然可以通过安排 Lambda 函数每 5 分钟运行一次并让该 Lambda 函数从队列中读取消息来实现。将此与 Lambda 函数运行时间的 5 分钟限制相结合,您几乎可以连续使用 SQS 队列中的消息。

      【讨论】:

      • 谢谢,如果我重新上传文件。我怎样才能“维持”元数据?将文件移动到另一个存储桶以“重新上传”就足够了吗?
      • 是否也可以选择“手动”创建事件并使用它调用 Lambda?
      【解决方案3】:

      这里没有提到的一种方法是您可以“触摸” S3 对象的元数据,它会触发一个事件。这样您就可以获取事件消息,而无需修改或摆弄原始对象数据。

      注意:元数据字段中的数据不必更改即可触发事件。

      这里有一些策略:

      • 使用可用于触发事件的通用元数据标签
      • 先获取元数据字典,然后用相同的数据发回

      【讨论】:

      • 谢谢我查了。
      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2018-04-06
      • 2019-04-28
      • 1970-01-01
      相关资源
      最近更新 更多