0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Athena managed connectors で DynamoDB と Aurora PostgreSQL を SQL で結合してみた

0
Posted at

はじめに

今回は以下のアップデートの紹介をしてみます!

2026 年 4 月 23 日に Amazon Athena の managed connectors が発表されました。
Amazon DynamoDB や PostgreSQL、MySQL など 12 のデータソースに対して、フェデレーテッドクエリの設定が簡単になったみたいです。

これまでフェデレーテッドクエリを使うには、自分のアカウントに AWS Lambda 関数をデプロイして管理する必要がありました。

managed connectors では、その Lambda を Athena 側で管理してくれるので、自分のアカウントに Lambda が作られません。コンソールからデータソースを選んで接続情報を入れるだけで、フェデレーテッドクエリが使えるようになります。

今回はこの managed connectors を使って、DynamoDB と Aurora のデータを SQL で結合してみます!

この記事で学べること

  • DynamoDB と Aurora をデータソースとして設定する手順
  • AWS Lake Formation の権限設定
  • 異なるデータソース間の JOIN クエリの実行方法

前提知識・条件

  • 検証日: 2026 年 4 月 25 日
  • リージョン: ap-northeast-1(東京)

やってみた

準備:DynamoDB と Aurora の準備

まずは、DynamoDB と Amazon Aurora PostgreSQL Serverless v2(以降、Aurora)を AWS CDK で構築しました。ソースコードはこちらです。

VPC は NAT Gateway 付きの Private サブネット構成にしています。

後述しますが、Athena の managed connector が VPC 内に ENI を作成してデータソースに接続します。

そのため、NAT Gateway 経由でのインターネットアクセスが必要でした。

データ投入

今回の検証では、EC サイトを想定した 2 つのテーブルを用意しました。

DynamoDB には注文データを格納する orders テーブルを作成しました。

カラム キー 備考
order_id S PK 注文 ID
customer_id S SK 顧客 ID
product_id S なし 商品 ID(GSI/LSI なし)
quantity N なし 数量
order_date S なし 注文日
status S なし pending/shipped/delivered

Aurora には商品マスタの products テーブルを作成しました。

カラム キー 備考
product_id VARCHAR PK 商品 ID
product_name VARCHAR 商品名
category VARCHAR カテゴリ
price NUMERIC 価格

ポイントとして、DynamoDB 側の product_idstatus には GSI/LSI を付けていません。
これらのカラムで WHERE 句を書くと Scan モードになるので、その動作も確認してみます。

DynamoDB の orders テーブルにはサンプルの注文データを 5 件投入しました。

order_id customer_id product_id quantity order_date status
ORD-001 CUST-001 PROD-001 2 2026-04-01 shipped
ORD-002 CUST-002 PROD-002 1 2026-04-02 pending
ORD-003 CUST-001 PROD-003 3 2026-04-03 shipped
ORD-004 CUST-003 PROD-001 1 2026-04-04 delivered
ORD-005 CUST-002 PROD-004 5 2026-04-05 shipped

Aurora の products テーブルには商品マスタを 4 件投入しました。

product_id product_name category price
PROD-001 ワイヤレスマウス PC周辺機器 3980
PROD-002 USBキーボード PC周辺機器 5480
PROD-003 モニターアーム オフィス用品 12800
PROD-004 ウェブカメラ PC周辺機器 8900

今回はこの 2 つのテーブルに存在する product_id をキーにテーブル結合したクエリを発行してみます。

データカタログ用 IAM ロールの準備

managed connectors でデータソースを作成する際に、AWS Glue Data Catalog IAM ロールが必要です。
Athena がデータソースへアクセスする際に、このロールが使用されます。

このロールの設定が少し面倒で、トライアンドエラーで作成していく必要がありました。

結果、以下のような形になっています。

まず、信頼ポリシーには glue.amazonaws.comlakeformation.amazonaws.com の 2 つを設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "glue.amazonaws.com",
          "lakeformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

権限ポリシーは用途ごとに分けて付与しました。

まず、managed connector の実行に必要な Glue 関連の権限です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ManagedConnector",
        "glue:GetConnection",
        "glue:GetConnections",
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetCatalog",
        "glue:GetCatalogs"
      ],
      "Resource": "*"
    }
  ]
}

DynamoDB へのアクセスにはマネージドポリシー AmazonDynamoDBReadOnlyAccess を使いました。

Spill 用 Amazon S3 バケットへのアクセス権限も必要です。
フェデレーテッドクエリの結果が大きい場合、一時的に S3 にデータを退避(Spill)する仕組みがあり、そのためのバケットです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket",
        "s3:DeleteObject",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::<spill-bucket-name>",
        "arn:aws:s3:::<spill-bucket-name>/*"
      ]
    }
  ]
}

Aurora(PostgreSQL)用には、AWS Secrets Manager と VPC ネットワーク関連の権限も追加します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:<region>:<account-id>:secret:<secret-name>-*"
    }
  ]
}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribeSubnets",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeVpcs"
      ],
      "Resource": "*"
    }
  ]
}

データソースの作成(DynamoDB / PostgreSQL)

Athena コンソールの「データソースとカタログ」から「データソースの作成」を選択します。

CleanShot 2026-04-25 at 06.24.34.png

DynamoDB と PostgreSQL それぞれでデータソースを作成しました。

