

 从补丁 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/)。

# Azure
<a name="setup-identity-provider-azure"></a>

您可以使用 Microsoft Azure AD 作为身份提供者 (IdP) 来访问 Amazon Redshift 集群。本教程将向您展示如何将 Azure 用作身份提供者（IdP）来访问 Amazon Redshift 集群。

要了解如何通过 Microsoft Azure AD 单点登录进行联合 Amazon Redshift 访问，请观看以下视频。

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


## 第 1 步：设置 Azure 和您的 AWS 账户相互信任
<a name="setup-identity-provider-azure-trust"></a>

以下过程介绍如何建立信任关系。

**将 Azure AD 和您的 AWS 账户设置为彼此信任**

1. 创建或使用现有的 Amazon Redshift 集群，以使 Azure AD 用户连接到该集群。要配置连接，需要此集群的某些属性，例如集群标识符。有关更多信息，请参阅[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster.html)。

1. 在 Microsoft Azure 门户上设置用于 AWS 的 Azure Active Directory、组、用户。

1. 在 Microsoft Azure 门户上添加 Amazon Redshift 以作为企业应用程序，以用于 AWS 控制台单点登录和 Amazon Redshift 联合登录。选择**企业应用程序**。

1. 选择 **\+ 新建应用程序**。将显示“添加应用程序”页面。

1. 在搜索字段中搜索 **AWS**。

1. 选择 **Amazon Web Services (AWS)**，然后选择**添加**。将会创建 AWS 应用程序。

1. 在**管理**下方，选择**单点登录**。

1. 选择 **SAML**。将显示 Amazon Web Services (AWS) \| 基于 SAML 的登录页面。

1. 选择**是**以转到“使用 SAML 设置单点登录”页面。该页面显示预配置的单点登录相关属性的列表。

1. 对于**基本 SAML 配置**，请选择编辑图标，然后选择**保存**。

