Boto 不会将 s3 文件保存到 AWS Lambda 上的光盘
Boto does not save s3 file to disc on AWS Lambda
我正在开发一个模块,该模块从我的 MySQL 数据库中获取有关图像序列的信息,然后使用 boto 库将它们下载到 Lambda 本地。之后,它应该做一些图像处理,但我还没有完成。
我不断收到的错误很奇怪。在(我相信)它下载了第一张图片之后,它说它不存在 file/directory:
Traceback (most recent call last): File "/var/task/module.py", line 41, in lambda_handler key.get_contents_to_filename(string)
File "/var/task/boto/s3/key.py", line 1714, in get_contents_to_filename os.remove(filename) OSError: [Errno 2] No such file or directory: '1.png'
我的代码中的第 41 行位于此处:
# Download and Save all of the cropped images for this company
count = 1
files_list = []
for image in cropped_images:
key = bucket.get_key(image)
string = str(count) + '.png'
key.get_contents_to_filename(string)
files_list.append(string)
count += 1
print("should be done downloading all of the pictures from S3 ...")
这是我目前拥有的模块的完整脚本:
from __future__ import print_function
import json, os
import pymysql
import os, glob, subprocess, boto
from boto.s3.connection import S3Connection
conn = pymysql.connect(host='*******', port=3306, user='*****', passwd='******', db='*******')
cur = conn.cursor()
conn = S3Connection('***************','************************')
bucket = conn.get_bucket('**********')
def upload_file(company_friendly, filepath):
key = bucket.new_key(company_friendly + ".gif")
key.set_contents_from_filename(filepath)
key.set_acl('public-read')
return True
def lambda_handler(event, context):
### Grab Company Friendly from DB ###
cur.execute("SELECT ************ FROM *********** WHERE company_id = %i LIMIT 1" % (event['company_id']))
company_data = cur.fetchone()
company_friendly = company_data[0]
### Grab all snapshots from DB ###
cur.execute("SELECT *********** FROM ************ WHERE company_id = %i ORDER BY date ASC" % (event['company_id']))
snapshot_data = cur.fetchall()
cropped_images = []
for snapshot in snapshot_data:
cropped_images.append(snapshot[0])
### Download and Save all of the cropped images for this company ###
count = 1
files_list = []
for image in cropped_images:
key = bucket.get_key(image)
string = str(count) + '.png'
key.get_contents_to_filename(string)
files_list.append(string) #this makes sure that the animated gif compiles the images in order
count += 1
print("should be done downloading all of the pictures from S3 ...")
return(json.dumps({'status_code':200, 'msg':"company friendly name is " + company_friendly}, sort_keys=True))
知道为什么它不保存图像文件吗?我正在使用 Lambda 控制台建议的默认 S3 角色
您可以尝试将行更改为:
string = '/tmp/' + str(count) + '.png'
无法知道您是否对 lambda 计算机的当前目录具有写入权限。但是/tmp
会让你写。
发件人:AWS Lambda FAQ
Q: What if I need scratch space on disk for my AWS Lambda function?
Each Lambda function receives 500MB of non-persistent disk space in
its own /tmp directory.
我正在开发一个模块,该模块从我的 MySQL 数据库中获取有关图像序列的信息,然后使用 boto 库将它们下载到 Lambda 本地。之后,它应该做一些图像处理,但我还没有完成。
我不断收到的错误很奇怪。在(我相信)它下载了第一张图片之后,它说它不存在 file/directory:
Traceback (most recent call last): File "/var/task/module.py", line 41, in lambda_handler key.get_contents_to_filename(string)
File "/var/task/boto/s3/key.py", line 1714, in get_contents_to_filename os.remove(filename) OSError: [Errno 2] No such file or directory: '1.png'
我的代码中的第 41 行位于此处:
# Download and Save all of the cropped images for this company
count = 1
files_list = []
for image in cropped_images:
key = bucket.get_key(image)
string = str(count) + '.png'
key.get_contents_to_filename(string)
files_list.append(string)
count += 1
print("should be done downloading all of the pictures from S3 ...")
这是我目前拥有的模块的完整脚本:
from __future__ import print_function
import json, os
import pymysql
import os, glob, subprocess, boto
from boto.s3.connection import S3Connection
conn = pymysql.connect(host='*******', port=3306, user='*****', passwd='******', db='*******')
cur = conn.cursor()
conn = S3Connection('***************','************************')
bucket = conn.get_bucket('**********')
def upload_file(company_friendly, filepath):
key = bucket.new_key(company_friendly + ".gif")
key.set_contents_from_filename(filepath)
key.set_acl('public-read')
return True
def lambda_handler(event, context):
### Grab Company Friendly from DB ###
cur.execute("SELECT ************ FROM *********** WHERE company_id = %i LIMIT 1" % (event['company_id']))
company_data = cur.fetchone()
company_friendly = company_data[0]
### Grab all snapshots from DB ###
cur.execute("SELECT *********** FROM ************ WHERE company_id = %i ORDER BY date ASC" % (event['company_id']))
snapshot_data = cur.fetchall()
cropped_images = []
for snapshot in snapshot_data:
cropped_images.append(snapshot[0])
### Download and Save all of the cropped images for this company ###
count = 1
files_list = []
for image in cropped_images:
key = bucket.get_key(image)
string = str(count) + '.png'
key.get_contents_to_filename(string)
files_list.append(string) #this makes sure that the animated gif compiles the images in order
count += 1
print("should be done downloading all of the pictures from S3 ...")
return(json.dumps({'status_code':200, 'msg':"company friendly name is " + company_friendly}, sort_keys=True))
知道为什么它不保存图像文件吗?我正在使用 Lambda 控制台建议的默认 S3 角色
您可以尝试将行更改为:
string = '/tmp/' + str(count) + '.png'
无法知道您是否对 lambda 计算机的当前目录具有写入权限。但是/tmp
会让你写。
发件人:AWS Lambda FAQ
Q: What if I need scratch space on disk for my AWS Lambda function?
Each Lambda function receives 500MB of non-persistent disk space in its own /tmp directory.