有没有办法使用 Amazon s3 将大文件上传到 Amazon lambda 函数

Is there a way to upload large files to Amazon lambda functions using Amazon s3

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

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

pip3 安装 spacy -t .

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

zip -r ../zipped_dir.zip *

这最初有效,但一旦我开始安装许多导入,zip 文件很快超过 100mb,因此我需要使用 'AWS CLI, AWS SDK, or Amazon S3 REST API' 上传 zip 文件。我已经尝试了几种方法,并且 zip 文件成功上传,但是当我尝试使用 'Code entry type':'Upload a file from Amazon s3' 将它集成到我的 lambda 函数中并提供正确的 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'])

` return '

文件保存到 S3

'

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

此方法也成功将文件上传到存储桶中,但我无法使用 lambda 函数和 URL.

保存它

我也尝试过使用此命令从终端执行此操作,该命令也成功上传到存储桶中,但无法保存在 lambda 函数中:

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

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

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

来自docs

Deployment package size

50 MB (zipped, for direct upload)

250 MB (unzipped, including layers)

3 MB (console editor)

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

为了让您的生活更轻松,我建议您考虑使用开源 Serverless Framework which makes deploying Lambda functions quite easy. I use the Serverless Framework in combination with the serverless-python-requirements 插件将我的代码与我的需求分开,并将需求部署为 Lambda 层。

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