スキップしてコンテンツを表示

Amazon Redshift クラスターでクエリをスケジュールする方法を教えてください。

所要時間3分
0

クエリをスケジュールし、Amazon Redshift クラスターで実行したいです。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

クエリエディタ v2 を使用すると、プロビジョニングされた Amazon Redshift クラスターで SQL クエリを実行、表示、保存したり、スケジュールしたりできます。

クエリエディタのアクセス許可を設定する

スケジュールされたクエリを作成する前に、AWS Identity and Access Management (IAM) ロールとアクセス許可を正しく設定する必要があります。スケジュールされたクエリでは、Amazon EventBridge がスケジュール通りにクエリを開始し、Amazon Redshift Data API がクラスターでクエリを実行する必要があります。

スケジュールを作成する IAM ユーザーとクエリを実行する IAM ロールの両方に、適切なアクセス許可が必要です。

IAM ユーザーアクセス

AmazonRedshiftDataFullAccessAmazonEventBridgeFullAccess などのポリシーをアタッチします。

より具体的なアクセス許可を含むカスタムポリシーを作成してもかまいません。詳細については、「クエリをスケジュールするためのアクセス許可を設定する」を参照してください。

クエリの実行ロール

スケジュールされたクエリを実行するには、Amazon Redshift クラスターまたは Amazon Redshift Serverless ワークグループ用の IAM ロールを特定するか、作成します。

次に、Amazon Redshift がロールを引き受け、スケジュールしたアクションを実行できるようにするために、AmazonRedshiftDataFullAccessAmazonEventBridgeFullAccess などのポリシーをアタッチします。

詳細については、「Amazon Redshift で ID ベースのポリシー (IAM ポリシー) を使用する」を参照してください。

ロール設定を引き受ける

ロールの信頼ポリシーを更新し、スケジュールを行う側のプリンシパルがそのロールを引き受けられるようにします。次に、Amazon Redshift コンソールまたは AWS CLI コマンド modify-cluster-iam-roles を使用し、ロールを Amazon Redshift クラスターまたは Amazon Redshift Serverless ワークグループにリンクさせます。

データベース認証

IAM ロールがアクセスできる AWS Secrets Manager シークレットに認証情報を保存します。

適切なタグを追加して、Amazon Redshift Data API を使用できるようにします。IAM ロールを設定し、Amazon Redshift の一時的な認証情報を取得します。クラスターまたはワークグループの IAM ロールはプリンシパルを信頼する必要があります。データベースユーザーには、必須のアクセス許可が必要です。

詳細については、「スケジュールされたクエリを認証する」を参照してください。

Amazon Redshift コンソールでクエリをスケジュールする

次の手順を実行します。

  1. Amazon Redshift コンソールを開きます。
  2. ナビゲーションペインで [エディタ] を選択し、[クエリエディタ V2] を選択します。
  3. クラスター内のデータベースに接続します
  4. SQL ステートメントを実行するクエリスケジュールを作成します
  5. (オプション) Amazon Redshift で Secrets Manager を使用している場合は、シークレットを選択します。
  6. (オプション) 一時的な IAM ユーザー認証情報を使用している場合は、クラスターを選択し、データベースとユーザー名を指定します。

注: GetClusterCredentials アクションの呼び出しには、最小権限セットが必要です。

新しく作成したスケジュールを確認するには、次の手順を実行します。

  1. Amazon Redshift コンソールを開きます。
  2. ナビゲーションペインで [エディタ] を選択し、[クエリエディタ V2] を選択します。
  3. [スケジュールされたクエリ] を選択します。

Amazon Simple Notification Service (Amazon SNS) 通知を有効にすると、クエリの実行ステータスを監視できます。

Amazon SNS を有効化した場合は、events.amazonaws.com に対する Publish API が存在することを確認してください。

events.amazonaws.com に対する Publish アクションを含むアクセスポリシーの例:

{
  "Sid": "Allow_Publish_Events",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:us-east-1:{ACCOUNT_ID}:{SNS_TOPIC_NAME}"
}

詳細については、「スケジュールされたクエリを監視する」を参照してください。

EventBridge でクエリをスケジュールする

EventBridge と Amazon Redshift Data API を使用すると、SQL ステートメントをスケジュールできます。

次の手順を実行します。

  1. scheduled-refresh-currentEvents という名前の EventBridge イベントルールを定義します。

  2. EventBridgeコンソールを使用して、そのイベントルールを定期的または特定の時間に実行するようにスケジュールします。または、次の AWS CLI コマンド put-rule を実行します。

    aws events put-rule \
    --name scheduled-refresh-currentEvents \
    --schedule-expression "cron(0/5 * * * ? *)"

    注: 5 は、更新間隔に必要な時間 (分単位) に置き換えてください。

  3. テキストエディタを使用して次の refreshCurrentEvents.json という JSON ファイルを作成し、保存します。

    {
      "Rule": "scheduled-refresh-currentEvents",
      "EventBusName": "default",
      "Targets": [
        {
          "Id": "scheduled-refresh-currentEvents",
          "Arn": "Clsuter ARN",
          "RoleArn": "Role ARN",
          "RedshiftDataParameters": {
            "SecretManagerArn": "Secrets Manager ARN",
            "Database": "Database Name",
            "Sql": "REFRESH MATERIALIZED VIEW currentEvents;",
            "StatementName": "scheduled-refresh-currentEvents",
            "WithEvent": true
          }
        }
      ]
    }

    注: Cluster ARNRole ARNSecrets Manager ARN を実際の ARN 値で置き換えます。

  4. 次の put-targets コマンドを実行し、保存した JSON ファイルを使用してイベントターゲットを作成します。

    aws events put-targets --cli-input-json file://refreshCurrentEvents.json
  5. 次の remove-targets コマンドを実行してターゲットを削除します。

    aws events remove-targets --rule scheduled-refresh-currentEvents --ids scheduled-refresh-currentEvents
    
  6. 次の delete-rule コマンドを実行してルールを削除します。

    aws events delete-rule --name scheduled-refresh-currentEvents

SQL のステータスと結果を確認する

次の手順を実行します。

  1. Amazon Redshift コンソールを開きます。

  2. ナビゲーションペインで [エディタ] を選択し、[クエリエディタ V2] を選択します。

  3. [スケジュールされたクエリ] を選択します。

  4. 該当するクエリを選択します。

  5. [スケジュール履歴]ID を書き留めておきます。この値は後で使用します。

  6. クエリ結果を取得するには、次の assume-role コマンドを実行します。

    aws sts assume-role --role-arn "Role ARN" --role-session-name Example Session Name

    注: Role ARN をクエリのスケジュールに使用するロールの ARN に、Example Session Name を実際のセッション名に置き換えます。コマンドの出力は、アクセスキー ID、シークレットアクセスキー、およびセッショントークンを返します。

  7. 次のエクスポートコマンドを実行して環境変数を設定します。

    export AWS_ACCESS_KEY_ID=ExampleRoleAccessKeyID
    export AWS_SECRET_ACCESS_KEY=ExampleRoleSecretAccessKey
    export AWS_SESSION_TOKEN=ExampleSessionToken

    注: 例内の値は全て、実際の値に置き換えてください。

  8. get-statement-result を指定して redshift-data コマンドを実行すると、結果を取得できます。

    aws redshift-data get-statement-result --id ID --region Region

    注: 実際のものでそれぞれ、ID をステートメント ID に、Region を AWS リージョンに置き換えてください。

関連情報

Amazon Redshift で AmazonRedshiftQueryEditor に接続できない理由を知りたいです

Amazon Redshift Data API を使用して Amazon Redshift クラスターを操作する

Amazon EventBridge でスケジュールに従って実行するルールを作成する

AWS公式更新しました 1年前
コメントはありません