编辑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的文件夹中)
我在谷歌上搜索并阅读了十几条或更多的线程,但大多数人都在谈论部署到真正的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
有什么想法?
关于
Unable to import module 'lambda_function': No module named 'lambda_function'
错误:在您在
template.yaml
中提供的repo链接中,处理程序键读作:Handler: index.handler
。这对应于包含名为handler
的函数的index.js
文件,该函数被写成exports.handler = () => {}
如果您是用Python编写的,那么您的
template.yaml
处理程序键将需要读取Handler: {file_name}.{function_name}
。如果携带lambda函数的文件名为lambda.py
,其中的函数名为def lambda_handler
,则需要将处理程序键作为Handler:lambda.lambda_function
写入.yaml
。我记得必须修改key
下面的Resources
,但是请确保文件名和函数名是正确的,然后再试一次。我刚刚从回购协议中复制了代码并成功运行了它。docker安装正确吗?或者,当您试图从repo运行测试代码时,是否已经启动了
sam local api
?如果它试图在同一个端口上连接,也可能会得到超时。亚伦
查看此视频: https://www.youtube.com/watch?v=xaCbIFH_d9k
您已列出:
这个文件在哪里?这很重要,因为元素“CodeUri:”是指定文件路径的位置,而我在您的解释中没有看到该元素。或者,如果压缩项目,可以在此处指定文件名。例如,我压缩我的项目,然后在template.yml中指定我的CodeUri以指向zip,如下所示:
CodeUri:lambda.zip
是的。
我希望这能有帮助。
相关问题 更多 >
编程相关推荐