首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Dockerized SAM Local设置调试

如何使用Dockerized SAM Local设置调试
EN

Stack Overflow用户
提问于 2017-11-06 02:14:48
回答 2查看 3.7K关注 0票数 6

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

我们当前的设置在端口3000上启动了AWS SAM local。它运行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文件:

代码语言:javascript
复制
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”的目录中:

代码语言:javascript
复制
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。然后,我尝试更改端口映射以公开它。但是,我不知道如何让端口映射正常工作。一旦我命中端点,我就会收到端口错误。

我还在学习docker / docker-compose的速度,当涉及到Lambda的东西时,我完全掌握了,所以如果这个问题很愚蠢的话,我很抱歉。

蒂娅!

EN

回答 2

Stack Overflow用户

发布于 2017-11-28 06:21:35

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

使SAM Local成为我的docker-compose设置的一部分--或者我是这么认为的--的好处是,我省去了我的队友在他们的机器上本地安装它的麻烦。以这样的方式开始:

sam local start-api --host 0.0.0.0

似乎带来了“自动”挂载所有API端点的额外便利。

但是,这不能为用户提供打开和关闭调试的灵活性。它也不允许用户在使用Postman发布输入或从文件加载输入数据之间切换。

所以我现在是这样做的:

代码语言:javascript
复制
$ npm install aws-sam-local --g
$ cd path/to/my/template.yml

要使用Postman:

代码语言:javascript
复制
$ sam local start-api

或者Postman加上调试器:

代码语言:javascript
复制
$sam local start-api -d 5858

要绕过Postman,只需从文件中读取输入:

代码语言:javascript
复制
$ sam local invoke "NameOfResource" -e ./path/to/file.json

或者对调试器执行相同的操作:

代码语言:javascript
复制
$ sam local invoke "NameOfResource" -e ./path/to/file.json -d 5858

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

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

票数 4
EN

Stack Overflow用户

发布于 2019-07-17 08:32:48

本文解释了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容器中的调试脚本有一个大致的了解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47124942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档