配合使用 AWS Lambda 和 Amazon S3 - AWS Lambda

配合使用 AWS Lambda 和 Amazon S3

您可以使用 Lambda 处理来自 Amazon Simple Storage Service 的事件通知。在创建或删除对象时,Amazon S3 会向 Lambda 函数发送事件。您在存储桶上配置通知设置,并向 Amazon S3 授予权限来根据函数的基于资源的权限策略调用函数。

警告

如果您的 Lambda 函数使用触发它的同一存储桶,则会导致在一个循环中执行该函数。例如,如果每当上传一个对象,存储桶就触发某个函数,而该函数又上传一个对象给存储桶,则该函数间接触发了自身。为避免这种情况,请使用两个存储桶,或将触发器配置为仅适用于传入对象所用的前缀。

Amazon S3 使用包含有关对象的详细信息的事件异步调用您的函数。以下示例显示了在将部署包上传到 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" } } } ] }

要调用您的函数,Amazon S3 需要来自该函数的基于资源的策略的权限。当您在 Lambda 控制台中配置 Amazon S3 触发器时,该控制台将修改基于资源的策略以允许 Amazon S3 在存储桶名称和账户 ID 匹配时调用函数。如果您在 Amazon S3 中配置通知,请使用 Lambda API 更新策略。您还可以使用 Lambda API 向另一个账户授予权限,或将权限限制到指定的别名。

如果您的函数使用 AWS 开发工具包来管理 Amazon S3 资源,则其执行角色也需要 Amazon S3 权限。