有没有一种方法可以使用Amazon s3将大文件上传到Amazon lambda函数

时间:2019-07-20 18:47:19

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

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

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

pip3 install 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'])

`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函数中,则该方法也将有所帮助。我已经坚持了将近一个星期,并且我确定解决方案非常简单,所以我们将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

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

来自docs

  

部署程序包大小

     

50 MB(压缩后,可以直接上传)

     

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

     

3 MB(控制台编辑器)

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

为了使您的生活更轻松,我建议您研究使用开源Serverless Framework,它使Lambda函数的部署非常容易。我将Serverless Framework与serverless-python-requirements插件结合使用,以将代码与需求分离,并将需求部署为Lambda层。

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

相关问题