使用身份增强 IAM 角色会话连接到 Redshift - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

从补丁 198 开始,Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息,请参阅博客文章

使用身份增强 IAM 角色会话连接到 Redshift

您可以使用 IAM Identity Center 提供对 Amazon Redshift 集群和无服务器工作组的联合访问权限。这种方法可让用户使用其 Identity Center 凭证进行身份验证。

Amazon Redshift 提供 GetIdentityCenterAuthToken API 操作来生成包含用户身份信息的授权令牌。这些 API 同时可用于预置集群和无服务器工作组。通过令牌,可以使用现有的 Identity Center 设置对 Amazon Redshift 数据库进行无缝单点登录访问。

先决条件

在将 Identity Center 身份验证与 Amazon Redshift 结合使用之前,请确保您具备以下各项:

  • Identity Center 设置:您的账户必须使用用户身份和相应的应用程序分配配置了 IAM Identity Center。有关设置说明,请参阅设置 IAM Identity Center

    重要

    如果要连接到 Redshift,则必须使用 redshift:connect 范围。

  • 身份增强凭证:您的应用程序必须使用包含嵌入式用户身份信息的身份增强凭证。有关更多信息,请参阅使用身份增强 IAM 角色会话

  • IAM 权限:您的 IAM 角色或用户必须具有调用 GetIdentityCenterAuthToken API 和访问指定集群或工作组的权限。所需权限:

    • 对于预置集群:对集群 ARN(格式:arn:aws:redshift:region:account:cluster:cluster-name)具有 redshift:GetIdentityCenterAuthToken

    • 对于无服务器工作组:对工作组 ARN(格式:arn:aws:redshift-serverless:region:account:workgroup/workgroup-name)具有 redshift-serverless:GetIdentityCenterAuthToken

  • 兼容的驱动程序:使用支持 Identity Center 授权令牌的 Amazon Redshift JDBC 或 ODBC 驱动程序:

Identity Center 身份验证的工作原理

Amazon Redshift 的 Identity Center 身份验证使用以下工作流程:

  1. 您的应用程序使用包含嵌入式用户身份信息的身份增强凭证调用 GetIdentityCenterAuthToken API。

  2. Amazon Redshift 验证 Identity Center 身份,并生成范围限定于特定集群或工作组的加密授权令牌。请参阅示例 IAM 策略。

  3. 您的应用程序使用此令牌连接到指定的 Amazon Redshift 集群或工作组。

  4. Amazon Redshift 数据面板验证令牌,并根据 Identity Center 用户在 Identity Center 应用程序中的权限来授予访问权限。

重要

此 API 需要身份增强凭证。有关更多信息,请参阅使用身份增强 IAM 角色会话

如果您在没有身份增强凭证的情况下调用 API,则会收到 UnsupportedOperationFault 错误。

GetIdentityCenterAuthToken API 操作

Amazon Redshift 提供了两个单独的 GetIdentityCenterAuthToken API 操作:一个用于预置集群,另一个用于无服务器工作组。这两个操作具有相同的名称,但接受的参数因目标资源类型而异。

适用于预置集群的 GetIdentityCenterAuthToken

对于预置的 Amazon Redshift 集群,请在 Amazon Redshift 服务中使用 GetIdentityCenterAuthToken API 来生成授权令牌。

请求语法

{ "ClusterIds": [ "string" ] }

请求参数

ClusterIds

令牌将有权访问的 Amazon Redshift 集群标识符的列表。该令牌只能用于对在此列表中指定的集群进行身份验证。

类型:字符串数组

长度约束:最少 1 个项目。最多 20 个项目。

是否必需:是

CLI 示例

示例:获取单个集群的授权令牌

aws redshift get-identity-center-auth-token \ --cluster-ids my-redshift-cluster

示例:获取多个集群的授权令牌

aws redshift get-identity-center-auth-token \ --cluster-ids my-cluster-1 my-cluster-2

适用于无服务器工作组的 GetIdentityCenterAuthToken

对于 Amazon Redshift 无服务器工作组,请在 Amazon Redshift Serverless 服务中使用 GetIdentityCenterAuthToken API 来生成授权令牌。

请求语法

{ "WorkgroupNames": [ "string" ] }

请求参数

WorkgroupNames

令牌将有权访问的 Amazon Redshift Serverless 工作组名称的列表。该令牌只能用于对在此列表中指定的工作组进行身份验证。

