【问题标题】:Is there a way to upload large files to Amazon lambda functions using Amazon s3有没有办法使用 Amazon s3 将大文件上传到 Amazon lambda 函数
【发布时间】:2019-07-20 18:47:19
【问题描述】:

我编写了一个 python 文件,它生成了我想用作 Alexa 技能的一部分的特定句子。然后生成这些句子的数组。我现在正在尝试创建一个 lambda 函数,它以基于 Alexa 的游戏格式实现这些句子。但是,python 文件包含许多不是 lambda 原生的导入,因此无法使用。

经过大量阅读,我尝试使用以下代码(以一个库为例)安装导入包/依赖项:

pip3 安装 spacy -t .

然后我使用以下代码压缩文件夹的内容,然后将 zip 文件上传到 Amazon s3 存储桶:

zip -r ../zipped_dir.zip *

这最初是可行的,但是一旦我开始安装许多导入文件,zip 文件很快就超过了 100mb,因此我需要使用“AWS CLI、AWS SDK 或 Amazon S3 REST API”上传 zip 文件。我已经尝试了几种方法,并且 zip 文件成功上传,但是当我尝试使用“代码输入类型”将它集成到我的 lambda 函数中时:“从 Amazon s3 上传文件”并提供正确的 URL,功能不允许我保存它。我单击保存并尝试这样做,但仍为橙色。我相信这是因为文件太大。我确信上传方法是正确的,因为我使用小于 100mb 的 zip 文件重新测试了该过程,并使用关联的 URL 上传到 lambda 函数,并成功保存。

为了上传大文件,我尝试了以下方法。在这个例子中我使用了flask和boto3的组合。

import boto3 
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    return '''<form method=POST enctype=multipart/form-data                                  `       action="upload">
    <input type=file name=myfile>
    <input type=submit>
    </form'''

@app.route('/upload',methods=['POST'])
def upload():
    s3 = boto3.resource('s3')

s3.Bucket('bucket').put_object(Key='file.zip',Body=request.files['myfile'])

`返回'

文件保存到 S3

'
if __name__ == '__main__':
    app.run(debug=True)

这个方法也成功将文件上传到bucket,但是我无法用lambda函数和url保存。

我也试过从终端用这个命令来做,也成功上传到bucket但不能保存在lambda函数上:

aws s3 cp /foldername s3://bucketname/ --recursive --include          `   "myzip.zip"

我确信手动安装相关导入的所有文件并不是最佳方法,因此任何建议的其他方法都会有所帮助。如果还有一种方法可以在其他地方运行 python 文件,并将字符串数组传递给可以在 Alexa 设备上运行的 lambda 函数,那么该方法也会有所帮助。我已经坚持了将近一个星期,我相信解决方案相当简单,所以非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: python amazon-s3 aws-lambda alexa-skill


    【解决方案1】:

    归档大小 > 50MB 时您已达到 Lambda 限制,这就是您当前尝试失败的原因。

    来自docs

    部署包大小

    50 MB(压缩,用于直接上传)

    250 MB(解压缩,包括图层)

    3 MB(控制台编辑器)

    如果您有较大的依赖项,我建议您考虑使用Lambda Layers,它们基本上提供了一种将您的依赖项与主代码分开的方法。

    为了让您的生活更轻松,我建议您考虑使用开源 Serverless Framework,这使得部署 Lambda 函数变得非常容易。我将无服务器框架与 serverless-python-requirements 插件结合使用,将我的代码与我的需求分开,并将需求部署为 Lambda 层。

    注意:确保解压后的要求和代码保持在 250MB 以下,否则会达到另一个限制。

    【讨论】:

    • "一个函数一次最多可以使用 5 个层。函数和所有层的总解压缩大小不能超过解压缩部署包大小限制 250 MB。"我认为使用 Layers 不会帮助您构建更大的依赖项。
    • 如果您想使用 pandas、numpy 和 scipy 之类的库,这会有所帮助 - 这些库不适合常规 lambda zip 存档(限制:50MB),但如果您将它们打包为一个层,则可以使用它们非常简单——带有插件的无服务器框架使这变得非常简单。如果您需要超过 250MB 的未压缩代码+依赖项,您应该使用其他服务 ;-)
    • @Maurice 你有什么建议?
    • @Steven 如果您需要超过 250MB 的未压缩数据,如果您想限制管理工作,可以查看 Fargate Containers,否则我建议您使用无服务器框架和 serverless-python- 的建议要求:)
    • @Maurice。感谢您的反馈。我认为 serverless-python-requirements 可能会起作用。
    猜你喜欢
    • 2021-08-22
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多