如何配置Lambda触发S3动态路径上传并避免自调用?
实现S3动态前缀触发Lambda并避免自调用的方案
1. 配置S3动态前缀触发器
在目标S3桶的事件配置中,添加Lambda触发规则:
- 前缀:填写
Project_*/input/,S3的通配符*会匹配任意非/的字符,刚好覆盖Project_0001、Project_0002这类动态项目编号的目录前缀 - 后缀:可选填写
.csv(如果仅需触发CSV文件上传事件) - 事件类型:选择「对象创建(Put)」或「对象创建(所有)」,确保只有文件上传到input目录时才触发Lambda
2. 避免Lambda自调用的核心逻辑
Lambda处理完文件后会写入output目录,为了避免这个写入事件再次触发Lambda,直接在代码开头添加路径判断:
拿到S3对象键后,检查是否包含/output/,如果是则直接终止执行,不处理后续逻辑。
3. Lambda代码示例(Python)
import boto3 import csv from io import StringIO s3 = boto3.client('s3') def lambda_handler(event, context): # 遍历S3事件记录 for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] # 跳过output目录的文件,避免自调用 if '/output/' in key: return # 提取项目前缀(如Project_0001) project_prefix = key.split('/')[0] # 读取input文件内容 response = s3.get_object(Bucket=bucket, Key=key) input_content = response['Body'].read().decode('utf-8') csv_reader = csv.reader(StringIO(input_content)) # 这里替换成你的业务处理逻辑,示例为简单复制内容 output_rows = list(csv_reader) # 构造输出内容 output_content = StringIO() csv_writer = csv.writer(output_content) csv_writer.writerows(output_rows) output_content.seek(0) # 写入对应项目的output目录 output_key = f"{project_prefix}/output/outputs.csv" s3.put_object( Bucket=bucket, Key=output_key, Body=output_content.getvalue() )
4. 权限配置注意事项
确保Lambda的IAM角色包含以下权限:
s3:GetObject:针对桶内Project_*/input/*路径s3:PutObject:针对桶内Project_*/output/*路径
避免给过大的权限范围,同时保证逻辑执行的最小权限需求
内容的提问来源于stack exchange,提问作者Higor Nunes
相关产品推荐
相关产品推荐

