Wil*_*man 11 python-3.x aws-lambda aws-serverless
我刚刚开始使用 SAM 使用 AWS 无服务器并遇到以下问题:
SAM invoke 似乎找不到我的 lambda 处理程序正在导入的 python 模块,但我可以以其他方式导入该模块。
该结构我的项目是:
根目录/
我在 python3.6 虚拟环境中工作,我已经使用安装工具安装了我的 python 包(mymodulename):
python setup.py develop
Run Code Online (Sandbox Code Playgroud)
因此,如果我在虚拟环境中冻结 pip,我会看到:
Pillow==6.0.0
PyPDF2==1.26.0
reportlab==3.5.20
mymodulename==0.5.0
Run Code Online (Sandbox Code Playgroud)
另外如果我去:
cd root-dir/aws/sam/
python
>>> import mymodulename
Run Code Online (Sandbox Code Playgroud)
这成功了。所以它在python路径上。
但是当我在本地调用 sam 时,即:
sam local invoke MyAWSServiceFunction --event ../sam/test/test_event.json
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
2019-05-02 09:19:17 Found credentials in shared credentials file: ~/.aws/credentials
2019-05-02 09:19:18 Invoking app.lambda_handler (python3.6)
Fetching lambci/lambda:python3.6 Docker container image......
2019-05-02 09:19:19 Mounting /home/myname/root-dir/aws/sam/myawsservice as /var/task:ro,delegated inside runtime container
START RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d Version: $LATEST
Unable to import module 'app': No module named 'mymodulename'
END RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d
REPORT RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d Duration: 31 ms
Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB
{"errorMessage": "Unable to import module 'app'"}
Run Code Online (Sandbox Code Playgroud)
这是我的app.py的代码:
from mymodulename.mymodule import mymodulefunction
def lambda_handler(event, context):
return mymodulefunction(event['body'])
Run Code Online (Sandbox Code Playgroud)
我可以从我的单元测试中运行上面的代码,而不是从 sam invoke 环境中运行。
模板.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: > something
Globals:
Function:
Timeout: 3
Resources:
MyAWSServiceFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: myawsservice/
Handler: app.lambda_handler
Runtime: python3.6
Run Code Online (Sandbox Code Playgroud)
帮助表示赞赏。
编辑:
一种解决方法是将 app.py、requirements.txt 和 template.yaml 放在根目录中并执行:
sam build
Run Code Online (Sandbox Code Playgroud)
这会将第 3 方依赖项和我自己的 python 模块存储在一起,并且 template.py 现在可以在 sam 本地调用期间找到它。
然而,这对于更大的项目并不实用,我想现在的答案可能是这样的。虽然这是针对 serverless.yaml 的。我不确定 SAM 是否支持这种语法。猜测没有。
| 归档时间: |
|
| 查看次数: |
4372 次 |
| 最近记录: |