AWS SAM 本地 + DynamoDB 本地

AWS SAM Local + DynamoDB Local

我目前正在使用 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).
  5. 似乎没有结果

我不确定哪里错了。请帮我。提前致谢!

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

您的 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')
}