3
5

More than 5 years have passed since last update.

DynamoDBの1レコードをデータ型記述子の入っていないJSONとしてLambdaで取り出す

Last updated at Posted at 2016-10-25

DynamoDBに追加されたデータをLambdaから普通の?JSONとし取り出したいが、自分でパーサー作るのはめんどくさいな・・・と思ってたら、あっさり解決したので共有

具体的に詰まってたところ

Map<String, AttributeValue> image = dynamodbStreamRecord.getDynamodb().getNewImage();

このMap<String, AttributeValue>をパパッと以下のようDynamoDBのデータ型記述子が入っているものではなく、データ型記述子が入っていないJSONにしたい

  • データ型記述子が入っていない例
{
  "number": 47
}
  • データ型記述子が入ってしまっている例
{
  "number": {
    "N": "47"
  }
}

解決

InternalUtils#toSimpleMapValueItem#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.";
    }
}
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5