当前位置: 首页 > 知识库问答 >
问题:

当Amazon S3触发Lambda时

羊舌航
2023-03-14

我有一个非常大的文件(估计50MB)。我把这个文件上传到一个S3目录,然后触发一个Lambda函数。我正在使用TransferManager进行S3上传。

我阅读了AWS关于Lambda和S3的文档,它说在S3中创建文件时会触发Lambda函数,但我仍然想知道创建的文件是否意味着文件已完全上载。

我的问题是:由于文件太大,上传会有一点延迟,所以Lambda函数是在文件完全上传之前还是之后触发的?例如:上传大文件时,网络关闭,文件可能会被破坏,那么Lambda功能是否仍会被触发?

共有1个答案

沈博延
2023-03-14

虽然“非常大”是一个相对术语,但S3用于处理比这大得多的文件,所以AWS想到了这一点。Lambda事件将在文件完全创建后触发。

文档对此进行了更详细的描述。

虽然没有明确提及,但文件中说:

Amazon S3通过包含对象详细信息的事件异步调用函数。下面的示例显示了将部署包上载到Amazon S3时Amazon S3发送的事件。

(强调地雷)

由于它包含有关对象的详细信息,包括其大小,因此该对象将被完全上载,否则这将是未知的-以下是一个包含大小的示例事件:

{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "lambda-artifacts-deafc19498e3f2df",
          "ownerIdentity": {
            "principalId": "A3I5XTEXAMAI3E"
          },
          "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
        },
        "object": {
          "key": "b21b84d653bb07b05b1e6b33684dc11b",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }
  ]
}
 类似资料:
  • 但是,如果我的Lambda不期望任何输入,它将自己转到SQS并拉出消息,有输入有意义吗?我是否可以让它无效,或者甚至完全使用其他方法签名(当然,在本例中不实现那个接口)?

  • 我正在试验Dynamo db和lambda,并且在以下流程中遇到问题: Lambda A由put to S3事件触发。它获取对象(一个音频文件),计算其持续时间,并在dynamoDB中为每30秒的段写入一条记录。 Lambda B由DynamoDB触发,从S3下载文件并对Dynamo行中定义的30秒记录进行操作。 我的问题是,当我运行这个流时,函数A通过函数B写入Dynamo所需的所有行 似乎没有

  • 背景: 我正在通过Terraform开发一个自定义AWS github webhook。我使用AWS API网关触发一个AWS Lambda函数,该函数从请求头验证GitHub webhook的sha256签名。如果lambda函数成功验证了请求,我希望通过lambda提供的异步调用目标特性调用子lambda函数。 问题: 即使我已经使用目标子Lambda函数配置了异步调用,但当父Lambda函数

  • 我正在使用AWS Lambda函数(用python编写)在对象上传到预设S3 bucket时发送电子邮件。该对象通过AWS PHP SDK上传到S3 bucket中,并使用多部分上传。每当我测试我的代码(在Lambda代码编辑器页面中)时,它似乎工作得很好,我只收到一封电子邮件。 但是当对象通过PHPSDK上传时,Lambda函数运行两次并发送两封电子邮件,两者都具有不同的消息ID。我尝试了不同的

  • 假设: 让我们假设数据插入DynamoDB的速率是巨大的。 上下文: 在DynamoDB表上启用流,这将触发lambda。lambda读取流记录,并在弹性搜索中对记录进行索引。 问题陈述: 在将记录插入DynamoDB的时间和通过流式记录触发lambda的时间之间存在延迟。这种延迟或滞后不断增加,并且与插入DynamoDB的数据量成正比。 如何找到滞后的位置?是流没有立即触发lambda吗?还是因

  • 我见过许多关于限制Lambda并发执行的SO问题,但没有见过相反的问题。 我需要增加我的并发执行,但有问题。我在SQS队列中触发了一个Lambda。我已经发布了该函数的一个版本,并为它分配了3,000个并发执行(我的限制从默认的1,000增加到了5,000)。 尽管如此,当我运行我的进程时,我看到成千上万的消息在队列中等待,而我的Lambda函数的Monitoring选项卡显示我的“并发执行”从未