Ken J
Ken J

Reputation: 937

Python Boto3 Lambda Upload Temp File

I'm working on a Lambda that compresses image files in an S3 bucket. I'm able to download the image in the Lambda, compress it as a new file. I'm trying to upload the new file to the same S3 bucket and I keep on getting hit with the following error:

module initialization error: expected string or bytes-like object

Here's the code to upload:

s3 = boto3.client('s3')
s3.upload_file(filename,my_bucket,basename)

Here are the logs from one of the test uploads:

Getting ready to download Giggidy.png
This is what we're calling our temp file: /tmp/tmp6i7fvb6z.png
Let's compress /tmp/tmp6i7fvb6z.png
Compressed /tmp/tmp6i7fvb6z.png to /tmp/tmpmq23jj5c.png
Getting ready to upload /tmp/tmpmq23jj5c.png
File to Upload, filename: /tmp/tmpmq23jj5c.png
Mime Type: image/png
Name in Bucket, basename: tmpmq23jj5c.png
START RequestId: e9062ca9-ed2c-11e9-99ee-e3a40680ga9d Version: $LATEST
module initialization error: expected string or bytes-like object
END RequestId: e9062ca9-ed2c-11e9-99ee-e3a40680ga9d

How can I upload a file within the context of a Lambda?

UPDATE: I've uploaded my code to a gist for review: https://gist.github.com/kjenney/068531ffe01e14bb7a2351dc55592551

I also moved the boto3 client connection up in my script thinking that might be hosing the upload but I still get the same error in the same order. 'process' is my handler function.

Upvotes: 0

Views: 4024

Answers (1)

John Rotenstein
John Rotenstein

Reputation: 269340

Your problem is this line:

client.upload_file(filename,my_bucket,basename)

From the documentation, the format is:

client.upload_file('/tmp/hello.txt', 'mybucket', 'hello.txt')

Note that the bucket name is a string. That's why the error says expected string.

However, your code sets my_bucket as:

my_bucket = s3.Bucket(bucket)

You should use the name of the bucket rather than the bucket object.

Upvotes: 3

Related Questions