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

Mik*_*keV 5 amazon-web-services amazon-dynamodb aws-api-gateway

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

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

{
  "reference_number": 99,
  "purchase_date": "1/1/2017"
}
Run Code Online (Sandbox Code Playgroud)

我已经在 API 网关中设置了一个身体映射模板来将数据传送到 dynamodb。

{ 
    "TableName": "Events",
    "Item": {
        "reference_number": {
            "N": "$input.path('$.reference_number')"
        },
        "purchase_date": {
            "S": "$input.path('$.purchase_date')"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上工作并保存到表中。

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

{
  "reference_number": 99,
  "purchase_date": "1/1/2017",
  "event": {
     "name": "purchase",
     "items": [1,3,6],
     "info": {
       "currencyID": "USD",
       "countryID": "US"
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

如何使用 API Gateway Body 映射模板语法将事件属性保存到 dynamodb 中的映射?

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

上面的模板给了我以下错误。“预期的地图或空”

Jac*_*AWS 4

看起来 DynamoDB API 实际上需要“M”属性的值是 的 Map String -> AttributeValue。不幸的是,您无法传递原始 JSON。您必须手动映射整个event对象才能使 DDB API 满意。

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

一种可能的解决方法是将event对象字符串化并将其写入类型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'))"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)