我有一个 AWS Lambda 函数,我正在尝试使用 VSCode 进行逐步调试。我遇到了一个问题,调试器和 VSCode 的行为没有意义,声称它无法从它不应该寻找这些包的路径中解析不存在的文件。
lambda 函数已使用aws-sam-cli'sam build和sam 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.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 容器?这是我可以以某种方式改变的行为吗?即使在跳过此导入并忽略错误之后,其他库(例如dateutiletc)仍然存在相同的错误,这些库也安装在任何有意义的地方。
我已经确认这是这个简单导入语句的问题,因为我使用 提取了一个 AWS SAM 示例sam init,并选择了 Python3.8 的 Hello World Image Example,确认它已按原样调试,添加了导入和对 elasticsearch 的要求,当我尝试再次运行调试器时遇到了同样的错误。
任何见解或帮助将不胜感激。