

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 使用查询编辑器 v2 的计划查询
<a name="query-editor-v2-schedule-query"></a>

使用 Amazon Redshift 查询编辑器 v2，您可以自动执行 SQL 查询，使其按计划运行。计划查询是按指定时间或间隔自动运行的 SQL 语句，可让您高效管理重复性数据操作和分析任务。如果您想在 Amazon Redshift 环境中简化批处理、生成定期报告或维护数据管道，则可能需要计划查询。

计划查询有助于自动执行提取、转换和加载（ETL）工作流，用最新见解刷新控制面板，以及操作各种数据管理例程。以下页面详细介绍了创建、配置和管理计划查询以优化 Amazon Redshift 工作负载的过程。

# 使用查询编辑器 v2 创建查询计划
<a name="query-editor-v2-schedule-query-create"></a>

您可以使用 Amazon Redshift 查询编辑器 v2 创建运行 SQL 语句的计划。您创建一个计划，以便按照与您的业务需求相匹配的时间间隔运行 SQL 语句。当到了运行计划查询的时间时，查询由 Amazon EventBridge 启动并使用 Amazon Redshift Data API。

**创建计划以运行 SQL 语句**

1. 在**编辑器** ![\[Editor\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/qev2-align-left.png) 视图中，选择 ![\[Schedule\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/qev2-calendar.png) **计划**以创建运行 SQL 语句的计划。

1. 在定义计划时，您需要提供以下信息。
   + 代入运行查询所需权限的 IAM 角色。此 IAM 角色还附加到您的集群或工作组。
   + AWS Secrets Manager 或用于授权访问您的集群或工作组的临时凭证的身份验证值。数据 API 支持这些身份验证方法。有关更多信息，请参阅 [对计划查询进行身份验证](query-editor-v2-schedule-query-authentication.md)。
   + 您的数据库所在的集群或工作组。
   + 包含要查询的数据的数据库名称。
   + 计划查询的名称及其描述。查询编辑器 v2 将在您提供的计划查询名称前加上“QS2-”前缀。查询编辑器 v1 将在其计划查询名称前加上“QS-”前缀。
   + 要按计划运行的 SQL 语句。
   + 计划频率和重复选项，或定义计划的 cron 格式的值。有关更多信息，请参阅《Amazon CloudWatch Events User Guide》**中的 [Cron Expressions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)。
   + （可选）您可以启用标准 Amazon SNS 通知来监控计划查询。您可能需要确认您向 Amazon SNS 通知提供的电子邮件地址。在您收到的电子邮件中查找用于确认接收 Amazon SNS 通知的电子邮件地址的链接。有关更多信息，请参阅《Amazon Simple Notification Service 开发人员指南》**中的[电子邮件通知](https://docs.aws.amazon.com/sns/latest/dg/sns-email-notifications.html)。如果您的查询正在运行，但您没有看到 SNS 主题中发布的消息，请参阅《Amazon EventBridge 用户指南》**中的[我的规则正在运行，但我没有看到任何消息发布到我的 Amazon SNS 主题](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-troubleshooting.html#eb-no-messages-published-sns)。

1. 选择**计划查询**以保存和激活计划，并将计划添加到**计划查询**视图中的查询列表。

**计划查询** ![\[Scheduled queries\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/images/qev2-calendar.png) 视图列出了您的集群和工作组的所有计划查询。使用此视图，您可以显示计划查询的详细信息、激活或停用计划、编辑计划以及删除计划查询。查看查询详细信息时，还可以查看使用计划运行查询的历史记录。

**注意**  
计划查询的运行仅在**计划历史记录**列表中列出 24 小时。按计划运行的查询不会出现在查询编辑器 v2 的**查询历史记录**视图中。

## 安排查询的演示
<a name="query-editor-v2-schedule-query-demo"></a>

有关安排查询的演示，请观看以下视频。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/gTw0XUpO8sw/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/gTw0XUpO8sw)


# 设置计划查询的权限
<a name="query-editor-v2-schedule-query-permissions"></a>

要计划查询，定义计划的 AWS Identity and Access Management（IAM）用户以及与计划关联的 IAM 角色必须配置了使用 Amazon EventBridge 和 Amazon Redshift Data API 的 IAM 权限。要接收来自计划查询的电子邮件，还必须配置可选指定的 Amazon SNS 通知。

以下内容描述了使用 AWS 托管式策略提供权限的任务，但根据您的环境，您可能需要缩小允许的权限范围。

对于登录到查询编辑器 v2 的 IAM 用户，请使用 IAM 控制台（[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)）编辑 IAM 用户。
+ 除了运行 Amazon Redshift 和查询编辑器 v2 操作的权限外，还要将 `AmazonEventBridgeFullAccess` 和 `AmazonRedshiftDataFullAccess` AWS 托管式策略附加到 IAM 用户。
+ 或者，为角色分配权限并将该角色分配给用户。

  附加一个策略，对于您在定义计划查询时指定的 IAM 角色的资源 ARN，该策略将允许 `sts:AssumeRole` 权限。有关代入角色的更多信息，请参阅《IAM 用户指南》**中的[向用户授予切换角色的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html)。

  以下示例显示了代入账户 `123456789012` 中的 IAM 角色 `myRedshiftRole` 的权限策略。IAM 角色 `myRedshiftRole` 也是附加到运行计划查询的集群或工作组的 IAM 角色。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AssumeIAMRole",
              "Effect": "Allow",
              "Action": "sts:AssumeRole",
              "Resource": [
                  "arn:aws:iam::123456789012:role/myRedshiftRole"
              ]
          }
      ]
  }
  ```

------

  更新用于计划查询的 IAM 角色的信任策略，以允许 IAM 用户代入此角色。

  ```
  {
              "Sid": "AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "AWS": "arn:aws:iam::123456789012:user/myIAMusername"
              },
              "Action": "sts:AssumeRole"
          }
      ]
  }
  ```

对于您指定为允许运行计划查询的 IAM 角色，请使用 IAM 控制台（[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)）编辑 IAM 角色。
+ 将 `AmazonRedshiftDataFullAccess` 和 `AmazonEventBridgeFullAccess` AWS 托管式策略附加到 IAM 角色。`AmazonRedshiftDataFullAccess` 托管式策略只允许使用键 `RedshiftDataFullAccess` 标记的 Redshift Serverless 工作组具有 `redshift-serverless:GetCredentials` 权限。

# 对计划查询进行身份验证
<a name="query-editor-v2-schedule-query-authentication"></a>

当您计划查询时，在 SQL 运行时使用下列身份验证方法之一。每种方法都需要查询编辑器 v2 上的不同输入组合。用于运行 SQL 语句的数据 API 支持这些身份验证方法。

用于运行查询的数据库用户或角色必须具有必要的数据库权限。例如，要授予对于表 `mytable` 的 `IAMR:MyRedshiftQEv2Scheduler` 权限，请运行以下 SQL 命令。

```
GRANT all ON TABLE mytable TO "IAMR:MyRedshiftQEv2Scheduler";
```

要查看集群或工作组中的数据库用户列表，请查询系统视图 `PG_USER_INFO`。

**注意**  
 您为其计划查询的任何 Redshift Serverless 工作组都必须使用键 `RedshiftDataFullAccess` 进行标记。有关更多信息，请参阅 [授予对 Amazon Redshift 数据 API 的访问权限](data-api-access.md)。  
作为标记工作组的替代方法，您可以向 IAM 角色（随计划指定）添加允许 `redshift-serverless:GetCredentials` 的内联策略。例如：  

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "UseTemporaryCredentialsForAllServerlessWorkgroups",
            "Effect": "Allow",
            "Action": "redshift-serverless:GetCredentials",
            "Resource": [
                "arn:aws:redshift-serverless:*:*:workgroup/*"
            ]
        }
    ]
}
```

**AWS Secrets Manager**  
使用此方法，为存储在 AWS Secrets Manager 中的 **secret-arn** 提供一个密钥值。此密钥包含用于连接到数据库的凭证。在创建集群或工作组时，您可能已经使用适当的凭证创建了密钥。密钥必须使用键 `RedshiftDataFullAccess` 进行标记。如果标签键尚不存在，请使用 AWS Secrets Manager 控制台进行添加。有关创建密钥的信息，请参阅[为数据库连接凭证创建密钥](redshift-secrets-manager-integration-create.md)。  
有关最低权限的更多信息，请参阅《AWS Secrets Manager 用户指南》**中的[使用 AWS Secrets Manager 创建和管理密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html)。

**临时凭证**  
使用此方法，在连接到集群中的数据库时，需提供您的**数据库名称**和**数据库用户**值。在连接到工作组中的数据库时，只需提供您的**数据库名称**。  
连接到集群时，`AmazonRedshiftDataFullAccess` 策略允许名为 `redshift_data_api_user` 的数据库用户拥有对 `redshift:GetClusterCredentials` 的权限。如果要使用其他数据库用户运行 SQL 语句，请向附加到您集群的 IAM 角色添加策略以允许 `redshift:GetClusterCredentials`。以下示例策略允许数据库用户 `awsuser` 和 `myuser`。    
****  

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

