0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

AWS Step Functionsの新機能AWS SDK Service Integrationsを使ってみた

はじめに

StepFunctionsに大きなアップデートがあり、AWS SDK Service Integrationsが使えるようになりました。

AWS Step Functionsは、新機能AWS SDK Service Integrationsにより、サポートするAWSサービスの数を17から200以上に、AWS API Actionsを46から9,000以上に拡大しました。

  • 従来のStepFunctionsは手軽に始められる反面、Optimized integrationsに無いサービスを呼び出す場合、APIを呼び出すだけのLambda Functionを作る必要があり、構築、管理上の負担がありました
  • 新機能のAWS SDK service integrationsは、StepFunctionsから直接呼び出せるAPIが増え、APIを呼び出すだけのLambda Functionが不要になりました

新機能AWS SDK service integrationsで使用可能になったサービスの一覧

処理の流れ

  • DynamoDBからS3エクスポートを行う
    • DynamoDBのExportTableToPointInTimeのAPIを利用

Step Functions Workflow Studioの左メニューにある、アクションからDynamoDBを選択
action.png

ExportTableToPointInTimeのパーツを選択
parts.png

  • 60秒待機して、エクスポート状態を確認する
    • DynamoDBのDescribeExportのAPIを利用

同じくDynamoDBにあるDescribeExportのパーツを選択
describe.png

  • エクスポートが完了したら、終了とする
  • (実運用上はエクスポート後に、Athenaから検索するための、パーティション化、データカタログ作成処理などがありますが、長くなるので本記事では割愛します)

構成

  • ステートマシーン図

state.png

  • ASL(Amazon States Language)
    • 以下2点を行えば、このまま動きます
      • 対象のDynamoDBのポイントインタイムリカバリ (PITR)の有効化
      • IAMロール(DynamoDBへの操作権限、S3への書き込み権限)の設定
state_machine.json
{
  "Comment": "This is your state machine",
  "StartAt": "ExportTableToPointInTime",
  "States": {
    "ExportTableToPointInTime": {
      "Type": "Task",
      "Parameters": {
        "S3Bucket.$": "$.s3Bucket",
        "TableArn.$": "$.tableArn",
        "S3Prefix.$": "$.s3Prefix"
      },
      "Resource": "arn:aws:states:::aws-sdk:dynamodb:exportTableToPointInTime",
      "Next": "Wait",
      "ResultPath": "$.ExportTableResult"
    },
    "Wait": {
      "Type": "Wait",
      "Seconds": 60,
      "Next": "DescribeExport"
    },
    "DescribeExport": {
      "Type": "Task",
      "Parameters": {
        "ExportArn.$": "$.ExportTableResult.ExportDescription.ExportArn"
      },
      "Resource": "arn:aws:states:::aws-sdk:dynamodb:describeExport",
      "Next": "Choice",
      "ResultPath": "$.DescribeExportResult"
    },
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.DescribeExportResult.ExportDescription.ExportStatus",
          "StringEquals": "COMPLETED",
          "Next": "Success"
        },
        {
          "Variable": "$.DescribeExportResult.ExportDescription.ExportStatus",
          "StringEquals": "IN_PROGRESS",
          "Next": "Wait"
        }
      ],
      "Default": "Fail"
    },
    "Fail": {
      "Type": "Fail"
    },
    "Success": {
      "Type": "Succeed"
    }
  }
}

StepFunctionsの実行時パラメータ

key value
tableArn DynamoDBのARN
s3Bucket エクスポート先のS3バケット 1
s3Prefix エクスポート先のS3パスの先頭文字列 1
  • エクスポート先のS3のパス構成
    s3://${s3Bucket}/${s3Prefix}/AWSDynamoDB/{DynamoDBが付けるエクスポートのユニークID}/data/
input.json
{
  "tableArn": "arn:aws:dynamodb:ap-northeast-1:12345XXXXXXX:table/test_table",
  "s3Bucket": "dynamodb-export",
  "s3Prefix": "test-table"
}

StepFunctions実行後

s3://dynamodb-export/test-table/AWSDynamoDB/01635316601377-6eb6d317/data/1

この場所にDynamoDBのデータがエクスポートされています。

最後に

Lambda Functionをなるべく使わない構成はポータビリティ性が高く、運用保守面でも大きなメリットになります。
また、Terraformで管理を行っていますが、作成するリソースが少なくなる点もメリットでした。

  • StepFunctions by Terraform


  1. エクスポート先のS3パスs3://${s3Bucket}/${s3Prefix}/AWSDynamoDB/{DynamoDBが付けるエクスポートのkey}/data/ 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?