Amazon Athena から DynamoDB へ接続してみた
検証で、Athena から DynamoDB へ接続する機会がありましたため、備忘録です。
過去に以下の弊社ブログがありますが、2025年版ということで改めて記載します。
(準備) DynamoDB テーブルの作成とデータ投入
以下のキー設定を指定し、その他はデフォルト設定で作成します。
- パーティションキー:device_id
- ソートキー:なし
テーブル作成完了
作成したテーブルにデータを登録します。今回は、10件登録します。
サンプルデータの JSON を AI に頼んで作成してもらいます。
sample_data.json
dynamodb にデータを登録するため、以下のカラムを持つ 10項目分のデータを作成してください。
- device_id(device1, device2... となる連番)
- device_name(デバイス1, デバイス2... となる連番)
- installed_at(2022-04-25 12:12:12 のような形式でランダムな時刻)
AI:承知しました。以下に列挙します。
{
"YOUR_TABLE_NAME": [
{
"PutRequest": {
"Item": {
"device_id": {"S": "device1"},
"device_name": {"S": "デバイス1"},
"installed_at": {"S": "2022-04-25 12:12:12"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device2"},
"device_name": {"S": "デバイス2"},
"installed_at": {"S": "2022-05-15 09:30:45"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device3"},
"device_name": {"S": "デバイス3"},
"installed_at": {"S": "2022-06-03 14:25:33"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device4"},
"device_name": {"S": "デバイス4"},
"installed_at": {"S": "2022-07-18 11:45:20"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device5"},
"device_name": {"S": "デバイス5"},
"installed_at": {"S": "2022-08-22 16:08:55"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device6"},
"device_name": {"S": "デバイス6"},
"installed_at": {"S": "2022-09-10 10:15:40"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device7"},
"device_name": {"S": "デバイス7"},
"installed_at": {"S": "2022-10-05 13:50:28"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device8"},
"device_name": {"S": "デバイス8"},
"installed_at": {"S": "2022-11-12 15:33:17"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device9"},
"device_name": {"S": "デバイス9"},
"installed_at": {"S": "2022-12-01 08:22:05"}
}
}
},
{
"PutRequest": {
"Item": {
"device_id": {"S": "device10"},
"device_name": {"S": "デバイス10"},
"installed_at": {"S": "2023-01-15 17:40:30"}
}
}
}
]
}
※ 上記 sample_data.json 内の YOUR_TABLE_NAME は自身が作成した DynamoDB テーブル名を指定してください。
Cloudshell に上記 JSON ファイルをアップロードし、以下コマンドを実行します。
aws dynamodb batch-write-item --request-items file://sample_data.json
DynamoDB コンソールより、10項目登録されていることを確認。ちゃんと中身も想定通りになっています。
(準備) S3 バケットの作成
後ほど Athena 側で設定する、スピルバケット用の S3 バケットを作成しておきます。
スピルフォルダも作っておきます。
スピルバケットの説明については、下記をご参照ください。
Amazon Athena DynamoDB コネクタ
...
spill_bucket – Lambda 関数の上限を超えたデータに対して、Amazon S3 バケットを指定します。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connectors-dynamodb.html
※1:Spill Bucketとは、Lambda関数が返すデータがLambdaの制限を超過した場合に、超過分のデータをAthenaが読み取れるようにデータを一時的に保存するS3バケットです。
https://dev.classmethod.jp/articles/connecting-from-amazon-athena-to-dynamodb-via-federated-query/
Simple Storage Service (Amazon S3) – データコネクタは、Athena のクエリ結果が保存される Amazon S3 内の場所にクエリ結果を書き込むほか、Amazon S3 のスピルバケットにも書き込みます。この Amazon S3 の場所に対する接続と許可が必要です。各コネクタと S3 ライフサイクル設定にディスクへのスピル暗号化を使用して、不要になったスピルデータを期限切れにすることをお勧めします。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/federated-queries.html
Athena 設定
“データソースの作成” を選択します。
DynamoDB を選びます。
任意の名前でデータソース名を指定します。
「AWS Glue 接続の詳細」設定をします。Glue 接続については、下記ドキュメントを参照ください。
2024 年 12 月 3 日以降に作成された Athena データソースコネクタは、AWS Glue 接続を使用します。
[AWS Glue 接続の詳細] に、必要な情報を入力します。接続には、特定のデータソースに接続するために必要なプロパティが含まれます。必要なプロパティは、接続タイプによって異なります。コネクタに関連するプロパティの詳細については、「使用可能なデータソースコネクタ」を参照してください。
当画面にて、先ほど作成したスピルバケットの spill フォルダを指定します。それ以外はデフォルト設定にします。
Lambda については、”新しい実行ロールを作成して使用” を選択します。
「確認と作成」画面で最終チェックし、”データソースの作成” を選択します。
データソースとカタログの画面に接続タイプを DynamoDB とする、データソースが作成されました。
以下がデータソースの詳細画面です。詳細画面からも分かる通り、データソースに接続するための Lambda 関数が接続されていることを確認できます。
実際に Lambda 関数一覧からも作成されていることを確認できました。
なお、データソース詳細画面 -> 関連付けられたデータベース の "default" データベースを選択し、詳細を開くと、準備段階で作成した DynamoDB テーブル sunagawa-athena-dynamodb-test が関連づけられていることを確認できます。
Athena から DynamoDB へクエリする
Athenaコンソール -> クエリエディタ の画面からクエリを実施します。
最初のクエリを実行する前に、クエリ結果を格納するバケットが必要なので、「設定」タブの "管理" を選択し、設定します。
今回は、適当な S3 バケット sunagawa-athena-dynamodb-test-athena-query-result を作成し、それを指定しました。
S3 も指定できたので、クエリエディタから以下の SQL を実行してみます。(左側のデータソースのプルダウンから自分が作成したデータソースを選んで実施してください。)
クエリが完了し、DynamoDB テーブルに事前に登録しておいた項目が返ってきていることが確認できました。
使用したクエリ文
SELECT "device_id", "installed_at", "device_name" FROM "default"."sunagawa-athena-dynamodb-test"
終わりに
今回は、Athena から DynamoDB へ接続してみました。
Federated Query という言葉を何となくでしかわかっていなかったため、今回試してみて、Lambda 経由でデータソースにアクセスするやり方なんだと理解できました。
本記事がお役に立てば幸いです。
参考文献