amazon-web-services - 如何使用 Dockerized SAM Local 设置调试

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

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

我们当前的设置在端口 :3000 上启动本地 AWS SAM。它运行 start-api 并将函数挂载到我的 template.yml 文件中。我使用 postman 测试这些函数以将 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

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

当涉及到 Lambda 的东西时,我仍然在加快 docker/docker-compose 的速度,并且完全是 nube,如果问题很愚蠢,很抱歉。

蒂亚!

最佳答案

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

让 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

使用 postman :
$ 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 问题,请大喊大叫!

关于amazon-web-services - 如何使用 Dockerized SAM Local 设置调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47124942/

相关文章:

mongodb - MongoDB 的 docker-compose.yml 数据不会持久保存到主机卷

python - 如何在 Lambda 中处理来自 API 网关的二进制数据,反之亦然?

javascript - 如何修复 UnhandledPromiseRejectionWarning : TypeError?

amazon-web-services - DynamoDB - 是否需要调用 shutdown()?

docker - 使用 Pycharm 进行调试时如何让 Docker-compose 运行所有服务?

python - docker postgres 角色不存在

aws-lambda - AWS Lambda 触发器没有云端

aws-lambda - 如何使用无服务器框架从节点 JS AWS lambda 后端将二进制内容传递到 API Gateway?

amazon-web-services - 带有 ConditionExpression 的 DynamoDb

amazon-web-services - EBS 卷显示没有挂载点