【问题标题】:AWS SAM Local + DynamoDB LocalAWS SAM 本地 + DynamoDB 本地
【发布时间】:2019-11-13 13:24:19
【问题描述】:

我目前正在使用 Docker 测试 AWS SAM 与 DynamoDB Local。

这是我遵循的步骤(主要在互联网上找到)

  1. 使用 docker network create local-dev 创建新的 docker 网络。
  2. 运行 DynamoDB 本地 docker run -d -v "$PWD":/dynamodb_local_db -p 8000:8000 --network local-dev --name dynamodb amazon/dynamodb-local。在此之前,我可以使用 AWS CLI 创建和列出表。
  3. 然后,我继续运行 AWS SAM sam local start-api --docker-network local-dev。一切看起来都不错。
  4. 已调用 lambda.js,但对于 console.log(err)console.log(data) 似乎没有结果。

我不知道哪里错了。请帮我。提前谢谢!

lambda.js

const services = require('./services.js');
const AWS = require('aws-sdk');

let options = {
    apiVersion: '2012-08-10',
    region: 'ap-southeast-1',
}

if(process.env.AWS_SAM_LOCAL) {
  options.endpoint = new AWS.Endpoint('http://localhost:8000')
}

const dynamoDB = new AWS.DynamoDB(options);

exports.getUser = async (event, context) => {

    let params = {};

    dynamoDB.listTables(params, (err, data) => {
        if(err) console.log(err)
            else console.log(data)
    })

    return true;
}

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Serverless Resources


Parameters:

  FunctionsCodeBucket:
    Type: String
    Description: CodeBucket
  FunctionsCodeKey:
    Type: String
    Description: CodeKey
  FunctionsCodeVersion:
    Type: String
    Description: CodeVersion
  NodeEnv:
    Type: String
    Description: NodeEnv

Globals:
  Api:
    Cors:
      AllowMethods: "'OPTIONS,POST,GET,DELETE,PUT'"
      AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,Api-Key,api-key'"
      AllowOrigin: "'*'"
  Function:
    Timeout: 300
    Runtime: nodejs10.x
    MemorySize: 128
    CodeUri: ./ 

Resources:
  DevResources:
    Type: AWS::Serverless::Function 
    Properties:                      
      Handler: "index.routes"
      Environment:
        Variables:
          NODE_ENV: !Ref NodeEnv
          # REGION: !Ref "AWS::Region"

      Policies:
      - Version: '2012-10-17'
        Statement:
        - Action:
          - dynamodb:*
          Effect: Allow
          Resource: "*"
      Events:
        GetUser:
          Type: Api 
          Properties:
            Path: /user
            Method: get

【问题讨论】:

    标签: node.js docker aws-sam amazon-dynamodb-local


    【解决方案1】:

    您的 lambda 函数不会等待 dynamoDB.listTables 操作。您可以使用dynamoDB.listTables 的承诺版本来解决此问题,如下所示:

    exports.getUser = async (event, context) => {
    
      let params = {};
    
      try {
        const resp = await dynamoDB.listTables(params).promise();
        console.log(resp);
      } catch (err) {
        console.log(err)
      }
    };
    
    

    您可能需要做的另一件事是为您的 dynamodb 容器分配一个网络别名(您可以使用 --network-alias=<container_name> 选项执行此操作),例如,让我们将别名设置为 dynamodb

    docker run -d -v "$PWD":/dynamodb_local_db -p 8000:8000 --network local-dev --network-alias=dynamodb --name dynamodb amazon/dynamodb-local
    

    之后,您可以在 lambda 函数中使用此网络别名:

    if(process.env.AWS_SAM_LOCAL) {
      options.endpoint = new AWS.Endpoint('http://dynamodb:8000')
    }
    

    【讨论】:

    • 感谢您的帮助@antonku。我试过了,效果很好!
    • @eFeN 欢迎您!如果您能解决问题,如果您接受答案,我将不胜感激,谢谢!
    • 嘿,我得到了 docker:来自守护进程的错误响应:找不到网络本地开发。
    • @user3437721 你首先需要docker network create local-dev。对于 Google 员工,请注意只有用户定义的网络可以使用别名,默认网桥不起作用,即没有 --network blah 命令会成功但别名不起作用。
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 2020-11-06
    • 2019-04-24
    • 2018-06-14
    • 2020-04-29
    • 2021-04-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多