首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python代码可以部署在AWS lambda中,但不能部署在本地堆栈中。

python代码可以部署在AWS lambda中,但不能部署在本地堆栈中。
EN

Stack Overflow用户
提问于 2018-11-30 09:39:46
回答 1查看 2.8K关注 0票数 1

我开发了一个python (v3.6)项目,该项目在我的AWS生产平台中部署并实际在一个无服务器的lambda中工作。该项目使用以下依赖项:

代码语言:javascript
复制
- awscli==1.16.10
- boto3==1.9.0
- botocore==1.12.0
- psycopg2==2.7.5
- SQLAlchemy==1.2.11
- SQLAlchemy-Utils==0.33.3
- jsonschema==2.6.0

现在,我想使用本地堆栈将这个项目部署到我能够调用的lambda中,以便测试我的调用代码(而不是实际工作的项目代码!)

要部署该项目,首先安装依赖项并创建一个zip文件:

代码语言:javascript
复制
pip install -r requirements.txt --upgrade -t ./
chmod -R 755 .
zip -r lambda.zip .

然后,我使用这个命令(与一个正在运行的本地堆栈):

代码语言:javascript
复制
aws lambda --region eu-east-1 --endpoint localhost:4574 \
    create-function --function-name mylambda \
    --zip-file fileb://lambda.zip

但是,它从本地堆栈返回一个错误:

代码语言:javascript
复制
....
localstack_1  |     from functools32 import lru_cache
localstack_1  | ImportError: No module named functools32
....
localstack_1  |     raise Exception('Unable to get handler function from lambda code.', e)
localstack_1  | Exception: ('Unable to get handler function from lambda code.', ImportError('No module named functools32',))

jsonschema使用模块functools32,它仅适用于python2.7或<=3.2。我使用python3.6,所以我不能安装它。此外,当我在我的AWS生产平台上部署相同的lambda.zip时,我没有这个错误。

我真的不知道怎么解决这个问题。如果有人想检查一下,我会非常感激的。

致以敬意,

EN

回答 1

Stack Overflow用户

发布于 2019-02-02 08:27:09

您所做的方式与我非常相似,除了创建lambda函数时,我还附加了一些定义处理程序函数、运行时等的标志.所以我会说您的错误就在那里。尽管如此,我可以在AWS和Local堆栈上成功地运行lambda,所以我就是这样完成它的:

  1. 首先,创建一个Dockerfile,该文件将从lambci/lambda:Build-python3.7ENVREQPATH/root/requments.txt复制//requments.txt/ requirementsDockerfile安装-i https://pypi.douban.com/simple -r ${ REQPATH } -ihttps://pypi.douban.com/simple -r ${REQPATH}-ihttps://pypi.douban.com/simple-r${REQPATH}运行cd /opt && zip /root/lambda-layer.zip *
  2. 现在,构建映像并将.zip文件从容器中取出: #!/bin/bash构建-t lambda层:my_version ${NOCACHE}。id=$(docker创建lambda层:my_version)停靠器cp $id:/root/lambda-layer.zip /lambda-layer.zip停靠器rm -v $id
  3. 现在,这个.zip文件可以是一个需要上传到AWS的文件,因为我将lambda函数直接写在他们的网站上,但是对于Local堆栈,我们需要创建一个新的.zip文件,它包含的内容与刚刚生成的文件相同,但是为lambda添加了一个python脚本。
  4. 在本例中,编写一个依赖于某个第三方模块的lambda脚本;requestslambda.py导入请求def处理程序(事件、上下文):print(-测试localstack
  5. 使用上面的python脚本创建一个新的.zip文件:shell$ cp lambda-layer.zip lambda层-localstack.zip$ -ur lambda层-localstack.zip lambda.py #检查zip文件上的内容包含python #依赖项和lambda函数脚本$ unzip -l lambda层-localstack.zip存档:lambda层-localstack.zip长度日期时间名称-2019年-02-02 15:37 python/ 261 2019-02-02 15:43 lambda.py
  6. 现在我们只需要在本地堆栈上创建lambda函数。 $ awslocal --端点-url=http://192.168.xx.xx:4569\ lambda创建-函数-name=function 1\-运行时=python3.7\-角色=r1\-处理程序--zip-file fileb://lambda-lay-localstack.zip
  7. 最后,测试它是否有效 $ awslocal -端点-url=http://192.168.2.75:4569\ lambda调用-函数名为function1结果1.log{ "StatusCode":200 }# On docker-复合日志(docker-复合日志-f) localstack_1 --测试localstack_1 localstack_1 ('event:',None) localstack_1 ('context:',{.})localstack_1 ('r:',)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53554860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档