0

我有一个 AWS Lambda 函数,我正在尝试使用 VSCode 进行逐步调试。我遇到了一个问题,调试器和 VSCode 的行为没有意义,声称它无法从它不应该寻找这些包的路径中解析不存在的文件。

lambda 函数已使用aws-sam-cli'sam buildsam local invoke功能在本地进行了测试。lambda 正确地接受一个 JSON 事件-e,并返回预期的响应。已经使用以下设置对其 SAM 模板进行了测试:

Resources:
  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Metadata:
      DockerTag: python3.8-v1
      DockerContext: .
      Dockerfile: Dockerfile
    Properties:
      PackageType: Image

从https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/serverless-apps-run-debug-config-ref.htmllaunch.json引用的,配置如下:

{
    "configurations": [
        {
            "type": "aws-sam",
            "request": "direct-invoke",
            "name": "MyLambdaFunction",
            "invokeTarget": {
                "target": "template",
                "templatePath": "${workspaceFolder}/path/to/template.yaml",
                "logicalId": "MyLambdaFunction"
            },
            "lambda": {
                "runtime": "python3.8",
                "payload": {
                    "path": "${workspaceFolder}/path/to/input.json"
                },
                "environmentVariables": {}
            }
        }
    ]
}

尝试在 VSCode 中调试时Run > Start Debugging,docker 构建成功完成,并且调试器根据 AWS Toolkit 日志附加。有问题的 Dockerfile 如下:

FROM amazon/aws-lambda-python:3.8

COPY index.py requirements.txt ./
ADD mymodules ./mymodules
RUN python3.8 -m pip install -r requirements.txt -t .

CMD ["index.lambda_handler"]

在 , 的第一行设置断点后index.pyimport time调试器按预期停止,一切正常。当我开始单步执行 lambda 代码时,我正在导入的模块中有另一个导入from elasticsearch import Elasticsearch。这是第一个问题出现的地方。VSCode 在右下角抛出一个错误窗口,并显示以下消息:

Unable to open 'socks.py': Unable to read file
'/Users/me/path/to/app/dir/lambdacode/urllib3/contrib/socks.py' 
(Error: Unable to resolve nonexistent file 
'/Users/me/path/to/app/dir/lambdacode/urllib3/contrib/socks.py'

lambdacode包含 lambda 代码、模块目录、requirement.txt 等的根目录在哪里?

我无法确定调试器为何在此工作区路径中查找这些包。调试器似乎根本没有使用 docker 容器,因为它正在本地查找包。作为参考,urllib3安装在我的机器上的系统范围内,安装在我的虚拟环境中,并安装在有问题的 docker 容器中。

为什么调试器试图在我的工作区文件夹中准确查找包,而不是使用 docker 容器?这是我可以以某种方式改变的行为吗?即使在跳过此导入并忽略错误之后,其他库(例如dateutiletc)仍然存在相同的错误,这些库也安装在任何有意义的地方。

我已经确认这是这个简单导入语句的问题,因为我使用 提取了一个 AWS SAM 示例sam init,并选择了 Python3.8 的 Hello World Image Example,确认它已按原样调试,添加了导入和对 elasticsearch 的要求,当我尝试再次运行调试器时遇到了同样的错误。

任何见解或帮助将不胜感激。

4

1 回答 1

0

解决了。它与调试有关。在这里查看更多:

https://github.com/aws/aws-sam-cli/issues/3347

于 2021-10-13T18:13:24.703 回答