shiichan

Amazon Redshift Data API がロングポーリング対応!セッション管理もバッチ実行も自由自在になったよ!

やっほー、しぃちゃんだよ!今日は AWS の Data API まわりでうれしいアップデートを見つけたから、さっそく紹介しちゃうね!

AWS What's New aws.amazon.com

なにが発表されたの?

AWS の What's New で、Amazon Redshift Data API に新しい機能が 3 つ追加されたと発表されたよ。API 呼び出しの回数を減らしたり、セッションの状態を見えるようにしたり、バッチ実行をもっと柔軟にしたりする改善なんだって。

具体的にはこの 3 つだよ。

  • ロングポーリング — SQL の実行結果を取得するまで、ポーリングを繰り返さなくて済むようになる
  • ListSessions — アクティブなセッションを一覧表示・フィルタできるようになる
  • 柔軟なバッチ実行 — BatchExecuteStatement のステートメントを個別に実行できるようになる

今までどうだったの?

今までの Data API は、SQL ステートメントを実行したあと、その結果が返ってくるまで DescribeStatement や GetStatementResult を自分で何度も呼び出して状態をチェックする必要があったの。SQL が終わったかどうか分からないから、一定間隔でポーリングし続けるしかなくて、API 呼び出しの回数がどうしても増えがちだったんだよね。

セッションを使い回すアプリケーションも、どのセッションがまだ有効なのかを自分のアプリ側で管理しなきゃいけなかったの。Data API 側にセッション一覧を確認する手段がなかったから、セッション ID を外部でトラッキングするしかなかったんだ。

さらに BatchExecuteStatement は、バッチの中の 1 つのステートメントが失敗すると、バッチ全体がロールバックされる仕様だったの。ETL パイプラインや管理スクリプトみたいに、一部が失敗してもほかは進めたいケースだと、これがけっこう困りものだったんだよね。

これで何が変わるの?

まずロングポーリングを使うと、ExecuteStatement・BatchExecuteStatement・DescribeStatement・GetStatementResult・GetStatementResultV2 に WaitTimeSeconds パラメータを指定するだけで、SQL が終わるまで API 側が応答を待ってくれるようになるの。何度もポーリングを繰り返さなくてよくなるから、API 呼び出しの回数をぐっと減らせるんだよ。

ListSessions では、ステータス・コンピュートターゲット・データベースでフィルタしながらアクティブなセッションを一覧表示できるようになるの。セッション ID を自前で管理しなくても、Data API 側に聞けば今どんなセッションが動いてるか分かるようになるんだね。

そして BatchExecuteStatement に ExecutionMode パラメータ (AUTO_COMMIT モード) が追加されて、バッチ内の各ステートメントを独立したトランザクションとして実行できるようになるの。1 つ失敗してもバッチ全体がロールバックされなくなるから、ETL パイプラインや管理スクリプトみたいに一部の完了でも許容できる処理にはうれしい変更だね。

深く潜ってみよう

もう少し細かいところも見てみるね。

WaitTimeSeconds パラメータは、次の 5 つの API に指定できるよ。

  • ExecuteStatement
  • BatchExecuteStatement
  • DescribeStatement
  • GetStatementResult
  • GetStatementResultV2

これらに WaitTimeSeconds を指定すると、SQL ステートメントが終端状態(成功・失敗など)に達するまで、レスポンスを返すのを遅らせてくれるの。ポーリングの間隔をアプリ側で管理しなくても、必要なタイミングで結果を受け取れるってわけだね。

BatchExecuteStatement は、今回 SqlParameter の配列も受け取れるようになったよ。パラメータを一度定義しておけば、バッチ内のどのステートメントからでも参照できるから、クエリごとにリテラル値を埋め込む必要がなくなるの。同じパラメータを使い回すバッチ処理では、地味だけどうれしい改善だと思うな。

これらの新機能は、Amazon Redshift Provisioned と Serverless の両方で使えて、すべての AWS 商用リージョンと AWS GovCloud (US) リージョンで一般提供が始まっているよ。

まとめ

  • ロングポーリング: WaitTimeSeconds パラメータで、SQL 完了までポーリング不要に
  • ListSessions: ステータス・コンピュートターゲット・データベースでセッションをフィルタ・一覧表示
  • 柔軟なバッチ実行: ExecutionMode=AUTO_COMMIT で、1 ステートメントの失敗がバッチ全体のロールバックにならない
  • SqlParameter の配列で、バッチ内のパラメータ再利用が可能に

Data API を使ってアプリケーションを組んでる人や、ETL パイプライン・管理スクリプトを Redshift で回してる人には、地味だけど確実に効いてくるアップデートだと思うよ!