如何通过Zappa配置Lambda函数为S3上传文件添加指定后缀
Zappa实现S3上传文件自动添加指定后缀方案
你现有配置已经完成了S3事件触发的基础绑定,只需要调整配置、编写业务逻辑即可实现需求,具体步骤如下:
1. 修正zappa_settings.json配置
你现有配置中存在笔误:events下的function字段值为app.hanlder,拼写错误,应为app.handler。修正后的完整配置参考:
{ "dev": { "app_function": "app.handler", "aws_region": "us-east-1", "profile_name": "default", "project_name": "scrapper", "runtime": "python3.8", "s3_bucket": "zappabucket", "keep_warm":false, "apigateway_enabled":false, "events": [{ "function": "app.handler", "event_source": { "arn": "arn:aws:s3:::mybucket", "events": [ "s3:ObjectCreated:*" ] } }] } }
同时需要提前给Zappa自动创建的Lambda执行角色,添加目标S3桶(上述配置中的mybucket)的以下权限:
- s3:GetObject
- s3:PutObject
- s3:DeleteObject
2. 编写S3事件处理逻辑
在项目根目录的app.py文件中编写对应handler函数,实现自动加后缀的逻辑。核心逻辑为:解析S3事件拿到上传的文件信息→判断文件是否已有目标后缀,无后缀则执行重命名(S3无原生重命名接口,需要先复制对象添加后缀,再删除原对象)→逻辑中增加过滤规则避免循环触发。
示例代码如下:
import boto3 import urllib.parse s3 = boto3.client('s3') # 按需求修改目标后缀即可 TARGET_SUFFIX = '.html' def handler(event, context): # 解析S3事件信息 record = event['Records'][0] bucket = record['s3']['bucket']['name'] key = urllib.parse.unquote_plus(record['s3']['object']['key'], encoding='utf-8') # 过滤已有目标后缀的文件,避免循环触发 if key.endswith(TARGET_SUFFIX): return # 过滤文件夹类对象 if key.endswith('/'): return # 生成新文件名 new_key = key + TARGET_SUFFIX # 复制对象到新路径 s3.copy_object( Bucket=bucket, Key=new_key, CopySource={'Bucket': bucket, 'Key': key} ) # 不需要保留原文件则保留此行,需要保留原文件可删除 s3.delete_object(Bucket=bucket, Key=key)
3. 部署验证
配置和代码调整完成后,执行zappa update dev更新已部署的实例,首次部署则执行zappa deploy dev。部署完成后上传一个无对应后缀的文件到mybucket桶,即可验证自动加后缀的功能。
注意事项
- 大文件(超过100MB)建议使用S3分段复制接口,避免Lambda执行超时
- 如果存在多文件批量上传的场景,可适当调整Lambda的超时时间配置
内容的提问来源于stack exchange,提问作者Santiago 43
相关产品推荐
相关产品推荐

