编辑2:根本原因是我设置了几个DOCKER环境变量,导致我的函数调用重新路由到远程Docker主机而没有命中SAM Local。一旦我取消设置,功能就开始运行了。
编辑:我克隆了docker-lambda并试图运行他们的一个示例并得到同样的错误。
docker run --rm -v "$PWD":/var/task lambci/lambda:python3.6
START RequestId: 73a433fc-1d8a-4cdb-a66d-61bd667e13ba Version: $LATEST
Unable to import module 'lambda_function': No module named 'lambda_function'
END RequestId: 73a433fc-1d8a-4cdb-a66d-61bd667e13ba
REPORT RequestId: 73a433fc-1d8a-4cdb-a66d-61bd667e13ba Duration: 1 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 15 MB
{"errorMessage": "Unable to import module 'lambda_function'"}
我正在尝试使用Python lambda函数设置SAM Local,并继续对标题中的模块导入错误感到沮丧。
我的template.yaml看起来像这样:
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
ProposalsTable:
Type: "AWS::Serverless::SimpleTable"
AddProposal:
Type: "AWS::Serverless::Function"
Properties:
Handler: lambda_function.lambda_handler
Runtime: python3.6
Policies: AmazonDynamoDBFullAccess
Environment:
Variables:
TABLE_NAME: !Ref ProposalsTable
Events:
Vote:
Type: Api
Properties:
Path: /proposals
Method: get
我在与template.yaml相同的文件夹中有一个lambda_function.py。
我跑:sam local start-api
并且启动正常:
Mounting lambda_function.lambda_handler (python3.6) at http://127.0.0.1:3000/proposals [GET]
然后我这样做:
curl http://127.0.0.1:3000/proposals
然后在“服务器”上显示:
Unable to import module 'lambda_function': No module named 'lambda_function'
Function returned an invalid response (must include one of: body, headers or statusCode in the response object): %!s(<nil>)
我尝试了所有不同的命名方式(例如将其放在带有 init .py的文件夹中)
我用Google搜索并阅读了十几个或更多线程,但大多数人都在谈论部署到真正的AWS Lambda; SAM Local上没有太多。
我想知道它是否适合我的环境。此处的node.js示例函数失败并超时。 https://github.com/awslabs/aws-sam-local/tree/develop/samples/hello-world/node
2018/01/04 15:20:41 Invoking index.handler (nodejs6.10)
2018/01/04 15:20:41 Mounting /Users/me/code/sam-local-prototype as /var/task:ro inside runtime container
2018/01/04 15:20:46 Function index.handler timed out after 3 seconds
想法?
答案 0 :(得分:2)
亚伦
观看此视频: https://www.youtube.com/watch?v=xaCbIFH_d9k
您已列出:
此文件位于何处?这很重要,因为元素“CodeUri:”是指定文件路径的地方,我在解释中没有看到该元素。或者,如果您压缩项目,则可以在此处指定文件名。例如,我将我的项目拉出来然后在template.yml中我指定我的CodeUri指向这样的zip:
CodeUri:lambda.zip
。
我希望这会有所帮助。
答案 1 :(得分:2)
关于Unable to import module 'lambda_function': No module named 'lambda_function'
错误:
在template.yaml
处理程序密钥中提供的repo链接中显示:Handler: index.handler
。这对应于包含名为index.js
的函数的handler
文件,该函数写为exports.handler = () => {}
如果您在Python中重写此代码,则template.yaml
处理程序密钥需要阅读Handler: {file_name}.{function_name}
。如果带有lambda函数的文件名为lambda.py
且其中的函数为def lambda_handler
,则需要在.yaml
中将处理程序密钥编写为Handler:lambda.lambda_function
。我记得要修改key
下方的Resources
,但请确保您的文件名和功能名称准确无误,然后重试。
我刚刚从repo中复制了代码并成功运行了它。你有正确的docker安装?或者,当您尝试从回购中运行测试代码时,您是否已启动sam local api
?如果它试图在同一端口上连接,您也可能会获得超时。
2018/01/16 13:39:14 Successfully parsed template.yaml
2018/01/16 13:39:14 Connected to Docker 1.35
2018/01/16 13:39:14 Runtime image missing, will pull....
2018/01/16 13:39:14 Fetching lambci/lambda:nodejs6.10 image for nodejs6.10 runtime...
nodejs6.10: Pulling from lambci/lambda
f338a32fa56c: Already exists
4926b20b634f: Already exists
8040e979acbc: Pull complete
160b6838355f: Pull complete
Digest: sha256:e34f92bc0df0cf4a8ba560c6c7bf201183d5f6773ddf44440a97295486906744
Status: Downloaded newer image for lambci/lambda:nodejs6.10
2018/01/16 13:39:28 Invoking index.handler (nodejs6.10)
2018/01/16 13:39:28 Mounting /Users/me/sam_local_test as /var/task:ro inside runtime container
START RequestId: 8970d865-2d59-1d54-0825-d56f1fd035f7 Version: $LATEST
2018-01-16T20:39:32.315Z 8970d865-2d59-1d54-0825-d56f1fd035f7 LOG: Name is Bob
END RequestId: 8970d865-2d59-1d54-0825-d56f1fd035f7
REPORT RequestId: 8970d865-2d59-1d54-0825-d56f1fd035f7 Duration: 22.02 ms Billed Duration: 0 ms Memory Size: 0 MB Max Memory Used: 28 MB
"Hello Bob"