使用Boto3 S3客户端调用download_file为何出现Lambda任务超时错误
问题解答
1 Object Name的正确写法
存储桶内没有嵌套文件夹的情况下,Object Name就是文件本身的名称DataPump_10000838.zip,你第一种传三个参数的写法符合download_file的API要求,第二种仅传两个参数的写法是错误的,download_file要求必须传入桶名、对象名、本地存储路径三个必填位置参数。
2 超时问题的根因排查
按优先级从高到低排查:
- Lambda默认超时时间过短
你报错显示任务3.06秒就触发超时,Lambda默认超时时间是3秒,只要你的zip包体积稍大,3秒内无法完成下载就会触发该错误。你可以在Lambda配置页把超时时间调整到匹配文件大小的数值,最高可设置为15分钟。 - 下载路径写入权限错误
download_file的第三个参数是本地存储路径,Lambda的运行环境中仅/tmp目录是可写的,你直接写文件名会尝试写入只读的运行工作目录,写入失败会导致进程卡住最终超时。正确的写法应该是:
s3.download_file('testunzipping','DataPump_10000838.zip','/tmp/DataPump_10000838.zip')
- IAM权限配置错误
你提供的s3:GetObject权限策略存在资源配置错误:s3:GetObject是对象级操作,对应的资源ARN必须指定到桶内对象,你当前写的是桶本身的ARN,权限不生效。正确的资源配置应该是:
"Resource": [ "arn:aws:s3:::testunzipping/*" ]
就算你配置了S3FullAccess,也要检查是否有权限边界、资源限制等规则拦截了对象读取操作。
- VPC网络访问限制
如果你的Lambda配置了VPC,默认无法访问公网的S3服务,会导致请求卡住超时。需要给VPC配置S3网关端点,或者给Lambda所在子网配置NAT网关才能正常访问S3。
你提到list_objects可以正常执行,可优先排查前三个问题,前三个是最高概率的触发原因。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

