🔍

Athena の名前付きクエリをAPIから実行したい(理論編)

2024/06/08に公開

概要

Amazon Athena には、SQLを事前に保存しておき、後から自由に呼び出す「名前付きクエリ」と呼ばれる機能が存在します。

「名前付きクエリ」をAPIから実行する方法を調べたので、まとめました。

動作の確認も行っており、結果は以下拙著に記載しています。

利点

  • SQLを、アプリケーション内にハードコードする必要がない
    • 名前付きクエリとして Athena に保管
    • SQL更新の際も、Athena に保存したSQLを更新するだけでよく、アプリケーションの更新は不要
  • プログラムから クエリ実行 & 結果取得まで行うことで、クエリ結果を使用した後続処理を記述できる
    • こっちは、利点というかユースケース

仕組み

よくある、 非同期のバッチ処理構造です。

名前付きクエリの仕組み

クエリ実行からクエリ結果取得まで、以下のような流れで進みます。

  1. 名前付きクエリを用意
  2. 名前付きクエリ実行
  3. 処理完了まで待機
    • 時折進捗を確認
  4. クエリ結果を要求

実現方法

調べた限り、以下二つの方法がありました。

  • 名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する
  • Athena Prepared Statement 機能を活用する

いずれも、SQL を事前に登録することは共通です。

クエリを実行する方法に、差異があります。

名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する

事前に名前付きクエリを用意します。

select * from "test"."worker";

get-named-query API を使用することで、事前に用意した名前付きクエリのSQL文を取得できます。

後は、 start-query-execution API を使用して、取得したSQL文を実行します。

Athena Prepared Statement 機能を活用する

Athena には、 RDB が提供する「静的プレースホルダー」の同じ、 Prepared Statement(準備済みステートメント)という機能が備わっています。

Prepared Statementは、以下の流れで実行します。

  • PREPARE ステートメントで SQL をプリコンパイル
  • EXECUTE ステートメントで、 プリコンパイルした SQL を実行

この機能を活用し、以下の流れで、APIから実行します。

各実現方法の違い

調べた限りでは、大きな違いは見られませんでした。

手法 クエリのパラメータ化を利用できるか? SQLインジェクションは成功するか?(※)
名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する 利用可 失敗
thena Prepared Statement 機能を活用する 利用可 失敗

使い分けるとしたら、プレースホルダーを使用するか否か、で分けるのが、個人的にはしっくりきました。

  • 使用しない => 名前付きクエリとして保存したSQL文を取得し、手元からSQLを実行する
  • 使用する => Athena Prepared Statement 機能を活用する

参考文献

Discussion