AWS Lambda写入S3报错:期望字符串类对象,却得到's3.Bucket'
AWS Lambda写入S3出现TypeError的原因分析与修复
错误本质
TypeError: expected string or bytes-like object, got 's3.Bucket' 是因为你在调用S3写入接口时,把**s3.Bucket对象当成了方法要求的字符串/字节类型参数**传入,最常见的是给Bucket参数传了对象而非桶名。
典型错误代码示例
比如你的代码可能是这样的:
import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('my-bucket-name') # 错误:将s3.Bucket对象传给Bucket参数 s3.put_object(Bucket=bucket, Key='data.csv', Body=csv_data)
两种修复方案
方案1:直接传入桶名字符串
调用S3客户端的方法时,Bucket参数必须是字符串格式的桶名称:
s3.put_object(Bucket='my-bucket-name', Key='data.csv', Body=csv_data)
方案2:使用Bucket对象的内置方法
如果已经初始化了s3.Bucket对象,直接调用它的put_object方法,不需要再传Bucket参数:
bucket.put_object(Key='data.csv', Body=csv_data)
补充说明
- boto3有**资源(Resource)和客户端(Client)**两种模式:资源模式下的
s3.Bucket是桶的抽象实例,调用其方法时无需重复指定桶名;客户端模式下所有操作都需要显式传入字符串类型的桶名称。 - 检查你的Lambda代码最后一行的写入逻辑,确认是否混淆了这两种用法。
内容的提问来源于stack exchange,提问作者DataGuy
相关产品推荐
相关产品推荐

