如何在无服务器Lambda(Python)中下载S3文件

如何在无服务器Lambda(Python)中下载S3文件,python,aws-lambda,boto3,serverless-framework,Python,Aws Lambda,Boto3,Serverless Framework,我在Python中创建了一个lambda(使用无服务器),它将由SQS消息触发 handler.py s3 = boto3.resource('s3') def process(event, context): response = None # for record in event['Records']: record = event['Records'][0] message = dict() try: message = json

我在Python中创建了一个lambda(使用无服务器),它将由SQS消息触发

handler.py

s3 = boto3.resource('s3')

def process(event, context):
    response = None
    # for record in event['Records']:
    record = event['Records'][0]
    message = dict()
    try:
        message = json.loads(record['body'])

        s3.meta.client.download_file(const.bucket_name, 'class/raw/photo/' + message['photo_name'], const.raw_filepath + message['photo_name'])    

        ...

        response = {
            "statusCode": 200,
            "body": json.dumps(event)
        }

    except Exception as ex:
        error_msg = 'JOB_MSG: {}, EXCEPTION: {}'.format(message, ex)
        logging.error(error_msg)

        response = {
                "statusCode": 500,
                "body": json.dumps(ex)
            }

    return response
常数py

bucket_name = 'test'
raw_filepath = '/var/task/raw/'
我创建了一个与文件handler.py相同级别的文件夹“raw”,然后部署无服务器lambda

当lambda被触发时,我(从CloudWatch)得到一个错误

No such file or directory: u'/var/task/raw/Student001.JPG.94BBBAce'
据我所知,lambda文件夹不可访问或无法在lambda中创建文件夹

就最佳实践而言,我同意lambda的目标:

  • 下载S3原始文件
  • 调整文件大小并将新文件上载到另一个S3存储桶

感谢您的建议。

如果您需要将对象下载到磁盘,您可以使用
tempfile
download\u fileobj
保存它:

导入临时文件
使用tempfile.TemporaryFile()作为f:
s3.meta.client.download_fileobj(const.bucket_name,
“class/raw/photo/”+消息['photo_name'],
(f)
f、 搜索(0)
#继续处理f
请注意,在Lambda中,临时文件的大小有一个很大的差异

我认为一个更好的方法是在内存中处理这一切。您可以以非常类似的方式使用
io
,而不是
tempfile

导入io
数据流=io.BytesIO()
s3.meta.client.download_fileobj(const.bucket_name,
“class/raw/photo/”+消息['photo_name'],
数据流)
数据流寻道(0)

这样,数据就不需要写入磁盘,这是a)更快,b)您可以处理更大的文件,基本上直到达到Lambda的3008 MB内存限制或内存。

在我的一个项目中,我将webp文件转换为jpg。我可以参考以下github链接来获得一些理解:

您可以在lambda函数中直接访问下载的文件。我不确定你是否可以创建一个新文件夹(即使我对所有这些东西都很陌生),但你肯定可以操纵文件并上传回相同(或不同)的s3存储桶

希望能有帮助。 干杯

对于我的方法,我需要使用read()来“执行”数据流:package.my\u方法(data\u stream.read())