1. 在配置多个应用程序时，请提供一个标识符值。例如，输入 **{{https://signin.aws.amazon.com/saml\#2}}**。请注意，从第二个应用程序开始，将该格式与 \# 符号一起使用以指定唯一的 SPN 值。

1. 在**用户属性和声明**部分中，选择编辑图标。

   默认情况下，预配置了唯一用户标识符 (UID)、角色、RoleSessionName 和 SessionDuration 声明。

1. 选择 **\+ 添加新的声明**，以便为数据库用户添加声明。

   对于**名称**，请输入 **DbUser**。

   对于**命名空间**，请输入 **https://redshift.amazon.com/SAML/Attributes**。

   对于**源**，请选择**属性**。

   对于**源属性**，请选择 **user.userprincipalname**。然后，选择**保存**。

1. 选择 **\+ 添加新的声明**，以便为 AutoCreate 添加声明。

   对于**名称**，请输入 **AutoCreate**。

   对于**命名空间**，请输入 **https://redshift.amazon.com/SAML/Attributes**。

   对于**源**，请选择**属性**。

   对于**源属性**，请选择 **"true"**。然后，选择**保存**。

   此处，`{{123456789012}}` 是您的 AWS 账户，{{`AzureSSO`}} 是您创建的 IAM 角色，{{`AzureADProvider`}} 是 IAM 提供商。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/redshift/latest/mgmt/setup-identity-provider-azure.html)

1. 在**应用程序注册 > **{{your-application-name}}** > 身份验证** 下，添加**移动和桌面应用程序**。将 URL 指定为 http://localhost/redshift/。

1. 在 **SAML 签名证书** 部分中，选择**下载**以下载并保存联合元数据 XML 文件，以便在创建 IAM SAML 身份提供者时使用。该文件用于创建单点登录联合身份。

1. 在 IAM 控制台上创建 IAM SAML 身份提供者。您提供的元数据文档是您在设置 Azure 企业应用程序时保存的联合元数据 XML 文件。有关详细步骤，请参阅《IAM 用户指南》**中的[创建和管理 IAM 身份提供者（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html#idp-manage-identityprovider-console)。

1. 在 IAM 控制台上为 SAML 2.0 联合身份创建 IAM 角色。有关详细步骤，请参阅 *IAM 用户指南*中的[创建用于 SAML 的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html#idp_saml_Create)。

1. 创建一个 IAM 策略，您可以将其附加到您在 IAM 控制台上为 SAML 2.0 联合身份验证创建的 IAM 角色。有关详细步骤，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-start)。

   为您的环境修改以下策略（JSON 格式）：
   + 将集群的 AWS 区域替换为 `{{us-west-1}}`。
   + 将您的 AWS 账户替换为 {{`123456789012`}}。
   + 将您的集群标识符（或对于所有集群，则为 `*`）替换为 {{`cluster-identifier`}}。
   + 将您的数据库（或对于所有集群，则为 `*`）替换为 {{`dev`}}。
   + 将 IAM 角色的唯一标识符替换为 {{`AROAJ2UCCR6DPCEXAMPLE`}}。
   + 将您的租户或公司电子邮件域替换为 `{{example.com}}`。
   + 将您计划为其分配用户的数据库组替换为 {{`my_dbgroup`}}。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "redshift:GetClusterCredentials",
               "Resource": [
                   "arn:aws:redshift:{{us-west-1}}:{{123456789012}}:dbname:{{cluster-identifier}}/{{dev}}",
                   "arn:aws:redshift:{{us-west-1}}:{{123456789012}}:dbuser:{{cluster-identifier}}/${redshift:DbUser}",
                   "arn:aws:redshift:{{us-west-1}}:{{123456789012}}:cluster:{{cluster-identifier}}"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:userid": "{{AROAJ2UCCR6DPCEXAMPLE}}:${redshift:DbUser}@{{example.com}}"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": "redshift:CreateClusterUser",
               "Resource": "arn:aws:redshift:{{us-west-1}}:{{123456789012}}:dbuser:{{cluster-identifier}}/${redshift:DbUser}"
           },
           {
               "Effect": "Allow",
               "Action": "redshift:JoinGroup",
               "Resource": "arn:aws:redshift:{{us-west-1}}:{{123456789012}}:dbgroup:{{cluster-identifier}}/{{my_dbgroup}}"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "redshift:DescribeClusters",
                   "iam:ListRoles"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

   此策略授予权限，如下所示：
   + 第一部分授予执行 `GetClusterCredentials` API 操作的权限，以获取指定集群的临时凭证。在此示例中，资源是 `{{cluster-identifier}}`，所在的数据库为 {{`dev`}}，所在的账户为 {{`123456789012`}}，所在的 AWS 区域为 {{`us-west-1`}}。`${redshift:DbUser}` 子句仅允许与在 Azure AD 中指定的 `DbUser` 值匹配的用户进行连接。
   + 条件子句会强制只有特定用户能够获得临时凭证。这些用户是由角色唯一 ID {{`AROAJ2UCCR6DPCEXAMPLE`}} 指定的角色下的用户，该 ID 位于您公司的电子邮件域中的电子邮件地址所标识的 IAM 账户中。有关唯一 ID 的更多信息，请参阅 *IAM 用户指南*中的[唯一 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)。

     您使用 IdP（在本例中为 Azure AD）进行的设置决定了条件子句的写入方式。如果员工的电子邮件是 `johndoe@example.com`，请首先将 `${redshift:DbUser}` 设置为与员工用户名 `johndoe` 匹配的超级用户字段。然后，要使该条件有效，请将 AWS SAML `RoleSessionName` 字段设置为与员工电子邮件 `johndoe@example.com` 匹配的超级用户字段。使用这种方法时，请考虑以下几点：
     + 如果您将 `${redshift:DbUser}` 设置为员工的电子邮件，则删除示例 JSON 中的 `@example.com` 以匹配 `RoleSessionName`。
     + 如果您只是将 `RoleSessionId` 设置为员工的用户名，则删除示例中的 `@example.com` 以匹配 `RoleSessionName`。
     + 在示例 JSON 中，`${redshift:DbUser}` 和 `RoleSessionName` 都已设置为员工电子邮件。此示例 JSON 使用 Amazon Redshift 数据库用户名以及 `@example.com` 让用户登录以访问集群。
   + 第二部分授予在指定集群中创建 `dbuser` 名称的权限。在此示例 JSON 中，它将创建限制为 `${redshift:DbUser}`。
   + 第三部分授予指定用户可以加入 `dbgroup` 的权限。在此示例 JSON 中，用户可以加入指定集群中的 `my_dbgroup` 组。
   + 第四部分授予用户可以对所有资源执行的操作的权限。在此示例 JSON 中，它允许用户调用 `redshift:DescribeClusters` 以获取集群信息，例如集群端点、AWS 区域和端口。它还允许用户调用 `iam:ListRoles` 以检查用户可以代入哪些角色。

## 第 2 步：设置 JDBC 或 ODBC，以便向 Azure 进行身份验证
<a name="setup-identity-provider-azure-auth"></a>

------
#### [ JDBC ]

**设置 JDBC 以在 Microsoft Azure AD 中进行身份验证**
+ 将数据库客户端配置为通过 JDBC 连接（使用 Azure AD 单点登录）到集群。

  您可以使用任何采用 JDBC 驱动程序的客户端通过 Azure AD 单点登录进行连接，也可以使用像 Java 这样的语言通过脚本进行连接。有关安装和配置信息，请参阅[为 Amazon Redshift 配置 JDBC 驱动程序版本 2.x 连接](jdbc20-install.md)。

  例如，您可以使用 SQLWorkbench/J 作为客户端。当您配置 SQLWorkbench/J 时，数据库的 URL 使用以下格式。

  ```
  jdbc:redshift:iam://{{cluster-identifier}}:{{us-west-1}}/{{dev}}
  ```

  如果您使用 SQLWorkbench/J 作为客户端，请执行以下步骤：

  1. 启动 SQL Workbench/J。在**选择连接配置文件**页面上，添加一个称为 **AzureAuth** 的**配置文件组**。

  1. 对于**连接配置文件**，请输入 **Azure**。

  1. 选择**管理驱动程序**，然后选择 **Amazon Redshift**。选择**库**旁边的**打开文件夹**图标，然后选择适当的 JDBC .jar 文件。

  1. 在**选择连接配置文件**页面上，向连接配置文件添加信息，如下所示：
     + 对于**用户**，请输入 Microsoft Azure 用户名。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。
     + 对于**密码**，请输入您的 Microsoft Azure 密码。
     + 对于**驱动程序**，请选择 **Amazon Redshift (com.amazon.redshift.jdbc.Driver)**。
     + 对于 **URL**，请输入 **jdbc:redshift:iam://{{your-cluster-identifier}}:{{your-cluster-region}}/{{your-database-name}}**。

  1. 选择**扩展属性**以在连接属性中添加其他信息，如下所述。

     对于 Azure AD 单点登录配置，请添加附加信息，如下所示：
     + 对于 **plugin\_name**，请输入 **com.amazon.redshift.plugin.AzureCredentialsProvider**。该值指定驱动程序将 Azure AD 单点登录作为身份验证方法。
     + 对于 **idp\_tenant**，请输入 **{{your-idp-tenant}}**。仅用于 Microsoft Azure AD。这是在 Azure AD 上为您的公司配置的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
     + 对于 **client\_secret**，请输入 **{{your-azure-redshift-application-client-secret}}**。仅用于 Microsoft Azure AD。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端密钥。这仅适用于 com.amazon.redshift.plugin.AzureCredentialsProvider 插件。
     + 对于 **client\_id**，请输入 **{{your-azure-redshift-application-client-id}}**。仅用于 Microsoft Azure AD。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。

     对于具有 MFA 的 Azure AD 单点登录配置，请在连接属性中添加附加信息，如下所示：
     + 对于 **plugin\_name**，请输入 **com.amazon.redshift.plugin.BrowserAzureCredentialsProvider**。此值指定驱动程序将具有 MFA 的 Azure 单点登录作为身份验证方法。
     + 对于 **idp\_tenant**，请输入 **{{your-idp-tenant}}**。仅用于 Microsoft Azure AD。这是在 Azure AD 上为您的公司配置的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
     + 对于 **client\_id**，请输入 **{{your-azure-redshift-application-client-id}}**。此选项仅用于 Microsoft Azure AD。这是您在设置具有 MFA 的 Azure AD 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。
     + 对于**侦听端口**，请输入 **{{your-listen-port}}**。这是本地服务器正在侦听的端口。默认值为 7890。
     + 对于 **idp\_response\_timeout**，请输入 **{{the-number-of-seconds}}**。这是 IdP 服务器发回响应时超时之前等待的秒数。最小秒数必须为 10。如果建立连接的用时长于此阈值，则连接将被中止。

------
#### [ ODBC ]

**设置 ODBC 以在 Microsoft Azure AD 中进行身份验证**
+ 将数据库客户端配置为通过 ODBC 连接（使用 Azure AD 单点登录）到集群。

  Amazon Redshift 提供了适用于 Linux、Windows 和 macOS 操作系统的 ODBC 驱动程序。在安装 ODBC 驱动程序之前，请确定您的 SQL 客户端工具是 32 位还是 64 位。安装符合 SQL 客户端工具要求的 ODBC 驱动程序。

  在 Windows 上的 **Amazon Redshift ODBC 驱动程序 DSN 安装**页的**连接设置**下，输入以下信息：
  + 对于**数据源名称**，输入 **{{your-DSN}}**。这将指定用作 ODBC 配置文件名称的数据源名称。
  + 对于 Azure AD 单点登录配置的**身份验证类型**，请选择 **Identity Provider: Azure AD**。这是 ODBC 驱动程序在通过 Azure 单点登录进行身份验证时使用的验证方法。
  + 对于具有 MFA 的 Azure AD 单点登录配置的**身份验证类型**，请选择 **Identity Provider: Browser Azure AD**。这是 ODBC 驱动程序在通过 Azure 单点登录（采用 MFA）进行身份验证时使用的验证方法。
  + 对于**集群 ID**，请输入 **{{your-cluster-identifier}}**。
  + 对于**区域**，请输入 **{{your-cluster-region}}**。
  + 对于**数据库**，请输入 **{{your-database-name}}**。
  + 对于**用户**，请输入 **{{your-azure-username}}**。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。请仅将其用于**身份验证类型** 为**身份提供者: Azure AD** 的情况。
  + 对于**密码**，请输入 **{{your-azure-password}}**。请仅将其用于 **Auth Type (身份验证类型)** 为 **Identity Provider: Azure AD (身份提供者: Azure AD)** 的情况。
  + 对于 **IdP 租户**，请输入 **{{your-idp-tenant}}**。这是在 IdP (Azure) 上配置的公司的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
  + 对于 **Azure 客户端密钥**，请输入 **{{your-azure-redshift-application-client-secret}}**。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端密钥。
  + 对于 **Azure 客户端 ID**，请输入 **{{your-azure-redshift-application-client-id}}**。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。
  + 对于**侦听端口**，请输入 **{{your-listen-port}}**。这是本地服务器正在侦听的默认侦听端口。默认值为 7890。这仅适用于浏览器 Azure AD 插件。
  + 对于**响应超时**，请输入 **{{the-number-of-seconds}}**。这是 IdP 服务器发回响应时超时之前等待的秒数。最小秒数必须为 10。如果建立连接的用时长于此阈值，则连接将被中止。该选项仅适用于浏览器 Azure AD 插件。

  在 macOS 和 Linux 上，按如下方式编辑 `odbc.ini` 文件：
**注意**  
所有条目不区分大小写。
  + 对于 **clusterid**，请输入 **{{your-cluster-identifier}}**。这是已创建的 Amazon Redshift 集群的名称。
  + 对于**区域**，请输入 **{{your-cluster-region}}**。这是已创建的 Amazon Redshift 集群的 AWS 区域。
  + 对于**数据库**，请输入 **{{your-database-name}}**。这是您尝试在 Amazon Redshift 集群上访问的数据库的名称。
  + 对于**区域设置**，请输入 **en-us**。这是显示错误消息的语言。
  + 对于 **iam**，请输入 **1**。此值指定要使用 IAM 凭证进行身份验证的驱动程序。
  + 对于 Azure AD 单点登录配置的 **plugin\_name**，请输入 **AzureAD**。这指定驱动程序使用 Azure 单点登录作为身份验证方法。
  + 对于具有 MFA 的 Azure AD 单点登录配置的 **plugin\_name**，请输入 **BrowserAzureAD**。这指定驱动程序将 Azure 单点登录（采用 MFA）作为身份验证方法。
  + 对于 **uid**，请输入 **{{your-azure-username}}**。这是您用于单点登录的 Microsoft Azure 账户的用户名，该账户有权限访问您在尝试进行身份验证时使用的集群。请仅将其用于 **plugin\_name** 为 **AzureAD** 的情况。
  + 对于**密码**，请输入 **{{your-azure-password}}**。请仅将其用于 **plugin\_name** 为 **AzureAD** 的情况。
  + 对于 **idp\_tenant**，请输入 **{{your-idp-tenant}}**。这是在 IdP (Azure) 上配置的公司的租户名称。此值可以是租户名或带连字符的租户唯一 ID。
  + 对于 **client\_secret**，请输入 **{{your-azure-redshift-application-client-secret}}**。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端密钥。
  + 对于 **client\_id**，请输入 **{{your-azure-redshift-application-client-id}}**。这是您在设置 Azure 单点登录配置时创建的 Amazon Redshift 应用程序的客户端 ID（带连字符）。
  + 对于**侦听端口**，请输入 **{{your-listen-port}}**。这是本地服务器正在侦听的端口。默认值为 7890。这适用于浏览器 Azure AD 插件。
  + 对于 **idp\_response\_timeout**，请输入 **{{the-number-of-seconds}}**。这是等待 Azure 响应的指定时间段（以秒为单位）。此选项适用于浏览器 Azure AD 插件。

  在 macOS 和 Linux 上，还要编辑配置文件设置以添加以下导出。

  ```
  export ODBCINI=/opt/amazon/redshift/Setup/odbc.ini
  ```

  ```
  export ODBCINSTINI=/opt/amazon/redshift/Setup/odbcinst.ini
  ```

------

## 问题排查
<a name="setup-identity-provider-azure-auth"></a>

要解决浏览器 Azure AD 插件的问题，请考虑以下几点。
+ 要使用浏览器 Azure AD 插件，在请求中指定的回复 URL 必须与为应用程序配置的回复 URL 一致。导航到 Microsoft Azure 门户上的**使用 SAML 设置单点登录**页面。然后检查**回复 URL** 是否已设置为 http://localhost/redshift/。
+ 如果收到 IdP 租户错误，请验证 **IdP 租户**名称是否与最初在 Microsoft Azure 中设置 Active Directory 时所用的域名匹配。

  在 Windows 上，导航到 **Amazon Redshift ODBC DSN 设置**页面的**连接设置**部分。然后检查在 IdP (Azure) 上配置的公司租户名称是否与最初在 Microsoft Azure 中设置 Active Directory 时所用的域名匹配。

  在 macOS 和 Linux 上，找到 *odbc.ini* 文件。然后检查在 IdP (Azure) 上配置的公司租户名称是否与最初在 Microsoft Azure 中设置 Active Directory 时所用的域名匹配。
+ 如果收到请求中指定的回复 URL 与为应用程序配置的回复 URL 不一致的错误，请验证**重定向 URI** 是否与回复 URL 相同。

  在 Microsoft Azure 门户上，导航到您的应用程序的**应用程序注册**页面。然后检查重定向 URI 是否与回复 URL 一致。
+ 如果收到“未经授权错误”意外响应，请验证是否已完成**移动和桌面应用程序**配置。

  在 Microsoft Azure 门户上，导航到您的应用程序的**应用程序注册**页面。然后导航到**身份验证**，检查是否已将**移动和桌面应用程序**配置为使用 http://localhost/redshift/ 作为重定向 URI。