配置AWS Lambda触发同名S3文件时如何读取对应版本内容?
解决S3同名文件并发上传时Lambda读取对应版本内容的问题
问题根源
你已经启用了S3版本控制,两次上传确实生成了两个独立的对象版本,但Lambda默认会读取对象的最新版本,而非触发事件对应的版本。S3的PUT事件通知里其实包含了该次操作生成的版本ID,但如果你的Lambda代码只通过对象键(比如file1.json)调用get_object,不指定版本ID,就会自动拉取最新版本,导致两次触发都读到Content B。
解决方案
修改Lambda代码,从S3事件中提取对应版本的versionId,然后在读取对象时指定这个版本ID,就能拿到该次上传对应的内容。
代码示例(Python)
import boto3 s3_client = boto3.client('s3') def lambda_handler(event, context): # 从事件记录中提取关键信息 record = event['Records'][0]['s3'] bucket = record['bucket']['name'] obj_key = record['object']['key'] version_id = record['object']['versionId'] # 指定版本ID读取对应内容 response = s3_client.get_object( Bucket=bucket, Key=obj_key, VersionId=version_id ) content = response['Body'].read().decode('utf-8') # 后续业务逻辑处理 print(f"版本{version_id}的内容: {content}") return content
注意事项
- 确保Lambda的执行角色拥有
s3:GetObjectVersion权限,否则无法读取指定版本的对象。 - S3并发上传时事件通知的顺序不保证,但每个事件都绑定唯一的版本ID,只要基于事件中的版本ID读取,就能准确获取该次上传的内容,不受顺序影响。
内容的提问来源于stack exchange,提问作者VIJAY KARMANI
相关产品推荐
相关产品推荐

