

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

# 使用身份增强 IAM 角色会话连接到 Redshift
<a name="identity-center-authentication"></a>

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

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

## 先决条件
<a name="identity-center-auth-prerequisites"></a>

在将 Identity Center 身份验证与 Amazon Redshift 结合使用之前，请确保您具备以下各项：
+ **Identity Center 设置：**您的账户必须使用用户身份和相应的应用程序分配配置了 IAM Identity Center。有关设置说明，请参阅[设置 IAM Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/enable-identity-center.html)。
**重要**  
如果要连接到 Redshift，则必须使用 redshift:connect 范围。
+ **身份增强凭证：**您的应用程序必须使用包含嵌入式用户身份信息的身份增强凭证。有关更多信息，请参阅[使用身份增强 IAM 角色会话](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-identity-enhanced-iam-role-sessions.html)。
+ **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 驱动程序：
  + JDBC 驱动程序：请参阅[安装和配置 Amazon Redshift JDBC 驱动程序版本 2.0](https://docs.amazonaws.cn/redshift/latest/mgmt/jdbc20-install.html)
  + ODBC 驱动程序：请参阅[安装和配置 Amazon Redshift ODBC 驱动程序版本 2.0](https://docs.amazonaws.cn/redshift/latest/mgmt/odbc20-install.html)

## Identity Center 身份验证的工作原理
<a name="identity-center-auth-overview"></a>

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

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

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

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

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

**重要**  
此 API 需要身份增强凭证。有关更多信息，请参阅[使用身份增强 IAM 角色会话](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-identity-enhanced-iam-role-sessions.html)。  
如果您在没有身份增强凭证的情况下调用 API，则会收到 `UnsupportedOperationFault` 错误。

## GetIdentityCenterAuthToken API 操作
<a name="identity-center-auth-apis"></a>

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

### 适用于预置集群的 GetIdentityCenterAuthToken
<a name="provisioned-identity-center-auth"></a>

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

#### 请求语法
<a name="provisioned-request-syntax"></a>

```
{
   "ClusterIds": [ "string" ]
}
```

#### 请求参数
<a name="provisioned-request-parameters"></a>

ClusterIds  
令牌将有权访问的 Amazon Redshift 集群标识符的列表。该令牌只能用于对在此列表中指定的集群进行身份验证。  
类型：字符串数组  
长度约束：最少 1 个项目。最多 20 个项目。  
是否必需：是

#### CLI 示例
<a name="provisioned-cli-examples"></a>

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

```
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
<a name="serverless-identity-center-auth"></a>

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

#### 请求语法
<a name="serverless-request-syntax"></a>

```
{
   "WorkgroupNames": [ "string" ]
}
```

#### 请求参数
<a name="serverless-request-parameters"></a>

WorkgroupNames  
令牌将有权访问的 Amazon Redshift Serverless 工作组名称的列表。该令牌只能用于对在此列表中指定的工作组进行身份验证。  
类型：字符串数组  
长度约束：最少 1 个项目。最多 20 个项目。  
是否必需：是

#### CLI 示例
<a name="serverless-cli-examples"></a>

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

```
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
```

### 响应语法
<a name="identity-center-auth-response"></a>

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

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

#### 响应参数
<a name="identity-center-response-parameters"></a>

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

ExpirationTime  
令牌到期的日期和时间（UTC 时间）。令牌自生成之时起 1 小时内有效。  
类型：时间戳

#### 响应示例
<a name="identity-center-response-example"></a>

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

## 驱动程序集成
<a name="identity-center-auth-driver-integration"></a>

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

### 直接使用令牌
<a name="direct-token-usage"></a>

调用 `GetIdentityCenterAuthToken` API 以获取令牌后，请将 `IdpTokenAuthPlugin` 与 `SUBJECT_TOKEN` 令牌类型结合使用。

连接配置：

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

有关 Identity Center 身份验证插件和驱动程序配置的详细信息，请参阅[连接到 Amazon Redshift 集群](https://docs.amazonaws.cn/redshift/latest/mgmt/connecting-to-cluster.html)。

### Java 代码示例
<a name="java-code-example"></a>

使用 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 策略要求
<a name="identity-center-auth-iam-permissions"></a>

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

### API 权限
<a name="identity-center-auth-iam-api-permissions"></a>

对于预置集群，增强的 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
<a name="identity-center-auth-iam-policy-examples"></a>

**预置集群的策略示例：**

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

## 区域可用性
<a name="identity-center-auth-regional-availability"></a>

Identity Center 身份验证在以下 Amazon 区域中可用：
+ 商业区域：所有支持的 Amazon Redshift 区域
+ Amazon GovCloud：在 us-gov-east-1 和 us-gov-west-1 中可用
+ 中国区域：在 cn-north-1 和 cn-northwest-1 中可用

**注意**  
在初始推出期间，功能可用性可能会有所不同。