クエリのスケジュール設定 - Amazon Redshift

クエリのスケジュール設定

重要

Amazon Redshift クエリエディタ v2 は、クエリのスケジュールをサポートするようになりました。クエリエディタ v2 の使用をお勧めします。詳細については、「クエリエディタ v2 でのクエリのスケジューリング」を参照してください。

SQL ステートメントを実行するスケジュールを作成するには、Amazon Redshift コンソールのクエリエディターを使用します。ビジネスニーズに合った時間間隔で SQL ステートメントを実行するスケジュールを作成できます。スケジュールされたクエリが実行される時間になると、Amazon EventBridge によってクエリが開始されます。

SQL ステートメントを実行するスケジュールを作成するには
  1. コンソールとクエリエディタを開きます (クエリエディタの使用 を参照)。このクエリエディタは、プロビジョニングされたクラスターでのみ使用できます。

  2. [Schedule] (スケジュール) を選択して、SQL ステートメントを実行するスケジュールを作成します。

    スケジュールを定義する場合は、次の情報を指定します。

Amazon Redshift コンソールを使用して、スケジュールされたクエリを管理および更新することもできます。コンソールのバージョンによっては、スケジュールされたクエリが次の場所にリストされることがあります。

  • クラスタの詳細ページの [Schedules] (スケジュール) タブ。

  • クエリエディタの [Scheduled queries] (スケジュールされたクエリ) タブ。

これらの場所のいずれかから [Schedule name] (スケジュール名) を選択すると、スケジュールされたクエリの定義を表示および編集できます。

Amazon Redshift コンソールでクエリをスケジュールするためのアクセス権限の設定

クエリをスケジュールするには、スケジュールを定義する AWS Identity and Access Management (IAM) ユーザーと、スケジュールに関連付けられている IAM ロールを次のように設定する必要があります。

Amazon Redshift コンソールにログインした IAM ユーザーの場合、次の操作を行います。

  • AmazonEventBridgeFullAccess AWS マネージドポリシーを IAM ロールにアタッチします。

  • スケジュールされた SQL ステートメントを定義するときに指定する IAM ロールの sts:AssumeRole 権限を持つポリシーを添付します。

    次の例では、指定された IAM ロールを引き受けるポリシーを示します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeIAMRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::account-id:role/sql-statement-iam-role" } ] }

スケジューラーがクエリを実行できるように指定した IAM ロールについて、次の操作を行います。

  • この IAM ロールが EventBridge サービスプリンシパル (events.amazonaws.com) を指定していることを確認してください。以下に示しているのは、信頼関係の例です。

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

    EventBridge イベントの IAM ロールを作成する方法の詳細については、Amazon EventBridge スケジューラを使用するために必要なアクセス許可 を参照してください。

  • AmazonRedshiftDataFullAccess AWS マネージドポリシーを IAM ロールにアタッチします。

  • スケジュール履歴の表示をユーザーに許可するには、IAM ロールを編集して sts:AssumeRole アクセス許可を追加します。

次に示すのは、IAM ロールの信頼ポリシーの例です。

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

スケジュールされたクエリの認証

クエリをスケジュールするときは、クエリ SQL の実行時に、次のいずれかの認証方法を使用します。各メソッドでは、Amazon Redshift コンソールからの入力の組み合わせが異なる必要があります。

AWS Secrets Manager

この方法を使用して、AWS Secrets Manager に保存されている secret-arn のシークレット値を指定します。このシークレットには、データベースに接続するための認証情報が含まれます。シークレットにはキー RedshiftDataFullAccess のタグを付ける必要があります。

最小のアクセス許可についての詳細は、AWS Secrets Manager ユーザーガイドの「AWS Secrets Manager を使用したシークレットの作成と管理」を参照してください。

一時認証情報

この方法では、databaseおよびDB ユーザー値。

AmazonRedshiftDataFullAccess ポリシーは、redshift_data_api_user という名前のデータベースユーザーに redshift:GetClusterCredentials のアクセス許可を許可します。別のデータベースユーザーを使用して SQL ステートメントを実行する場合は、IAM ロールにポリシーを追加して redshift:GetClusterCredentials を許可します。次のポリシー例では、データベースユーザー awsusermyuser を許可しています。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "UseTemporaryCredentialsForAllDbUsers", "Effect": "Allow", "Action": "redshift:GetClusterCredentials", "Resource": [ "arn:aws:redshift:*:*:dbuser:*/awsuser", "arn:aws:redshift:*:*:dbuser:*/myuser" ] } ] }

クエリの終了時に実行される Amazon EventBridge ルールを作成する

クエリの終了時に通知を送信するイベントルールを作成できます。Amazon EventBridge コンソールを使用する手順については、「Amazon EventBridge ユーザーガイド」の「イベントに反応する Amazon EventBridge ルールの作成」を参照してください。イベントパターンの詳細については、Amazon EventBridge ユーザーガイドの「Amazon EventBridge イベントパターン」を参照してください。

例えば、以下のサンプルイベントは、クエリが FINISHED になるときに送信されます。

{ "version": "0", "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", "detail-type": "Redshift Data Statement Status Change", "source": "aws.redshift-data", "account": "123456789012", "time": "2020-12-22T17:00:00Z", "region": "us-west-1", "resources": [ "arn:aws:redshift:us-east-2:123456789:cluster:t1" ], "detail": { "statementId": "01bdaca2-8967-4e34-ae3f-41d9728d5644", "clusterId": "test-dataapi", "statementName": "awesome query", "state": "FINISHED", "pages": 5, "expireAt": "2020-12-22T18:43:48Z", "principal": "arn:aws:sts::123456789012:assumed-role/any", "queryId": 123456 } }

イベントは、イベントパターンルールを作成してフィルタリングできます。

{ "source": [ "aws.redshift-data" ], "detail-type": [ "Redshift Data Statement Status Change" ], "detail": { "state": [ "FINISHED" ] } }