我正在嘗試排程查詢以在 Amazon Redshift 叢集中執行。該如何進行?
簡短描述
您可以使用查詢編輯器為佈建的 Amazon Redshift 叢集執行、檢視、儲存和排程 SQL 查詢。排程的查詢由 Amazon EventBridge 啟動。
解決方案
**備註:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本。
查詢編輯器許可
若要使用查詢編輯器,使用者必須擁有 Amazon Redshift 的最低許可集。如果您的叢集使用其他 AWS 服務,使用者也必須擁有這些服務的許可。例如,AWS Secrets Manager 機密和 AWS Key Management Service (AWS KMS) 金鑰。如需詳細資訊,請參閱使用 Amazon Redshift 主控台查詢編輯器所需的許可。
可以使用 AWS Identity and Access Management (IAM) 受管政策,根據 IAM 角色管理許可。如需詳細資訊,請參閱適用於 Amazon Redshift 的 AWS 受管 (預先定義) 政策。
若要排程查詢,與查詢相關聯的 IAM 使用者和角色必須具有管理查詢編輯器的許可。如需指示,請參閱設定許可以在 Amazon Redshift 主控台上排程查詢。
使用 AWS 管理主控台排程查詢
若要使用 AWS 管理主控台排程查詢,請依照下列步驟執行:
備註:
- 您必須使用查詢編輯器 v1 來排程查詢。
- 您只能在佈建的叢集中使用此查詢編輯器。
1. 開啟 Amazon Redshift 主控台。
2. 在導覽窗格中,選擇 Query editor (查詢編輯器)。
3. 依照指示連線至叢集中的資料庫。
4. 依照指示建立排程以執行 SQL 陳述式。
5. 如果將 AWS Secrets Manager 與 Amazon Redshift 搭配使用,請選擇您的機密。
6. 如果您使用臨時 IAM 使用者憑證,請選擇叢集並提供資料庫和使用者名稱。**備註:**IAM 使用者必須具有 GetClusterCredentials 許可,才能使用臨時憑證。
7. 選擇 Save (儲存)。
**備註:**如果您已開啟 Simple Notification Service (Amazon SNS),請確定 "events.amazonaws.com" 存在 "sns:Publish" API 動作。若要確認,請新增下列陳述式:
{
"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}"
}
將 SQL 陳述式與 EventBridge 搭配使用來排程查詢
可以使用 EventBridge 和 Amazon Redshift Data API 來排程 SQL 陳述式。在下列範例中,排程設定為每 5 分鐘重新整理一次目前的事件。
1. 建立名為 "scheduled-refresh-currentEvents" 的 EventBridge 事件規則,並使用類似下列內容的 Cron 或 Rate 運算式,將其排程為每 5 分鐘執行一次:
aws events put-rule \
--name scheduled-refresh-currentEvents \
--schedule-expression "cron(0/5 * * * ? *)"
2. 使用您最愛的文字編輯器 (包含叢集、角色和 AWS Secrets Manager ARN),建立並儲存名為 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
}
}
]
}
3. 使用儲存的 JSON 檔案建立事件目標:
aws events put-targets --cli-input-json file://refreshCurrentEvents.json
4. 若要移除目標並刪除規則,請執行下列命令:
aws events remove-targets --rule scheduled-refresh-currentEvents --ids scheduled-refresh-currentEvents
aws events delete-rule --name scheduled-refresh-currentEvents
檢視 SQL 狀態和結果
若要檢視查詢狀態和結果,請依照下列步驟執行:
1. 開啟 Amazon Redshift 主控台。
2. 在導覽窗格中,選擇 Query editor (查詢編輯器),然後選擇 Scheduled queries (排程的查詢)。
3. 選擇您的查詢名稱。
4. 在 Schedule history (排程歷史記錄)中,記下 ID。您將在步驟 7 中需要此 ID。
5. 若要擷取查詢結果,請擔任 IAM 角色,該角色用於使用類似下列內容的 AWS CLI 命令 assume-role 排程查詢:
aws sts assume-role --role-arn "<Role ARN>" --role-session-name AWSCLI-Session
輸出返回存取金鑰 ID、私密存取金鑰和工作階段字符。
6. 使用下列匯出命令設定環境變數:
export AWS_ACCESS_KEY_ID=<RoleAccessKeyID>
export AWS_SECRET_ACCESS_KEY=<RoleSecretKey>
export AWS_SESSION_TOKEN=<RoleSessionToken>
7. 使用類似下列內容的 AWS CLI 命令 redshift-data 擷取結果:
aws redshift-data get-statement-result --id <ID> --region <Region>
相關資訊
為什麼我無法連線到 Amazon Redshift 查詢編輯器?
使用 Amazon Redshift Data API 與 Amazon Redshift 叢集互動
建立依照排程執行的 Amazon EventBridge 規則