CleanShot 2026-04-25 at 06.25.08.png

CleanShot 2026-04-25 at 07.03.00.png

DynamoDB 側の設定はシンプルです。データソースとして「Amazon DynamoDB」を選択し、データソース名と IAM ロール、Spill 用 S3 バケットを指定するだけです。

CleanShot 2026-04-25 at 06.29.44-1.png

Aurora 側は VPC 関連の設定が加わります。ホスト、ポート、データベース名、Secrets Manager のシークレット、VPC、サブネット、セキュリティグループを指定します。

CleanShot 2026-04-25 at 07.16.44.png

セキュリティグループは、Athena コネクタ用の SG を CDK で作成しておきました。
Aurora 側の SG には、このコネクタ用 SG からのポート 5432 のインバウンドを許可しています。

作成が完了すると、Athena コンソールの「AWS Glue データカタログ」一覧にデータソースが表示されます。

Lake Formation の権限設定

managed connectors で作成されたフェデレーテッドカタログは Lake Formation で権限管理されます。

クエリを実行するユーザーに対して、カタログ・データベース・テーブルの各レベルで権限を付与する必要があります。

今回はCLI で権限を付与しています。

DynamoDB 側の例です。

# カタログレベル
aws lakeformation grant-permissions \
  --principal '{"DataLakePrincipalIdentifier":"<sso-role-arn>"}' \
  --resource '{"Catalog":{"Id":"<account-id>:athena-dynamodb2"}}' \
  --permissions "ALL" --region ap-northeast-1

# データベースレベル
aws lakeformation grant-permissions \
  --principal '{"DataLakePrincipalIdentifier":"<sso-role-arn>"}' \
  --resource '{"Database":{"CatalogId":"<account-id>:athena-dynamodb2","Name":"default"}}' \
  --permissions "ALL" --region ap-northeast-1

# テーブルレベル(全テーブル)
aws lakeformation grant-permissions \
  --principal '{"DataLakePrincipalIdentifier":"<sso-role-arn>"}' \
  --resource '{"Table":{"CatalogId":"<account-id>:athena-dynamodb2","DatabaseName":"default","TableWildcard":{}}}' \
  --permissions "ALL" --region ap-northeast-1

PostgreSQL 側も同様ですが、public スキーマがデータベースとして認識されるため、testdbpublic の両方に権限付与が必要でした。

aws lakeformation grant-permissions \
  --principal '{"DataLakePrincipalIdentifier":"<sso-role-arn>"}' \
  --resource '{"Catalog":{"Id":"<account-id>:athena-postgresql2"}}' \
  --permissions "ALL" --region ap-northeast-1

aws lakeformation grant-permissions \
  --principal '{"DataLakePrincipalIdentifier":"<sso-role-arn>"}' \
  --resource '{"Database":{"CatalogId":"<account-id>:athena-postgresql2","Name":"public"}}' \
  --permissions "ALL" --region ap-northeast-1

aws lakeformation grant-permissions \
  --principal '{"DataLakePrincipalIdentifier":"<sso-role-arn>"}' \
  --resource '{"Table":{"CatalogId":"<account-id>:athena-postgresql2","DatabaseName":"public","TableWildcard":{}}}' \
  --permissions "ALL" --region ap-northeast-1

動作確認(DynamoDB 単体)

まずは DynamoDB 単体でクエリしてみます。

SELECT * FROM "athena-dynamodb2"."default"."orders"

CleanShot 2026-04-26 at 04.43.39.png

5 件の注文データが返ってきました!

managed connector 経由で DynamoDB のデータを SQL で取得できています。

SuccessfulRequestLatency のメトリクスを見てみると、Scan で 29.4ms と出ているので、Scan で動いていることがわかります。

CleanShot 2026-04-26 at 04.49.57.png

大量データの場合は RCU の消費に注意が必要ですね。

動作確認(PostgreSQL 単体)

次に Aurora 側です。

SELECT * FROM "athena-postgresql2"."public"."products"

CleanShot 2026-04-26 at 04.56.04.png

商品マスタ 4 件が返ってきました。

動作確認(DynamoDB + PostgreSQL JOIN)

最後は、DynamoDB の注文データと Aurora の商品マスタを product_id で JOIN してみます。

SELECT o.order_id, o.customer_id, p.product_name, p.price, o.quantity
FROM "athena-dynamodb2"."default"."orders" o
JOIN "athena-postgresql2"."public"."products" p
  ON o.product_id = p.product_id

CleanShot 2026-04-26 at 05.19.47.png

DynamoDB と Aurora のデータが 1 つの SQL で結合できました!

まとめ

今回の検証で以下のようなことがわかりました。

  • Athena managed connectors を使って、DynamoDB と Aurora のデータを 1 つの SQL で結合できた
  • managed connectors では自アカウントへの Lambda デプロイが不要になり、セットアップが簡単になった
  • ただし IAM ロール、Spill 用 S3 バケット、Lake Formation の権限設定は引き続き必要
  • VPC 内のデータソースに接続する場合は NAT Gateway 付きの Private サブネット構成が必要
    • VPCエンドポイントでも可能かと思います

このアップデート前はもっと大変だったのかなと思いつつ、データカタログ用 IAM ロールの準備等がまだまだ複雑だなぁとは感じますが、良いアップデートだな! と思い、紹介しました。

誰かのお役に立てば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?