如何在S3-Lambda-SQS-EC2链路中下载文件名含空格的S3文件
问题根因
S3触发Lambda事件时,事件体中s3.object.key字段为URL编码格式:空格会被编码为+,其余特殊字符会按规则做百分号编码。现有代码未对该字段做解码就直接拼接S3路径发送至SQS,导致EC2端解析得到的对象键包含编码字符,与S3中存储的实际对象键不匹配,调用下载接口时返回404。
修复方案
核心修复逻辑在Lambda侧,对S3事件传递的对象键做标准URL解码即可,无需自定义编码规则,也无需大幅调整现有链路逻辑。
- 在Lambda代码中引入URL解码依赖,修正对象键获取逻辑:
# 代码顶部导入标准库工具 from urllib.parse import unquote_plus import json # 捕获S3事件信息的逻辑调整为 s3_bucket = event['Records'][0]['s3']['bucket']['name'] # 对编码后的对象键做解码,自动还原空格、特殊字符为原始值 s3_key = unquote_plus(event['Records'][0]['s3']['object']['key']) - 原有JSON序列化、发送SQS的逻辑无需修改,此时拼接得到的
s3://路径已经使用原始对象键:# 原有逻辑保持不变即可 sqs_message = json.dumps({'from_s3': 's3://{b}/{k}'.format(b=s3_bucket, k=s3_key)}) # 后续调用SQS发送接口的逻辑正常执行
注意事项
- 不要用简单的
replace('+', ' ')处理key,该方式无法兼容中文、/、特殊符号等其他被百分号编码的字符,使用标准库unquote_plus是处理S3事件对象键的标准方案。 - EC2端现有正则解析逻辑无需调整,修复后从SQS消息中解析得到的
s3_key就是S3中存储的真实键值,直接传入boto3的download_file方法即可正常完成下载。
内容的提问来源于stack exchange,提问作者Stanley Stein
相关产品推荐
相关产品推荐

