DynamoDBのData Export機能を使って、データを定期的にS3にエクスポートする

DynamoDBのData Export機能 便利です
2020.12.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部の佐藤です。元々、DynamoDBのデータをエクスポートするには、Glueジョブを使用したり、Data Pipelineを使用する必要がありました。それが最近のアップデートで、DynamoDBの機能としてS3にエクスポートする機能が実装されました!

New – Export Amazon DynamoDB Table Data to Your Data Lake in Amazon S3, No Code Writing Required

この機能を使って、定期的にS3にエクスポートする構成をEventBridge、Lambdaを使って作成していきたいと思います。

この記事ではDynamoDBのデータを単純にエクスポートするだけですが、ETLのようなデータ変換処理が必要な場合にはGlueを使う必要があります。GlueとStepFunctionsを使用したサンプルは以下の弊社ブログがおすすめです。

DynamoDB から S3 への定期的なエクスポートの仕組みを AWS Glue と Step Functions を使用して実装してみた

また、DynamoDBのData Export機能を使用してAthenaでクエリできるようにするという弊社ブログもあります。合わせて確認していただければと思います。

【新機能】Amazon DynamoDB Table を S3 に Export して Amazon Athena でクエリを実行する

では構築手順を見ていきます。

前提

  • エクスポート先のS3バケットを作成します
  • DynamoDBの新コンソールを使うので、古いコンソールの場合は新しいコンソールに切り替えてください

DynamoDBテーブルの作成と設定

テーブルの作成

まずは、エクスポート対象のDynamoDBテーブルを作成します。DynamoDBのコンソールに移動して、テーブルの作成をクリックします。

テーブル名とパーティションキーを任意の名前にしてテーブルの作成をします

テストデータを登録する

テーブルが作成できたら、適当なデータを3件登録しました。

ポイントインタイムリカバリ機能の有効化

DynamoDBのエクスポート機能を利用するためには、ポイントインタイムリカバリ機能を有効化する必要があります。バックアップタブに移動して編集をクリックして有効化します。

Lambda関数の作成

Node.jsでLambda関数を書く

定期的に実行するために、Lambda関数からSDKを使用してDynamoDBエクスポートを実行します。Lambdaコンソールに移動して関数の作成をして、以下のように実装します。AWS SDKを使って DynamoDBのテーブルARNとS3バケットを指定して exportTableToPointInTime を実行しています。

const AWS = require('aws-sdk');
const dynamoClient = new AWS.DynamoDB();

const DynamoDBTableArn = process.env.DYNAMODB_TABLE_ARN;
const ExportS3Bucket = process.env.EXPORT_S3_BUCKET;

exports.handler = async (event) => {
    const exportInput = {
        TableArn: DynamoDBTableArn,
        S3Bucket: ExportS3Bucket,
        ExportFormat: 'DYNAMODB_JSON',
    };
    await dynamoClient.exportTableToPointInTime(exportInput).promise();
};

Lambdaの環境変数を設定

上記の実装で環境変数からARNなどの情報を取得するようにしているので、Lambdaの環境変数にDynamoDBのテーブルARNとエクスポート先のS3バケット名を登録します。

IAMロールのポリシーを修正する

AWS SDKを使用するので、Lambdaに紐付いているIAMロールのポリシーを変更します。DynamoDBの exportTableToPointInTime の権限とS3の PutObject 権限が必要です。

  1. Lambdaに紐付いているIAMロールのポリシーを開き、さらにアクセス許可を追加する をクリックします。

  1. DynamoDBの exportTableToPointInTime の権限とS3の PutObject の権限を付与します。

  1. 確認して 変更の保存 をクリックします

EventBridgeルールを作成

定期的に上記のLambda関数を実行するために、EventBridgeのスケジュールベースのルールを作成します。

Lambdaのコンソールに移動して、トリガーを追加 をクリックします

EventBridgeのトリガーを作成します

動作確認をわかりやすくするため、スケジュール式で cron(0/5 * * * ? *) を設定し、5分ごとにLambdaが起動するようにしています。

Lambdaのデザイナー欄が以下のようになっていれば設定OKです

動作を確認する

5分ごとにS3バケットにデータがエクスポートされているかを確認します。以下のようにS3に AWSDynamoDBから始まるキーのオブジェクトが保存されているのが確認できました。

実際にエクスポートされたデータは data 配下に gz圧縮された状態で保存されています。ダウンロードして中身を確認します。以下のように登録したJSONデータがS3に吐き出されていました。うまくいってそうです。

{"Item":{"id":{"S":"83369704-ccef-4163-8c20-24d240c10806"},"name":{"S":"Leopoldine Blümel-Mude"}}}
{"Item":{"id":{"S":"1f187e30-b279-4bfa-85dc-e347092f364f"},"name":{"S":"Theo Trommler"}}}
{"Item":{"id":{"S":"88942fa5-e8be-4b29-8869-6abdc662eaea"},"name":{"S":"Herr Franz-Peter Thanel B.A."}}}

まとめ

DynamoDBデータの定期的なデータエクスポート機能を作成してみました。今までは他のサービスを組み合わせないとできなかったエクスポートがDynamoDB単体でできるようになったのはとても嬉しい機能だなと思いました。