【问题标题】:AWS SAM Local and docker-lambda: keep getting Unable to import module 'lambda_function': No module named 'lambda_function'AWS SAM Local 和 docker-lambda:不断出现无法导入模块“lambda_function”:没有名为“lambda_function”的模块
【发布时间】: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


【解决方案1】:

关于Unable to import module 'lambda_function': No module named 'lambda_function'错误:

在您在template.yaml 中提供的回购链接中,处理程序键为:Handler: index.handler。这对应于包含名为handler 的函数的index.js 文件,写为exports.handler = () =&gt; {}

如果您在 Python 中重写此代码,您的 template.yaml 处理程序密钥将需要读取 Handler: {file_name}.{function_name}。如果带有您的 lambda 函数的文件称为 lambda.py 并且其中的函数是 def lambda_handler,您将需要在 .yaml 中将处理程序键写为 Handler:lambda.lambda_function。我记得必须修改Resources 下的key,但请确保您的文件名和函数名正确,然后重试。

我刚刚从 repo 中复制了代码并成功运行。你有正确安装docker吗?或者当您尝试从 repo 运行测试代码时,您是否启动了 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"

【讨论】:

  • 我想知道这是否是 Docker 问题。我确实在后台运行了一些 Docker 的东西,我认为这些东西可能会产生干扰。不是 100% 确定您的意思是“它试图在同一个端口上连接”
  • sam local invoke "HelloWorld" -e event.json 命令将启动一个 docker 容器并与之通信。我很好奇该通信是否在与sam local api 相同的端口上完成。
  • 是的,我的开发环境有自定义导出 DOCKER_HOST 和 DOCKER_CERT_PATH。我想知道它是否会干扰。你可能正在做某事。让我回复你。
  • 我尝试取消设置我的 DOCKER 环境变量,但我得到了同样的错误。 :-(
  • 抱歉,我回复错区了。在这里:“天哪,它起作用了。我确实在我的终端中为 DOCKER_CERT_PATH 和 DOCKER_HOST 和 DOCKER_TLS_VERIFY 取消设置......这是因为我正在重新路由 Docker。我会给你赏金”我需要确保我在每个终端窗口也是如此。
【解决方案2】:

亚伦,

观看此视频: https://www.youtube.com/watch?v=xaCbIFH_d9k

您已列出:

  • 处理程序:lambda_function.lambda_handler
  • 您的文件是否名为 lambda_function?
  • 此文件位于何处?这很重要,因为元素“CodeUri:”是您指定文件路径的地方,我在您的解释中没有看到该元素。或者,如果您压缩项目,您可以在此处指定文件名。例如,我压缩我的项目,然后在 template.yml 中我指定我的 CodeUri 指向 zip,如下所示:

    CodeUri: lambda.zip

我希望这会有所帮助。

【讨论】:

猜你喜欢
  • 2021-06-28
  • 2018-08-01
  • 2018-11-16
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2020-04-29
相关资源
最近更新 更多