この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、nkhrです。
DynamoDBの複数テーブルをPoint-in-TimeRecovery+EventBridgeのSchedule実行+Step FunctionでS3にExportしてみました。構成イメージは以下の通り。
EventBridgeの設定
EventBridgeでは、Schedule実行を設定し、パラメータとして「DynamoDBのテーブル名、Export先S3バケットとPrefix」のリストを送信します。ターゲットは作成したStepFunctionとします。
任意のパラメータを送信するために、「入力トランスフォーマー」を利用します。
- 入力パス(Schedule実行でEventBridgeで生成されるイベントを定義します。サンプルイベント参考)
{ "account": "$.account", "detail-type": "$.detail-type", "id": "$.id", "region": "$.region", "resources": "$.resources", "source": "$.source", "time": "$.time", "version": "$.version" }
-
入力テンプレート(入力パスに定義した値は<>で参照します)
{ "version": <version>, "id": <id>, "time": <time>, "tablelist": [ { "tablename": "test", "bucketname": "test-logs", "prefix": "exported/test" }, { "tablename": "test2", "bucketname": "test-logs", "prefix": "exported/test2" } ] }
Step Functionの設定
以下のようなStep Functionを作成します。Mapに”$.tablelist”を渡すことで、EventBridgeから渡されたリスト内の値ごとにExport実行と完了判定を行います。
{
"Comment": "A description of my state machine",
"StartAt": "Map",
"States": {
"Map": {
"Type": "Map",
"Iterator": {
"StartAt": "ExportTableToPointInTime",
"States": {
"ExportTableToPointInTime": {
"Type": "Task",
"Parameters": {
"S3Bucket.$": "$.bucketname",
"S3Prefix.$": "$.prefix",
"S3SseAlgorithm": "AES256",
"ExportFormat": "DYNAMODB_JSON",
"TableArn.$": "States.Format('arn:aws:dynamodb:ap-northeast-1:<account-id>:table/{}', $.tablename)"
},
"Resource": "arn:aws:states:::aws-sdk:dynamodb:exportTableToPointInTime",
"Next": "DescribeExport"
},
"DescribeExport": {
"Type": "Task",
"Parameters": {
"ExportArn.$": "$.ExportDescription.ExportArn"
},
"Resource": "arn:aws:states:::aws-sdk:dynamodb:describeExport",
"Next": "Wait for export"
},
"Wait for export": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.ExportDescription.ExportStatus",
"StringEquals": "IN_PROGRESS",
"Next": "Wait 15s"
},
{
"Variable": "$.ExportDescription.ExportStatus",
"StringEquals": "COMPLETED",
"Next": "Success"
}
],
"Default": "Fail"
},
"Fail": {
"Type": "Fail"
},
"Wait 15s": {
"Type": "Wait",
"Seconds": 15,
"Next": "DescribeExport"
},
"Success": {
"Type": "Succeed"
}
}
},
"End": true,
"ItemsPath": "$.tablelist",
"MaxConcurrency": 5
}
}
}
まとめ
EventBridgeやStepFunctionの仕組みの勉強もかねて、DynamoDBの複数テーブルExportをためしてみました。
今回はEventBridgeの入力トランスフォーマーを利用してExport対象のテーブルリストを管理しましたが、対象テーブルの一覧はParameterStoreとか外部で管理して、Mapの前に一覧を取得するほうが、仕組みとしては管理しやすいと思います。
以上、nkhrでした。