【发布时间】:2021-12-01 12:24:02
【问题描述】:
我有一个 AWS Lambda 函数,我正在尝试使用 VSCode 逐步调试。我遇到了一个问题,调试器和 VSCode 的行为没有意义,声称它无法从不应该在其中查找这些包的路径解析不存在的文件。
已使用aws-sam-cli 的sam build 和sam local invoke 功能在本地测试了lambda 函数。 lambda 正确地接受带有 -e 的 JSON 事件,并返回预期的响应。已使用以下设置对其 SAM 模板进行了测试:
Resources:
MyLambdaFunction:
Type: AWS::Serverless::Function
Metadata:
DockerTag: python3.8-v1
DockerContext: .
Dockerfile: Dockerfile
Properties:
PackageType: Image
launch.json,引用自https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/serverless-apps-run-debug-config-ref.html,配置如下:
{
"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.py 的第一行设置断点后,即import 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 容器?这是我可以以某种方式改变的行为吗?即使在跳过此导入并忽略错误之后,其他库(例如 dateutil 等)仍然存在相同的错误,这些库也安装在任何有意义的地方。
我已经确认这是这个简单导入语句的问题,因为我使用sam init 提取了一个 AWS SAM 示例,并选择了 Python3.8 的 Hello World Image Example,确认它按原样调试,添加了导入以及对elasticsearch的需求,再次尝试运行调试器时遇到了同样的错误。
任何见解或帮助将不胜感激。
【问题讨论】:
标签: amazon-web-services visual-studio-code vscode-debugger aws-sam aws-sam-cli