DynamoDBの複数テーブルをStepFunctionでS3にExportしてみた

DynamoDBの複数テーブルをPoint-in-TimeRecovery+EventBridge+Step FunctionでS3にExportしてみました。

この記事は公開されてから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でした。