【发布时间】:2018-01-04 22:36:56
【问题描述】:
编辑 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 的文件夹中)
我搜索并阅读了十几个线程,但大多数人都在谈论部署到真正的 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
想法?
【问题讨论】:
-
我认为您从示例代码中得到了超时,因为该仓库中的
event.json似乎无效(至少从我使用 SAM 的经验来看)。我上周写了this,今天我用它。它可以工作,并且是用 python 编写的。我使用sam local invoke "S3" --event event.json来初始化docker env,然后再次运行另一个窗口来触发事件。在我的例子中,event.json在我配置的存储桶上触发了一个真实事件。 -
感谢您的回复。我不确定它是否已经到了摄取 event.json 的地步。它似乎根本没有执行该功能。
-
您可能是对的,但我认为 IP 很重要。如果我连接到我的工作 VPN 并运行相同的事件,它会超时。您还将在我的仓库中的
template.yaml文件中看到我将Handler: lambda_function.lambda_handler重命名为Handler: lambda.lambda_handler以匹配它将运行的文件的名称。sam local invoke "S3"也匹配Resources键的值。 -
你解决过这个问题吗?
-
不,先生,我没有。
标签: python amazon-web-services lambda