🔍
Athena の名前付きクエリをAPIから実行したい(理論編)
概要
Amazon Athena には、SQLを事前に保存しておき、後から自由に呼び出す「名前付きクエリ」と呼ばれる機能が存在します。
「名前付きクエリ」をAPIから実行する方法を調べたので、まとめました。
動作の確認も行っており、結果は以下拙著に記載しています。
利点
- SQLを、アプリケーション内にハードコードする必要がない
- 名前付きクエリとして Athena に保管
- SQL更新の際も、Athena に保存したSQLを更新するだけでよく、アプリケーションの更新は不要
- プログラムから クエリ実行 & 結果取得まで行うことで、クエリ結果を使用した後続処理を記述できる
- こっちは、利点というかユースケース
仕組み
よくある、 非同期のバッチ処理構造です。
クエリ実行からクエリ結果取得まで、以下のような流れで進みます。
- 名前付きクエリを用意
- 名前付きクエリ実行
- 処理完了まで待機
- 時折進捗を確認
- クエリ結果を要求
実現方法
調べた限り、以下二つの方法がありました。
- 名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する
- Athena Prepared Statement 機能を活用する
いずれも、SQL を事前に登録することは共通です。
クエリを実行する方法に、差異があります。
名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する
事前に名前付きクエリを用意します。
select * from "test"."worker";
get-named-query
API を使用することで、事前に用意した名前付きクエリのSQL文を取得できます。
後は、 start-query-execution
API を使用して、取得したSQL文を実行します。
-
start-query-execution
では?
を使用した、クエリのパラメータ化が利用可能 - クエリのパラメータ化の詳細は、以下公式ドキュメントを参照
Athena Prepared Statement 機能を活用する
Athena には、 RDB が提供する「静的プレースホルダー」の同じ、 Prepared Statement(準備済みステートメント)という機能が備わっています。
Prepared Statementは、以下の流れで実行します。
-
PREPARE
ステートメントで SQL をプリコンパイル -
EXECUTE
ステートメントで、 プリコンパイルした SQL を実行
この機能を活用し、以下の流れで、APIから実行します。
-
PREPARE
ステートメントを事前に一度だけ実行し、 Prepared Statement として登録しておく -
EXECUTE
ステートメントを名前付きクエリで保存しておき、前述した「名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する」と同じ手順で実行する
各実現方法の違い
調べた限りでは、大きな違いは見られませんでした。
手法 | クエリのパラメータ化を利用できるか? | SQLインジェクションは成功するか?(※) |
---|---|---|
名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する | 利用可 | 失敗 |
thena Prepared Statement 機能を活用する | 利用可 | 失敗 |
使い分けるとしたら、プレースホルダーを使用するか否か、で分けるのが、個人的にはしっくりきました。
- 使用しない => 名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する
- 使用する => Athena Prepared Statement 機能を活用する
Discussion