搭配使用 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": "DOC-EXAMPLE-BUCKET", "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 許可。