[アップデート]Step FunctionsでDynamoDB + Glue を試してみた #reinvent

はじめに

こんにちは、福岡オフィス所属、IT推進室の井手です。

re:Invent 2018にて、Step Functionsの連携サービスが大幅に追加されました。
[神アップデート]Step Functionsが新たに8つのマネージドサービスと連携可能になりました! #reinvent

今回は、新規に追加されたDynamoDBとGuleの連携を試してみたいと思います。

構成

 今回やりたい事は以下です。GlueのJob呼び出しだけでは面白くない(というより性質上前後がある)ので、DynamoDBも合わせて試してみました。実際の活用としては、何かしらのListなどをDynamoDBに突っ込んで、それをGlueでETL処理、というイメージです。

やってみた

前提

 ※クローラ、Job、Step Functions設定時に利用するIAMロールについては都度使用するリソースに対するポリシーをアタッチしています。
 ※作成方法は本題ではない&各name入力程度なので省略しています。

(データソース)DynamoDBのテーブル作成

作成方法については省略しますが、以下のように作成しました。

(データターゲット)S3 Bucketの作成

こちらも作成方法については省略しますが、以下のように作成しました。

GlueでJobの作成

 次に、先程作成したデータソースとデータターゲットをつなぐJobを作成します。が、その前にJobにはデータカタログが必要なのでそちらから作成していきます。全体の手順はざっくりと以下です。

1. データベースの作成

 またまた作成方法については省略しますが、以下のように作成しました。

 

2. テーブルの作成(クローラ使用)

 次に、クローラを使用してテーブルを作成します。

 
 
画面のフロー通りに進んで行き以下のような設定で作成しました。

 

オンデマンド実行し、クローラが無事終了すればデータカタログは完了です。

3. Jobの作成

 ジョブの追加より作成します。

画面のフロー通りに進んで行き以下のような設定で作成しました。

 

※マッピングはid列だけでマッピングしています。  

Step Functionsの作成

やっと本題のStep Functionsの作成の作成まできました。

ステートマシンの定義は以下

{
  "StartAt": "PutItem",
  "States": {
   "PutItem": {
      "Type": "Task",
      "Resource": "arn:aws:states:::dynamodb:putItem",
      "Parameters": {
        "TableName": "test_glue_db",
        "Item": {
          "id": {"S": "1"}
        }
      },
      "ResultPath": "$.DynamoDB",
      "Next": "Glue StartJobRun"
   },
   "Glue StartJobRun": {
      "Type": "Task",
      "Resource": "arn:aws:states:::glue:startJobRun.sync",
      "Parameters": {
        "JobName": "test_job"
      },
      "End": true
    }
  }
}

Step Functionsの実行

 コンソールより実行してみます。

無事成功しました。

結果の確認

最後に、GlueによってS3 Bucketに出力されているか確認します。オブジェクトとダウンロード結果が以下です。

ちゃんとjsonで作成されていますね! 

さいごに

ETLというと色々方法が考えられると思いますが、re:invent内で参加したSessionでの事例にGlueが使用されている例をいくつか見ました。Step FunctionsでJobを呼び出せるようになった事で更に使用例が増えるのではと感じました。

参考にさせてもらった/他に追加された連携検証記事のリンク