使用查询编辑器 v2 计划查询 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用查询编辑器 v2 计划查询

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

创建计划以运行 SQL 语句
  1. 编辑器 
                Editor 视图中,选择 
                    Schedule 计划以创建运行 SQL 语句的计划。

  2. 在定义计划时,您需要提供以下信息。

    • 代入运行查询所需权限的 IAM 角色。此 IAM 角色还附加到您的集群或工作组。

    • Amazon Secrets Manager 或用于授权访问您的集群或工作组的临时凭证的身份验证值。数据 API 支持这些身份验证方法。有关更多信息,请参阅对计划查询进行身份验证

    • 您的数据库所在的集群或工作组。

    • 包含要查询的数据的数据库名称。

    • 计划查询的名称及其描述。查询编辑器 v2 将在您提供的计划查询名称前加上“QS2-”前缀。查询编辑器 v1 将在其计划查询名称前加上“QS-”前缀。

    • 要按计划运行的 SQL 语句。

    • 计划频率和重复选项,或定义计划的 cron 格式的值。有关更多信息,请参阅《Amazon CloudWatch Events 用户指南》中的 Cron 表达式

    • (可选)您可以启用标准 Amazon SNS 通知来监控计划查询。您可能需要确认您向 Amazon SNS 通知提供的电子邮件地址。在您收到的电子邮件中查找用于确认接收 Amazon SNS 通知的电子邮件地址的链接。有关更多信息,请参阅《Amazon Simple Notification Service 开发人员指南》中的电子邮件通知。如果您的查询正在运行,但您没有看到 SNS 主题中发布的消息,请参阅《Amazon EventBridge 用户指南》中的我的规则正在运行,但我没有看到任何消息发布到我的 Amazon SNS 主题

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

计划查询 
        Scheduled queries 视图列出了您的集群和工作组的所有计划查询。使用此视图,您可以显示计划查询的详细信息、激活或停用计划、编辑计划以及删除计划查询。查看查询详细信息时,还可以查看使用计划运行查询的历史记录。

注意

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

设置计划查询的权限

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

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

对于登录到查询编辑器 v2 的 IAM 用户,请使用 IAM 控制台(https://console.aws.amazon.com/iam/)编辑 IAM 用户。

  • 除了运行 Amazon Redshift 和查询编辑器 v2 操作的权限外,还要将 AmazonEventBridgeFullAccessAmazonRedshiftDataFullAccess Amazon 托管式策略附加到 IAM 用户。

  • 或者,为角色分配权限并将该角色分配给用户。

    附加一个策略,对于您在定义计划查询时指定的 IAM 角色的资源 ARN,该策略将允许 sts:AssumeRole 权限。有关代入角色的更多信息,请参阅《IAM 用户指南》中的向用户授予切换角色的权限

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

    { "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/)编辑 IAM 角色。

  • AmazonRedshiftDataFullAccessAmazonEventBridgeFullAccess Amazon 托管式策略附加到 IAM 角色。AmazonRedshiftDataFullAccess 托管式策略只允许使用键 RedshiftDataFullAccess 标记的 Redshift Serverless 工作组具有 redshift-serverless:GetCredentials 权限。

对计划查询进行身份验证

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

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

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

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

注意

您为其计划查询的任何 Redshift Serverless 工作组都必须使用键 RedshiftDataFullAccess 进行标记。有关更多信息,请参阅授予对 Amazon Redshift 数据 API 的访问权限

作为标记工作组的替代方法,您可以向 IAM 角色(随计划指定)添加允许 redshift-serverless:GetCredentials 的内联策略。例如:

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

使用此方法,为存储在 Amazon Secrets Manager 中的 secret-arn 提供一个密钥值。此密钥包含用于连接到数据库的凭证。在创建集群或工作组时,您可能已经使用适当的凭证创建了密钥。密钥必须使用键 RedshiftDataFullAccess 进行标记。如果标签键尚不存在,请使用 Amazon Secrets Manager 控制台进行添加。

有关最低权限的更多信息,请参阅《Amazon Secrets Manager 用户指南》中的使用 Amazon Secrets Manager 创建和管理密钥

临时凭证

使用此方法,在连接到集群中的数据库时,需提供您的数据库名称数据库用户值。在连接到工作组中的数据库时,只需提供您的数据库名称

连接到集群时,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" ] } ] }

设置查看计划查询历史记录的权限

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

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

{ "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" } ] }

监控计划查询

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

{ "Version": "2008-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 会发送 Amazon 通知电子邮件。以下示例显示了使用 Amazon SNS 通知主题 may25a-SNS,为 Amazon Web Services 账户 123456789012 中在 Amazon Web Services 区域 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

计划查询设置故障排除

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

查询未运行

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

计划历史记录未显示

用于登录 Amazon 控制台的 IAM 用户或 IAM 角色未添加到用于计划查询的 IAM 角色的信任策略中。

当使用 Amazon Secrets Manager 供计划的查询进行连接时,请确认已使用键 RedshiftDataFullAccess 标记密钥。

查询历史记录状态为 Failed

查看 SYS_QUERY_HISTORY 系统视图,了解有关查询失败原因的详细信息。一个常见问题是,用于运行查询的数据库用户或角色可能没有运行 SQL 所需的权限。有关更多信息,请参阅对计划查询进行身份验证

以下 SQL 查询 SYS_QUERY_HISTORY 视图以返回失败的查询。

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';

要了解失败的特定计划查询的详细信息,请参阅通过 Amazon CloudShell 查找有关计划查询的详细信息

通过 Amazon CloudShell 查找有关计划查询的详细信息

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

查看计划查询的结果
  1. 在 Amazon 控制台上,打开 Amazon CloudShell 命令提示符。有关 Amazon CloudShell 的更多信息,请参阅《Amazon CloudShell User Guide》中的What is Amazon CloudShell

  2. 代入计划查询的 IAM 角色。要代入该角色,请在查询编辑器 v2 中找到与计划查询关联的 IAM 角色,然后在 Amazon CloudShell 中通过 Amazon CLI 命令使用它。例如,对于角色 scheduler,输入 Amazon 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" } }
  3. 使用代入 IAM 角色时显示的凭证在 Amazon CLI 中创建环境变量。您必须在这些令牌到期之前使用它们。例如,您可以在 Amazon CloudShell 中输入以下内容。

    export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY export AWS_SESSION_TOKEN=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY...
  4. 要查看失败查询的错误,请运行 Amazon 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" }

安排查询的演示

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