Lambda与S3 Notification集成

本节作为Lambda异步调用的补充实验。S3 Event Notification集成Lambda是比较常见的方案,常见的使用场景有:为上传的图片文件生成缩略图、删除特定文件时触发邮件通知等。

当S3有事件发生(例如上传文件、删除文件)时,可以为S3配置Notification,与SNS/SQS/Lambda等服务集成:

image-20220308205216897

S3事件通知通常在秒级别将消息发送出去,但也可能需要分钟级别。

Demo

本节我们为S3 Event Notification配置集成Lambda,处理新上传的文件:

image-20220402221048471

创建S3:

aws s3 mb s3://${random_chars}-s3-event-with-lambda  # 保证桶名称唯一

创建完成后,更改S3 Event Notifications配置:

image-20220402211957009

下拉到底部,找到Create event notification按钮:

image-20220402212019956

输入Event name, Event types选择Put

image-20220402212114196

Destination选择Lambda类型,并配置成上一节的hello-world函数, 保存配置。:

image-20220402212150831

回到hello-world Lambda页面,查看它的Permissions:

image-20220402212318827

会发现S3自动为Lambda创建了一条Resource based policy, 允许S3 Event来调用Lambda:

image-20220402212335185

更新Lambda代码为:

import json

def lambda_handler(event, context):
    # TODO implement
    print(event)  # 将S3 upload事件打印到控制台

Event Notification测试

回到S3页面,上传本地电脑上的任意一个文件:

image-20220402212424139

回到Lambda的CloudWatch Logs,找到最新的日志流:

image-20220402212514042

在日志流中可以看到上传事件的详细信息:

image-20220402212554721

有了这些信息,我们可以在Lambda中加入更多的逻辑,例如将文件的元数据插入到 DynamoDB,或者对文件进行额外的处理……

image-20220402221808745