Cross-Account Data Integration from DynamoDB to AWS Glue Database with Zero-ETL

Zero-ETLを使ってみたけど色々つまずく箇所が多かったので残しておきます!

構築したい処理

AWS Glueの機能「Zero-ETL integrations」を使って、sourceアカウントにあるDynamoDBのデータをtargetアカウント(cross account先)のGlue Database(S3 bucket)に出力させた

DynamoDB Tableで発生したデータの更新は、ニアリアルタイム(15min)でS3のデータに反映されAthenaから閲覧できる状態になる

詰まった箇所

  • マネージメントコンソールの不具合に遭遇
  • Zero-ETL integrationsをCLIから設定
  • Zero-ETL integrationsのStatusがなかなか変わらない

追記 2025/3/21

「マネージメントコンソールの不具合に遭遇」で記載した、「Next」ボタンを押しても何も反応がない事象については、2025/2/28ごろAWSから修正が完了した旨の報告を受けました。
Nextボタンを押すと正常に画面遷移が行われることを確認済みです。
この記事の記載は記録目的として当時の状態のまま残しておきます。

マネージメントコンソールの不具合に遭遇

マネージメントコンソールから「Glue」-> 「Zero-ETL integrations」-> 「Create integration」-> 「Select source typeでDynamoDBを選択」-> 「Configure source and target」へ遷移
ここでTargetを別AWSアカウントのARNを入力することができる

が、しかし「Next」ボタンを押しても何も反応がなく画面遷移も行われない
AWSさんに問い合わせしたところマネージメントコンソールの不具合だった
なのでCLIからzetlの設定をすることに…

Zero-ETL integrationsをCLIから設定

必要な作業(下記の順序で実施しました)

下準備
Sourceアカウントで
DynamoDBのpermission設定
Targetアカウントで
IAM Role作成
Glue Database作成(s3 locationの設定あり)
Glue data catalog permission
CLI実行(Cloud Shell)
TargetアカウントでCLIコマンドを実行しTarget側のZero-ETL設定作成
SourceアカウントでCLIコマンドを実行しSource側のZero-ETL設定作成

参考:
Prerequisites for setting up a zero-ETL integration – AWS Glue
Configuring a source for a zero-ETL integration

IAM Role作成(詳細は省略)

「glue Catalog, Databse, tableにアクセスするための権限」や
「Glue Databse に設定されているS3 Locationへデータを出力するための権限」をつけたRoleを作成

Glue data catalog permissionの参考設定

{
  "Version" : "2012-10-17",
  "Statement" : [  {
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::<source-aws-account-id>:root"
    },
    "Action" : "glue:CreateInboundIntegration",
    "Resource" : [ "arn:aws:glue:ap-northeast-1:<target-aws-account-id>:catalog",
                   "arn:aws:glue:ap-northeast-1:<target-aws-account-id>:database/output_glue_db"
                 ]
  }, {
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "glue.amazonaws.com"
    },
    "Action" : "glue:AuthorizeInboundIntegration",
    "Resource" : [ "arn:aws:glue:ap-northeast-1:<target-aws-account-id>:catalog",
                   "arn:aws:glue:ap-northeast-1:<target-aws-account-id>:database/output_glue_db"
                 ]
  }, 
  #### 以降の設定は、必要かどうか不明
  {
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "glue.amazonaws.com"
    },
    "Action" : [ "glue:UpdateTable", "glue:CreateTable", "glue:GetDatabase", "glue:GetTable" ],
    "Resource" : [ "arn:aws:glue:ap-northeast-1:<target-aws-account-id>:database/output_glue_db",
                   "arn:aws:glue:ap-northeast-1:<target-aws-account-id>:table/*"
                 ]
  } ]
}

CLI実行(Cloud Shell)

TargetアカウントのCloud Shellから実行

aws glue create-integration-resource-property \
--resource-arn arn:aws:glue:ap-northeast-1:<target-aws-account-id>:database/output_glue_db \
--target-processing-properties RoleArn=arn:aws:iam::<target-aws-account-id>:role/zetl-glue-role

参考: create-integration-resource-property

SourceアカウントのCloud Shellから実行

aws glue create-integration \
--integration-name zetl-from-cli \
--source-arn arn:aws:dynamodb:ap-northeast-1:<source-aws-account-id>:table/test_table \
--target-arn arn:aws:glue:ap-northeast-1:<target-aws-account-id>:database/output_glue_db

参考: create integration

これが両方成功するとSource, Targetアカウントの両方にZero-ETLの設定が作成され、マネージメントコンソールからStatusを確認できる
最初はActiveになっているが途中で失敗(status: Needs attention)になるケースがある
TargetのS3にデータが出力されている場合は成功している

Zero-ETL integrationsのStatusがなかなか変わらない

背景
CLIからZero-ETLの設定を作成後、StatusがNeeds attentionとなりIAM, Catalog Permissionまわりの設定をいじくり回していました
10minくらい経つと自動でrecoverして、エラーメッセージが変わり、それを繰り返していたのですが
全ての設定はちゃんと完了したはずなのにエラーメッセージが変わらないケースが発生

対応
CLIから新しくZero-ETLの設定を追加したら処理が成功した
なので自動recoverがちゃんと動いているかは不明です

まとめ

CLIの実行について、「どのコマンドをどのアカウント側で実行するのか」「どの順序で実行するのか」がわからずジタバタしていました
クロスアカウントでZero-ETL(zetl)使うケースの参考情報が少なかったので誰かの参考になれば嬉しいです