类型:字符串数组

长度约束:最少 1 个项目。最多 20 个项目。

是否必需:是

CLI 示例

示例:获取单个工作组的授权令牌

aws redshift-serverless get-identity-center-auth-token \ --workgroup-names my-workgroup

示例:获取多个工作组的授权令牌

aws redshift-serverless get-identity-center-auth-token \ --workgroup-names workgroup-1 workgroup-2

响应语法

这两个 API 都返回相同的响应结构:

{ "AuthorizedToken": "string", "ExpirationTime": "timestamp" }

响应参数

AuthorizedToken

一个加密的授权令牌,其中包含用户身份信息以及已授权集群或工作组的列表。此令牌应被视为敏感数据。

类型:字符串

ExpirationTime

令牌到期的日期和时间(UTC 时间)。令牌自生成之时起 1 小时内有效。

类型:时间戳

响应示例

{ "AuthorizedToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNjQwOTk1MjAwLCJleHAiOjE2NDA5OTg4MDAsImNsdXN0ZXJzIjpbIm15LWNsdXN0ZXIiXX0...", "ExpirationTime": "2024-01-01T12:00:00Z" }

驱动程序集成

Amazon Redshift 驱动程序通过直接使用令牌来支持 Identity Center 身份验证:

直接使用令牌

调用 GetIdentityCenterAuthToken API 以获取令牌后,请将 IdpTokenAuthPluginSUBJECT_TOKEN 令牌类型结合使用。

连接配置:

plugin_name = com.amazon.redshift.plugin.IdpTokenAuthPlugin token_type = SUBJECT_TOKEN token = {encrypted_token_from_api_response}

有关 Identity Center 身份验证插件和驱动程序配置的详细信息,请参阅连接到 Amazon Redshift 集群

Java 代码示例

使用 Identity Center 身份验证进行连接的 Java 代码示例:

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; // Get token from GetIdentityCenterAuthToken API String token = "your_encrypted_token_from_api_response"; // Configure connection properties Properties props = new Properties(); props.setProperty("user", "your_username"); props.setProperty("plugin_name", "com.amazon.redshift.plugin.IdpTokenAuthPlugin"); props.setProperty("token_type", "SUBJECT_TOKEN"); props.setProperty("token", token); // Connect to Redshift String url = "jdbc:redshift://your-cluster.region.redshift.amazonaws.com:5439/your_database"; try (Connection conn = DriverManager.getConnection(url, props)) { // Use connection System.out.println("Connected successfully!"); } catch (SQLException e) { e.printStackTrace(); }

IAM 策略要求

要将 Identity Center 身份验证与 Amazon Redshift 结合使用,除了连接到 Amazon Redshift 集群和工作组所需的标准权限外,还需要特定 IAM 权限。

API 权限

对于预置集群,增强的 IAM 角色会话必须:

  • 对集群 ARN(格式:arn:aws:redshift:region:account:cluster:cluster-name)具有 redshift:GetIdentityCenterAuthToken

对于无服务器工作组,增强的 IAM 角色会话必须:

  • 对工作组 ARN(格式:arn:aws:redshift-serverless:region:account:workgroup/workgroup-name)具有 redshift-serverless:GetIdentityCenterAuthToken

示例 IAM policies

预置集群的策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift:GetIdentityCenterAuthToken" ], "Resource": [ "arn:aws:redshift:us-east-1:123456789012:cluster:my-cluster" ] } ] }

无服务器工作组的策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift-serverless:GetIdentityCenterAuthToken" ], "Resource": [ "arn:aws:redshift-serverless:us-east-1:123456789012:workgroup/my-workgroup" ] } ] }

多个资源的策略示例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "redshift:GetIdentityCenterAuthToken" ], "Resource": [ "arn:aws:redshift:*:123456789012:cluster/*" ] }, { "Effect": "Allow", "Action": [ "redshift-serverless:GetIdentityCenterAuthToken" ], "Resource": [ "arn:aws:redshift-serverless:*:123456789012:workgroup/*" ] } ] }

区域可用性

Identity Center 身份验证在以下 Amazon 区域中可用:

  • 商业区域:所有支持的 Amazon Redshift 区域

  • Amazon GovCloud:在 us-gov-east-1 和 us-gov-west-1 中可用

  • 中国区域:在 cn-north-1 和 cn-northwest-1 中可用

注意

在初始推出期间,功能可用性可能会有所不同。