有没有办法使用 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 以下,否则您将达到另一个限制。
我写了一个 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 以下,否则您将达到另一个限制。