Amazon Redshift Data APIのセッション再利用機能を試す!

Amazon Redshift Data APIのセッション再利用機能を試す!

Clock Icon2024.10.11

AWS事業本部コンサルティング部の石川です。Amazon Redshift Data APIに新たに導入されたセッション再利用機能が利用可能になりました。本記事では、セッション再利用機能と実際に動作を確認しながら解説します。

https://aws.amazon.com/jp/about-aws/whats-new/2024/09/session-reuse-amazon-redshift-data-api/

Amazon Redshift Data APIとは

Amazon Redshift Data APIは、Amazon Redshiftに対してSQLクエリを実行するためのAPIサービスです。Amazon Redshift Data APIは、AWSが提供するAPIエンドポイントに接続してクエリを送信するため、データベースドライバーの管理や複雑な接続設定が不要となり、開発者やアナリストの作業が効率化されます。また、非同期処理のサポートや、IAM認証によるセキュリティ強化VPC外からのアクセス可能性など、柔軟性と安全性を両立させています。

セッション再利用機能とは

Data API のセッション再利用により、あるクエリ実行から別のクエリ実行までセッションを保持できるため、同じデータウェアハウスへの繰り返されるクエリでの接続設定のレイテンシーを短縮できます。

セッションコンテキストの保持は、クエリ実行間でセッションのコンテキストを維持できるため、同じデータウェアハウスへの繰り返しのクエリにおける接続設定のレイテンシーを削減します。これにより、効率的なクエリ処理が可能となります。

さらに、変数や一時テーブルなどのセッションコンテキスト上のオブジェクトを一度作成し、複数のクエリで再利用できるという利点があります。

また、SessionKeepAliveSecondsパラメータを使用することで、クエリ終了後にセッションを保持する時間を秒単位で指定できます。この機能により、ユーザーは自身のニーズに合わせてセッション保持時間をカスタマイズし、リソースの効率的な利用とクエリパフォーマンスの最適化を図ることができます。

セッション再利用機能を使ってSQLを実行する

クエリを実行するexecute-statementAPIを呼び出す際に、session-keep-alive-secondsオプションを「30」(秒)を指定してクエリを実行します。すると、標準出力にSessionIdが出力されます。

下記の例では、セッションスコープの一時テーブルを作成します。

$ aws redshift-data execute-statement \
>     --session-keep-alive-seconds 30 \
>     --sql "CREATE TEMP TABLE first_user AS SELECT * FROM users WHERE userid = (SELECT MIN(userid) FROM users);" \
>     --database dev \
>     --workgroup-name default-wg

{
    "CreatedAt": "2024-10-11T12:17:14.884000+00:00",
    "Database": "dev",
    "DbUser": "IAMR:cm-ishikawa",
    "Id": "263e2969-39e8-490b-be54-fb1926c9632e",
    "SessionId": "ae1e3228-2ac2-42ba-a836-7dd12604006f",
    "WorkgroupName": "default-wg"
}

30秒以内に、上記のコマンド実行で出力されたSessionIdsession-idオプションに指定して下記のコマンドを実行することで、上記のセッションが継続されます。同じセッションなのでに対する一時テーブルのクエリが成功することが確認できます。

$ aws redshift-data execute-statement \
>     --session-keep-alive-seconds 30 \
>     --sql "select * FROM first_user;" \
>     --session-id ae1e3228-2ac2-42ba-a836-7dd12604006f
{
    "CreatedAt": "2024-10-11T12:17:34.780000+00:00",
    "Database": "dev",
    "DbUser": "IAMR:cm-ishikawa",
    "Id": "7977453e-9f9d-4f51-b064-ebc93aabcfb3",
    "SessionId": "ae1e3228-2ac2-42ba-a836-7dd12604006f",
    "WorkgroupName": "default-wg"
}

念の為、SELECTの結果を確認しますと、セッションコンテキストが引き継がれ、一時テーブルに対するクエリが成功したことを確認できました。

$ aws redshift-data get-statement-result --id 7977453e-9f9d-4f51-b064-ebc93aabcfb3
{
    "Records": [
        [
            {
                "longValue": 1
            },
            {
                "stringValue": "JSG99FHE"
            },
:
:
:
        {
            "isCaseSensitive": false,
            "isCurrency": false,
            "isSigned": false,
            "label": "likemusicals",
            "length": 0,
            "name": "likemusicals",
            "nullable": 1,
            "precision": 1,
            "scale": 0,
            "schemaName": "pg_temp_7",
            "tableName": "first_user",
            "typeName": "bool"
        }
    ],
    "TotalNumRows": 1
}

なお、30秒を超えてしまうとセッションは無効となり、エラーになります。

$ aws redshift-data execute-statement \
>     --session-keep-alive-seconds 30 \
>     --sql "select * FROM first_user;" \
>     --session-id ae1e3228-2ac2-42ba-a836-7dd12604006f

An error occurred (ValidationException) when calling the ExecuteStatement operation: Session is not available

今回の例では、execute-statementAPIでしたが、BatchExecuteStatementAPIも同様の指定が可能です。

技術的な注意点

  • SessionKeepAliveSecondsの最大値は24時間です。
  • SessionKeepAliveSecondsパラメータは、クエリの実行が終了してからセッションを維持する時間を指定です。
  • Amazon Redshiftクラスターまたは Redshift Serverlessワークグループあたりの最大セッション数は500です。
  • 1つのセッションでは一度に1つのクエリのみ実行可能です。
  • 1 つのセッションで一度に実行できるクエリは 1 つだけで、セッションでクエリを並行して実行することはできません。
  • Data API は、特定のセッションのクエリをキューに入れることができません。

最後に

Amazon Redshift Data APIのセッション再利用機能は、データアクセスを大幅に簡素化し、アプリケーションの開発効率を向上させます。ETLワークフローの最適化やデータサイエンス作業の効率化など、より柔軟にクエリをできるようになります。

現状確認したところ、Boto3にAPIが追加されていることを確認しています。また、Step Functionsのexecute-statementタスクでサポートするようになると、ステートマシーンの中で一時テーブルを用いたエラーハンドリングが柔軟にできるようになるので今後が楽しみです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.