【问题标题】:How to Set Up Debugging with Dockerized SAM Local如何使用 Dockerized SAM Local 设置调试
【发布时间】:2017-11-05 18:14:48
【问题描述】:

我正在开发一个将 AWS Lambda 与 Node.js 结合使用的项目。我们将 Docker 容器用于我们的开发环境。

我们当前的设置在端口:3000 上启动 AWS SAM 本地。它运行 start-api 并将函数安装在我的 template.yml 文件中。我使用邮递员测试这些函数以将 JSON 发送到已安装的 API 端点,如下所示:http://127.0.0.1:3000/foo

Docker 设置还在 :4000 上启动了一个单独的 Node.js 实例。

如上所述,我能够在本地测试 Lambda 内容。但是,我想激活调试,以便我可以单步执行函数并检查变量,而不是使用 console.log()。我不知道如何编辑 Dockerfile / docker-compose.yml 来实现这一点。

这是我的 docker-compose 文件:

version: '3'
services:
  web:
    build: ./web
    container_name: someapp
    command: npm run dev
    volumes:
      - ./web:/usr/app/
      - /usr/app/node_modules
    ports:
      - "4000:4000"
    environment:
      DATABASE_URL: mongo://someapp:someapp@10.10.62.205:37017,10.10.62.205:37018,10.10.62.205:37019/somedb
  sam:
    build: serverless/.
    container_name: samlocal
    command: sam local start-api --host 0.0.0.0
    environment:
      COMPOSE_CONVERT_WINDOWS_PATHS: 1
      SAM_DOCKER_VOLUME_BASEDIR: ${CURRENT_DIRECTORY}/serverless
      DATABASE_URL: mongo://someapp:someapp@10.10.62.205:37017,10.10.62.205:37018,10.10.62.205:37019/somedb
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./serverless:/var/opt
    ports:
      - "3000:3000"

这是 SAM 的 Dockerfile,它位于一个名为“serverless”的目录中:

FROM alpine:3.6

ENV VERSION=0.2.2

RUN apk add --no-cache curl && \
    curl -sSLO https://github.com/awslabs/aws-sam-local/releases/download/v${VERSION}/sam_${VERSION}_linux_386.tar.gz && \
    tar -C /usr/local/bin -zxvf /sam_${VERSION}_linux_386.tar.gz && \
    apk del curl && \
    rm -f /sam_${VERSION}_linux_386.tar.gz

# awscli for "sam package" and "sam deploy"
RUN apk add --no-cache py-pip && pip install awscli

WORKDIR /var/opt

EXPOSE 3000

我尝试了在 docker-compose.yml 中的 RUN 指令中将 --d 标志添加到“sam”服务的各种排列。例如:sam local start-api --host 0.0.0.0 --d 8080。然后我尝试更改端口映射以公开它。但是,我不知道如何让端口映射工作。一旦我到达端点,我就会收到端口错误。

当谈到 Lambda 的东西时,我仍然在 docker / docker-compose 和一个完整的 nube 上加快速度,如果这个问题很愚蠢,很抱歉。

TIA!

【问题讨论】:

    标签: amazon-web-services docker-compose aws-lambda dockerfile aws-sam-cli


    【解决方案1】:

    我已经确定我最初的方法是不正确的。

    将 SAM Local 作为我的 docker-compose 设置的一部分——或者我认为——的好处是我可以省去我的队友在他们的机器上本地安装它的麻烦。并以这种方式启动它:

    sam local start-api --host 0.0.0.0

    似乎赋予了“自动”安装所有 API 端点的额外便利。

    但是,这无法让用户灵活地打开和关闭调试。它也不允许用户在使用 Postman POST 输入或从文件加载输入数据之间切换。

    这就是我现在的做法:

    $ npm install aws-sam-local --g
    $ cd path/to/my/template.yml
    

    使用邮递员:

    $ sam local start-api
    

    或 Postman 加调试器:

    $sam local start-api -d 5858
    

    绕过 Postman 并简单地从文件中读取输入:

    $ sam local invoke "NameOfResource" -e ./path/to/file.json
    

    或者用调试器做同样的事情:

    $ sam local invoke "NameOfResource" -e ./path/to/file.json -d 5858
    

    注意:在上面的例子中,"NameOfResource" 必须是一个字符串,并且它必须与 template.yml 中列出的资源名称匹配(以防它与源代码中的实际函数名称不同)。

    这样做我可以在 WebStorm 中连接远程 Node.js 调试器并设置断点。我还可以连接 Visual Studio Code 调试器。但是,Visual Studio Code 似乎忽略了我的断点,迫使我使用debugger; 语句。这很不幸,因为我的队友都使用 Visual Studio Code,而 WebStorm 不是免费的。如果有人知道如何解决 Visual Studio 问题,请大声疾呼!

    【讨论】:

    • 遇到与您相同的初始问题。您最终在哪里发现最初的方法不正确?我们正在做类似的事情并面临同样的问题。
    • 嗨,Jako。 SAM Local 是一个 CLI 工具,但我基本上是在尝试将它用作运行时,以避免开发人员必须安装它并手动启动它。我的工作流程要求包括能够在发送网络请求和 JSON 文件作为本地 Lambda 函数的输入之间轻松切换。我还需要能够在正常操作模式和调试模式之间轻松切换。 SAM Local 提供了所有这些选项,但您需要运行不同的命令来调用它们。仅在 docker 映像中启动 API 将不允许您调用不同的选项。
    【解决方案2】:

    这里有一篇文章解释了 PyDev 远程调试器的操作,用于通过 Eclipse IDE 单步执行在 Docker 容器中运行的 Lambda 代码。

    https://medium.com/debugging-aws-lambda-functions-from-eclipse-with/debugging-aws-lambda-python-function-with-eclipse-using-pydev-1e0fa4b2deff

    它是 Python 而不是 Node,但它可能有助于大致了解在 Docker 容器中运行的调试脚本。

    【讨论】:

    • 嗨@尼克。此答案应该是评论,因为您仅提供链接。我邀请您编辑您的答案以改进它。请看How do I write a good answer
    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2021-07-30
    • 2021-08-03
    相关资源
    最近更新 更多