# 设置查看计划查询历史记录的权限
<a name="query-editor-v2-schedule-query-view-history"></a>

要允许用户查看计划查询历史记录，请编辑 IAM 角色（随计划指定）**信任关系**以添加权限。

以下是 IAM 角色中的信任策略示例，该策略允许 IAM 用户 *myIAMusername* 查看计划查询历史记录。您可以选择允许 IAM 角色拥有 `sts:AssumeRole` 权限，而不是允许 IAM 用户拥有此权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "redshift.amazonaws.com",
                    "redshift-serverless.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "events.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/myIAMusername"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

# 监控计划查询
<a name="query-editor-v2-schedule-query-sns"></a>

对于您指定用于发送电子邮件通知的 Amazon SNS 主题，请使用查询编辑器 v2 创建 Amazon SNS 主题，方法是导航到 **SNS 通知**部分，**开启**监控，然后使用**创建 SNS 主题**来创建主题。查询编辑器 v2 创建 Amazon SNS 主题，并将服务主体添加到 Amazon EventBridge 的访问策略中。以下是在 Amazon SNS 主题中创建的示例**访问策略**。在示例中，使用了 AWS 区域 *us-west-2*、AWS 账户 *123456789012* 以及 Amazon SNS 主题 *select-version-pdx-testunload*。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "Allow_Publish_Events",
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:us-west-2:123456789012:select-version-pdx-testunload"
    }
  ]
}
```

------

计划查询运行时，Amazon SNS 会发送 AWS 通知电子邮件。以下示例显示了使用 Amazon SNS 通知主题 *may25a-SNS*，为 AWS 账户 *123456789012* 中在 AWS 区域 *eu-north-1* 上运行的计划查询 *QS2-may25a* 发送到 *myemail@example.com* 的电子邮件。

```
{"version":"0","id":"8e4323ec-5258-7138-181b-91290e30ff9b","detail-type":"Scheduled Event","source":"aws.events","account":"123456789012","time":"2023-05-25T15:22:00Z",
                    "region":"eu-north-1","resources":["arn:aws:events:eu-north-1:123456789012:rule/QS2-may25a"],"detail":{}}

--
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe:
https://sns.eu-north-1.amazonaws.com/unsubscribe.html?SubscriptionArn=arn:aws:sns:eu-north-1:123456789012:may25a-SNS:0c1a3d05-39c2-4507-bc3d-47250513d7b0&Endpoint=myemail@example.com

Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support
```

# 计划查询设置故障排除
<a name="query-editor-v2-schedule-query-troubleshooting"></a>

如果您在计划查询时遇到问题，请考虑以下几点。

**查询未运行**  
检查计划中使用的 IAM 角色是否有权获取临时集群凭证。预置集群的权限为 `redshift:GetClusterCredentialsWithIAM`。Redshift Serverless 工作组的权限为 `redshift-serverless:GetCredentials`。

**计划历史记录未显示**  
用于登录 AWS 控制台的 IAM 用户或 IAM 角色未添加到用于计划查询的 IAM 角色的信任策略中。  
当使用 AWS Secrets Manager 供计划的查询进行连接时，请确认已使用键 `RedshiftDataFullAccess` 标记密钥。  
如果计划查询使用的是 AWS Secrets Manager 连接，则用于计划查询的 IAM 角色必须具有附加到该角色的等效托管策略 `SecretsManagerReadWrite`。

**查询历史记录状态为 `Failed`**  
查看 SYS\$1QUERY\$1HISTORY 系统视图，了解有关查询失败原因的详细信息。一个常见问题是，用于运行查询的数据库用户或角色可能没有运行 SQL 所需的权限。有关更多信息，请参阅 [对计划查询进行身份验证](query-editor-v2-schedule-query-authentication.md)。  
以下 SQL 查询 SYS\$1QUERY\$1HISTORY 视图以返回失败的查询。  

```
SELECT user_id, query_id, transaction_id, session_id, database_name, query_type, status, error_message, query_text 
FROM sys_query_history
WHERE status = 'failed';
```
要了解失败的特定计划查询的详细信息，请参阅[使用 AWS CloudShell 查看计划查询的结果](query-editor-v2-schedule-query-troubleshooting-cloudshell.md)。

# 使用 AWS CloudShell 查看计划查询的结果
<a name="query-editor-v2-schedule-query-troubleshooting-cloudshell"></a>

您可以使用 AWS CloudShell 查找有关计划查询的详细信息。您必须具有适当的权限才能运行 AWS CLI 命令，如以下过程所示。

**查看计划查询的结果**

1. 在 AWS 控制台上，打开 AWS CloudShell 命令提示符。有关 AWS CloudShell 的更多信息，请参阅《AWS CloudShell User Guide》**中的[What is AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)。

1. 代入计划查询的 IAM 角色。要代入该角色，请在查询编辑器 v2 中找到与计划查询关联的 IAM 角色，然后在 AWS CloudShell 中通过 AWS CLI 命令使用它。例如，对于角色 `scheduler`，输入 AWS STS 命令以代入计划查询所用的角色。

   ```
   aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/scheduler" --role-session-name "scheduler-test" 
   ```

   返回的凭证与以下内容类似。

   ```
   "Credentials": {
   "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
   "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
   "SessionToken": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY...",        
   "Expiration": "2023-08-18T18:19:44+00:00"
   },
   "AssumedRoleUser": {
   "AssumedRoleId": "AROA35B2NH6WBTP7ONL4E:scheduler-test",
   "Arn": "arn:aws:sts::123456789012:assumed-role/scheduler/scheduler-test"
   }
   }
   ```

1. 使用代入 IAM 角色时显示的凭证在 AWS CLI 中创建环境变量。您必须在这些令牌到期之前使用它们。例如，您可以在 AWS CloudShell 中输入以下内容。

   ```
   export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
   export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   export AWS_SESSION_TOKEN=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY...
   ```

1. 要查看失败查询的错误，请运行 AWS CLI 命令以描述语句。SQL 语句的 ID 来自查询编辑器 v2 中计划查询的**计划历史记录**部分显示的 **ID**。

   ```
   aws redshift-data describe-statement --id 130d2620-05d2-439c-b7cf-815d9767f513
   ```

   在本例中，计划的 SQL `select * from users limit 100` 会导致一个 SQL 错误，即 `users` 表不存在。

   ```
   {
   "CreatedAt": "2023-08-18T17:39:15.563000+00:00",
   "Duration": -1,
   "Error": "ERROR: relation \"users\" does not exist",
   "HasResultSet": false,
   "Id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
   "QueryString": "select * from users limit 100\n—RequestID=a1b2c3d4-5678-90ab-cdef-EXAMPLE22222; TraceID=1-633c5642-4039308d03f3a0ba53dbdf6f",
   "RedshiftPid": 1073766651,
   "RedshiftQueryId": 0,
   "ResultRows": -1,
   "ResultSize": -1,
   "Status": "FAILED",
   "UpdatedAt": "2023-08-18T17:39:16.116000+00:00",
   "WorkgroupName": "default"
   }
   ```