VSCode 在本地调试 AWS Lambda 时,调试器无法解析不存在的文件

VSCode Debugger unable to resolve non-existent files while locally debugging AWS Lambda

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

已使用 aws-sam-clisam buildsam local invoke 功能在本地测试了 lambda 函数。 lambda 正确地接受了一个 JSON 事件和 -e,并且 returns 是预期的响应。这已通过以下 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 工具包日志附加调试器。有问题的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.py 的第一行设置断点后,即 import time,调试器按预期停止,一切正常。当我开始单步执行 lambda 代码时,我正在导入 from elasticsearch import Elasticsearch 的其中一个模块有另一个导入。这是第一个问题出现的地方。 VSCode 在右下角抛出错误 window,并显示以下消息:

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 容器?这是我可以以某种方式改变的行为吗?即使在跳过此导入并忽略错误之后,其他库(例如 dateutil 等)仍然存在相同的错误,这些库也安装在任何有意义的地方。

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

如有任何见解或帮助,我们将不胜感激。

已解决。它与debugpy有关。在这里查看更多:

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