DynamoDBに追加されたデータをLambdaから普通の?JSONとし取り出したいが、自分でパーサー作るのはめんどくさいな・・・と思ってたら、あっさり解決したので共有
具体的に詰まってたところ
Map<String, AttributeValue> image = dynamodbStreamRecord.getDynamodb().getNewImage();
このMap<String, AttributeValue>
をパパッと以下のようDynamoDBのデータ型記述子が入っているものではなく、データ型記述子が入っていないJSONにしたい
- データ型記述子が入っていない例
{
"number": 47
}
- データ型記述子が入ってしまっている例
{
"number": {
"N": "47"
}
}
解決
InternalUtils#toSimpleMapValue
とItem#item.toJSONPretty
を使ってあげる
実際にコードは以下
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.internal.InternalUtils;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import java.util.Map;
public class DynamoDBStreamFunction implements RequestHandler<DynamodbEvent, String> {
@Override
public String handleRequest(DynamodbEvent input, Context context) {
for (DynamodbEvent.DynamodbStreamRecord dynamodbStreamRecord : input.getRecords()) {
Map<String, AttributeValue> image = dynamodbStreamRecord.getDynamodb().getNewImage();
final Map<String, Object> newImage = InternalUtils.toSimpleMapValue(dynamodbStreamRecord.getDynamodb().getNewImage());
final Item item = Item.fromMap(newImage);
context.getLogger().log(item.toJSONPretty());
}
return "Successfully processed " + input.getRecords().size() + " records.";
}
}