AWS Lambda Local中忽略了DynamoDB

时间:2017-09-04 09:38:46

标签: node.js amazon-web-services lambda amazon-dynamodb

我在本地运行DynamoDB:

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

我试图运行lambda-local示例:

lambda-local -f aws -e event.json

但是,我根本没有得到dynamodb的任何输出。 没有错误,似乎跳过/忽略对dynamodb.listTables() 的调用。怎么了?

我的aws.js如下:

var AWS = require("aws-sdk");

AWS.config.update({
    region: "us-west-2",
    endpoint: "http://localhost:8000",
    accessKeyId: "BLAH",
    secretAccessKey: "BLAH"
});

var dynamodb = new AWS.DynamoDB();

exports.handler = function(event, context) {
    console.log("EVENT: ", event);

    event.int++;

    console.log("LIST TABLES:");
    dynamodb.listTables(function(err, data) {
        if (err) {
            console.log("Error: ", err.code);
        } else {
            console.log("Table names are: ", data.TableNames);
        }
    });


    console.log("---SUCCEED:---");
    context.succeed(event);
};

event.json

{
    "obj"   : { "a" : "b" },
    "int"   : 1,
    "str"   : "qwerty",
    "arr"   : [ 1, 2, 3, 4 ]
}

输出是:

EVENT:  { obj: { a: 'b' }, int: 1, str: 'qwerty', arr: [ 1, 2, 3, 4 ] }
LIST TABLES:
---SUCCEED:---
OUTPUT
--------------------------------
{
    "obj": {
        "a": "b"
    },
    "int": 2,
    "str": "qwerty",
    "arr": [
        1,
        2,
        3,
        4
    ]
}

我期待在LIST TABLES和--SUCCEED之间至少看到一些东西:--- 然而,没有输出也没有错误。我还检查了DynamoDB日志,那里什么都没有。行event.int++工作正常,我看到所有其他console.log()次来电。

此外,我从节点运行此代码只是为了证明DynamoDB正在运行,它确实列出了表格:

node ListTables.js

ListTables.js的内容(基本上与上面的代码相同):

var AWS = require("aws-sdk");

AWS.config.update({
  region: "us-west-2",
  endpoint: "http://localhost:8000",
  accessKeyId: "BLAH",
  secretAccessKey: "BLAH"
});

var dynamodb = new AWS.DynamoDB();

dynamodb.listTables(function(err, data) {
  if (err) {
    console.log("Error: ", err.code);
  } else {
    console.log("Table names are: ", data.TableNames);
  }
});

按预期输出:     表名是:['电影']

我之前创建该表只是为了证明DynamoDB实际上正在运行并接受来自node的连接。

1 个答案:

答案 0 :(得分:0)

问题和解决方案是DynamoDB函数被称为异步,因此脚本早先完成。

我将context.succeed(event);行从dynamodb.listTables(function(err, data) {的末尾移到内部后,我的输出正常:

dynamodb.listTables(function(err, data) {
console.log("INSIDE");
    if (err) {
        console.log("Error: ", err.code);
    } else {
        console.log("Table names are: ", data.TableNames);
    }
    context.succeed(event);
});

lambda-local -f aws -e event.json

输出:

EVENT:  { obj: { a: 'b' }, int: 1, str: 'qwerty', arr: [ 1, 2, 3, 4 ] }
LIST TABLES:
---SUCCEED:---
INSIDE
Table names are:  [ 'Image', 'Movies' ]
OUTPUT
--------------------------------
...