EventBridgeスケジューラを使ってRedshift Serverlessに定期クエリを実行してみる

2023.01.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、八木です。

Redshiftに定期的にクエリを実行したいケースは多いのではないでしょうか。
今回はRedshift Serverlessに対して、EventBridgeスケジューラを使って定期クエリを実行する方法をご紹介します。

先にまとめ

  • Redshift Serverlessではクエリエディタ(v1)を使って定期クエリを実行することができない
  • EventBridgeスケジューラを使えば、Redshift Serverlessで定期クエリを実行することができる
  • ただしEventBridgeスケジューラではクエリのエラーが検出できないため注意

Redshiftで定期的にクエリを実行する方法

Redshiftを含むDWHでクエリを定期的にクエリを実行するには、Apache Airflowなどのワークフロー管理ツールを利用することが多いかと思います。
しかし管理リソースが増えたりと手間もかかるため、手軽にクエリをスケジュールするにはEventBridgeを利用することが可能です。

プロビジョンドクラスターに対してはクエリエディタ(v1)を利用してクエリスケジュール(実態はスケジュール実行のEventBridgeルール)を作成することが可能ですが、Redshift Serverlessに対応していません。

そこで今回利用するのが、EventBridgeスケジューラです。この機能は2022年10月にリリースされたばかりの機能で、スケジュール実行のEventBridgeルールと比べてより多彩なターゲットアクションを持っています。
この中のRedshift Data APIターゲットを使うことで、Redshift Serverlessに対してもクエリを実行することが可能になりました。

やってみた

ということで、早速動かしてみました。

前提

  • Redshift Serverlessが作成済みである

Redshiftユーザの作成

Redshift Data APIの認証方法は「Secrets Managerを利用したユーザ名・パスワード認証」と「IAMを利用した一時認証」がありますが、今回はSecrets Managerを使用します。

まずRedshiftにCREATE USERの権限を持つユーザでログインし、EventBridge用のRedshiftユーザを作成します。

CREATE USER eb_user_name PASSWORD 'eb_user_password';

Secrets Managerの作成

作成したRedshiftユーザの認証情報をSecrets Managerに保存します。

Secrets Managerのコンソールで「新しいシークレットを保存する」からRedshiftユーザの認証情報を保持するシークレットを作成します。

シークレットのタイプに「その他のシークレットのタイプ」を選択し、キー/値のペアにはusername,passwordでRedshiftユーザのユーザ名、パスワードをそれぞれ指定します。

EventBridgeスケジューラ用のIAMロールの作成

Redshift Data APIの利用権限を持つ、EventBridgeスケジューラ用のIAMロールを作成します。
以下のカスタム信頼ポリシーでIAMロールを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Effect": "Allow",
      "Principal": {
          "Service": "scheduler.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}


また、許可ポリシーにはAdministratorAccessを指定しました。
実際の運用には強すぎる権限なので、必要な権限のみに調整してください。

EventBridgeスケジューラの作成

EventBridgeコンソールからスケジューラを作成します。

今回の例ではスケジュールのパターンで5分ごとに実行するよう設定します。

「ターゲットの詳細」で「Amazon Redshift Data」→「ExecuteStatement」を選択します。


「入力」には以下のようなJSONを指定します。

{
  "WorkgroupName": "default",
  "Database": "dev",
  "Sql": "SELECT 1 as id, 'yagi' as name;",
  "SecretArn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:dev/redshift-scheduled-query-demo-urk1UZ"
}

WorkgroupNameにはRedshift Serverlessのワークグループ名、Databaseにはクエリを実行したいデータベース名、Sqlには実行したいSQLを指定します。また、SecretArnには先ほど作成したSecrets ManagerのARNを指定します。

アクセス許可には先に作成したIAMロールを選択します。

以上の設定を確認後、EventBridgeスケジューラを作成します。

余談ですが、今回は単一のクエリを事項するためにExecuteStatement APIを利用しましたが、複数のクエリを実行する場合にはBatchExecuteStatement APIを代わりに利用することができます。

確認

EventBridgeスケジューラが起動するのを待った後、クエリ履歴を確認してみます。

dev=# select user_id, query_id, transaction_id, session_id, database_name, status, start_time, end_time, execution_time, error_message, query_text from SYS_QUERY_HISTORY where user_id = '104' order by start_time limit 10;
 user_id | query_id | transaction_id | session_id | database_name |   status   |         start_time         |          end_time          | execution_time | error_message |                                                query_text
---------+----------+----------------+------------+---------------+------------+----------------------------+----------------------------+----------------+---------------+----------------------------------------------------------------------------------------------------------
     104 |  5201756 |         116906 | 1073766717 | dev           | success    | 2023-01-10 09:40:31.695689 | 2023-01-10 09:40:31.697187 |              0 |               | SET application_name = 'Amazon Redshift Data API - 2c3bc1e8-c1ca-46a5-ab7b-d0debda9428e - DataAPISingle'
     104 |  5201757 |         116907 | 1073766717 | dev           | success    | 2023-01-10 09:40:31.741247 | 2023-01-10 09:40:31.742829 |              0 |               | SELECT pg_backend_pid()
     104 |  5201758 |         116908 | 1073766717 | dev           | success    | 2023-01-10 09:40:31.805927 | 2023-01-10 09:40:31.807268 |              0 |               | SELECT 1 as id, 'yagi' as name;
     104 |  5201759 |         116910 | 1073766717 | dev           | success    | 2023-01-10 09:40:31.89581  | 2023-01-10 09:40:31.897129 |              0 |               | SELECT pg_last_query_id()
(4 rows)

EventBridgeスケジューラに設定した以下のクエリが実行されていることが確認できました。

SELECT 1 as id, 'yagi' as name;

また、Data APIによって自動的に実行される他のクエリも確認できました。

注意点

今回紹介した方法は、EventBridgeからクエリを実行するのみであり、クエリが成功したか失敗したかを検知することはできません。例えば定期クエリに影響があるテーブルのスキーマに変更があった場合、実行自体は正常に行われますが、中身のクエリは失敗します。EventBridge側では実行が行われたかどうかしか検出できないため、クエリが失敗したことに気づくことができません。
クエリの失敗を検出したい場合は、Step FunctionsやApache Airflowなどのワークフロー管理ツールを利用しましょう。

最後に

今回はEventBridgeスケジューラを利用して、Redshift Serverlessに定期的にクエリを実行する方法をご紹介しました。
実際の運用では、エラー検出は重要なため、ワークフローを利用することが多いかと思います。
ユースケースに応じて使い分けて行きましょう。

以上、八木でした!

参考リンク

Amazon Redshift Data API の使用 - Amazon Redshift
ExecuteStatement - Amazon Redshift Data API