繁体   English   中英

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

[英]how to download S3 file in Serverless Lambda (Python)

我使用Python创建了一个lambda(使用Serverless),它将由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

常量

bucket_name = 'test'
raw_filepath = '/var/task/raw/'

我创建了一个文件夹“ raw”,与文件handler.py处于同一级别,然后部署了无服务器lambda。

触发lambda时出现错误(来自CloudWatch)。

No such file or directory: u'/var/task/raw/Student001.JPG.94BBBAce'

据我了解,无法访问lambda文件夹,或者无法在lambda中创建文件夹。

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

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

任何建议表示赞赏。

如果需要将对象下载到磁盘,则可以使用tempfiledownload_fileobj进行保存:

import tempfile

with tempfile.TemporaryFile() as f:
    s3.meta.client.download_fileobj(const.bucket_name, 
                                   'class/raw/photo/' + message['photo_name'],
                                    f)
    f.seek(0)
    # continue processing f

请注意,Lambda中临时文件的大小限制512 MB

我认为更好的方法是在内存中处理所有这些。 除了tempfile ,您可以以非常相似的方式使用io

import io

data_stream = io.BytesIO()
s3.meta.client.download_fileobj(const.bucket_name, 
                               'class/raw/photo/' + message['photo_name'],
                                data_stream)
data_stream.seek(0)

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

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

https://github.com/adjr2/webp-to-jpg/blob/master/codes.py

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

希望能帮助到你。 干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM