首页 > 解决方案 > 如何在 Visual Studio Code 上使用 Python 设置 AWS SAM 本地调试?

问题描述

我试图在 Visaul Studio Code 中使用 lambda (python) 的调试功能。我按照 AWS Docs 上的说明进行操作,但无法在调试模式下触发 python 应用程序。

请看看你是否知道这个问题,如果我设置任何错误,谢谢。

参考: https ://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-debugging.html

观察

似乎应用程序没有在指定的调试端口上启动?

Start_server_with_debug_mode

无法到达端点且未输入 python 应用程序

Not_ok_with_port_5890

如果通过3000端口访问,应用程序可以成功完成

OK_with_port_3000

已执行设置

  1. 初始化项目并按照说明安装ptvsd
  2. 在 python 代码上启用 ptvsd
  3. 添加启动配置

项目结构

项目_结构

Python源码

这基本上只是 python 的官方 helloworld 示例

import json

# import requests
import ptvsd

# Enable ptvsd on 0.0.0.0 address and on port 5890 that we'll connect later with our IDE
ptvsd.enable_attach(address=('localhost', 5890), redirect_output=True)
ptvsd.wait_for_attach()

def lambda_handler(event, context):
    """Sample pure Lambda function

    Parameters
    ----------
    event: dict, required
        API Gateway Lambda Proxy Input Format

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: dict

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    # try:
    #     ip = requests.get("http://checkip.amazonaws.com/")
    # except requests.RequestException as e:
    #     # Send some context about this error to Lambda Logs
    #     print(e)

    #     raise e

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }

启动配置

启动.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    {
        "name": "Python: Current File",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "console": "integratedTerminal"
    },
    {
        "name": "SAM CLI Python Hello World",
        "type": "python",
        "request": "attach",
        "port": 5890,
        "host": "localhost",
        "pathMappings": [
            {
                "localRoot": "${workspaceFolder}/hello_world/build",
                "remoteRoot": "/var/task"
            }
        ]
    }
    ]
}

标签: pythonamazon-web-servicesvisual-studio-codeaws-lambdaaws-sam

解决方案


看来我正在按照文档的指南在“python-debugging/hello_world/build”编辑python文件(文档中有一个步骤要求您将python文件复制到“python-debugging/hello_world/build” )。

但是,当您运行“sam local start-api”时,它实际上会在 CloudFormation 模板 (tempalted.yaml) 指定的位置运行 python 文件,该位置位于“python-debugging/hello_world”(检查“CodeUri”属性)。

当我将所有库移动到与 python 文件相同的文件夹时,它可以工作。

所以我想你必须确定你正在运行哪个 python(或 lambda)脚本,并确保库与 python 脚本一起(如果你不使用层)。

文件夹结构

文件夹结构

在 Visual Studio 代码中进入调试模式

步骤 1:调用并启动本地 API 网关

  • 服务器

Start_API_Gateway

第 2 步:发送测试请求

  • 客户

测试请求

第 3 步:在 Visual Studio Code 中收到请求、触发 lambda、挂起激活调试模式

  • 服务器

Lambda_Triggered

第 4 步:触发 Lambda 函数,在 Visual Studio Code 中进入调试模式

在 IDE 中,打开“运行”透视图,选择该文件的启动配置(“SAM CLI Python Hello World”)。开始调试。

进入_Debug_Mode

第五步:单步执行函数,返回响应

  • 服务器

Lambda_已完成

  • 客户

在此处输入图像描述


推荐阅读