用于dynamodb映射的AWS API网关主体映射模板

时间:2017-02-06 22:01:54

标签: amazon-web-services amazon-dynamodb aws-api-gateway

我试图弄清楚如何通过AWS中的API网关将动态数据插入到dynamodb表中。目前我有一个dynamodb表和一个API端点设置,可以接受这样的POST。

POST https:// {unique-id} .execute-api.us.east-1.amazonaws.com / notification / events

{
  "reference_number": 99,
  "purchase_date": "1/1/2017"
}

我已在API网关中设置了一个正文映射模板,以将数据按摩到dynamodb中。

{ 
    "TableName": "Events",
    "Item": {
        "reference_number": {
            "N": "$input.path('$.reference_number')"
        },
        "purchase_date": {
            "S": "$input.path('$.purchase_date')"
        }
    }
}

以上工作并保存到表中。

假设我将事件哈希添加到我的json(可以根据事件更改)。

{
  "reference_number": 99,
  "purchase_date": "1/1/2017",
  "event": {
     "name": "purchase",
     "items": [1,3,6],
     "info": {
       "currencyID": "USD",
       "countryID": "US"
     }
  }
}

如何使用API​​网关主体映射模板语法将事件属性保存到dynamodb中的Map?

{ 
    "TableName": "Events",
    "Item": {
        "reference_number": {
            "N": "$input.path('$.reference_number')"
        },
        "purchase_date": {
            "S": "$input.path('$.purchase_date')"
        },
        "event":{
            "M": "$input.path('$.event')"
        }
    }
}

上面的模板给出了以下错误。 "预期地图或null"

3 个答案:

答案 0 :(得分:1)

看起来DynamoDB API实际上需要一个' M'属性为event的地图。很遗憾,您无法通过原始JSON。您必须手动映射整个event对象才能使DDB API满意。

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html#DDB-Type-AttributeValue-M

一种可能的解决方法是对S对象进行字符串化并将其写为类型{ "TableName": "Events", "Item": { "reference_number": { "N": "$input.path('$.reference_number')" }, "purchase_date": { "S": "$input.path('$.purchase_date')" }, "event":{ "S": "$util.escapeJavaScript($input.json('$.event'))" } } } ,但这当然要求读者期望这种行为。

const from = new Date();
console.log(from);

答案 1 :(得分:1)

看起来你终于做到了。我认为最好的选择是在API和dynamoDB之间创建一个简单的lambda函数。将映射工作留给aws-sdk。

在这种情况下,API网关中的正文映射模板就像这样简单:

$input.body

功能不会复杂得多。我使用了javascript函数:

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

var docClient = new AWS.DynamoDB.DocumentClient();
var tableName = "tableName";

var saveData = function (data) {

  var params = {
    TableName: tableName,
    Item: data
  };

  docClient.put(params, function (err, data) {
    if (err) {
      console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
      console.log("Added item:", JSON.stringify(data, null, 2));
    }
  });

};

exports.handler = function (event) {
  try {
    console.log("Processing event: ", event);
    saveData(event);
  } catch (e) {
    console.error("Processed unsuccessfully", e, e.stack);
  }
};

XML declaration

答案 2 :(得分:0)

对于我的要求(保存输入正文),映射模板是

"rawdata": {
            "M": $input.body
        }

请注意,输入正文没有引号。

数据应采用Dynamodb格式,例如

{"username":{"S":"Vishnu"}}

您可以使用js lib(如dynamodb-marshaller)将json转换为Dynamodb格式。希望这会有所帮助。