

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

# 授予对 Amazon Redshift 数据 API 的访问权限
<a name="data-api-access"></a>

用户必须获得授权才能访问数据 API。您可以通过将托管式策略（预定义的 AWS Identity and Access Management (IAM) 策略）添加给用户，授予该用户访问数据 API 的权限。作为最佳实践，我们建议将权限策略附加到 IAM 角色，然后根据需要将其分配给用户和组。有关更多信息，请参阅 [Amazon Redshift 中的 Identity and Access Management](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html)。要查看托管式策略允许和拒绝的权限，请参阅 IAM 控制台 ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

# 配置 IAM 权限
<a name="data-api-iam"></a>

Amazon Redshift 提供 `AmazonRedshiftDataFullAccess` 托管式策略。此策略提供了对 Amazon Redshift 数据 API 操作的完全访问。此策略还允许将访问权限限定为特定 Amazon Redshift、AWS Secrets Manager 以及对 Amazon Redshift 集群或 Redshift Serverless 进行身份验证和访问所需的 IAM API 操作。

此外，您还可以创建自己的 IAM 策略，以允许对特定资源的访问。要创建策略，请使用 `AmazonRedshiftDataFullAccess` 策略作为起始模板。在创建策略后，将该策略添加到需要访问数据 API 的每个用户。

考虑与用户关联的 IAM 策略的以下要求：
+ 如果您使用 AWS Secrets Manager 进行身份验证，请确认策略允许使用 `secretsmanager:GetSecretValue` 操作来检索使用键 `RedshiftDataFullAccess` 标记的密钥。
+ 如果您使用临时凭证对集群进行身份验证，请确认该策略允许将 `redshift:GetClusterCredentials` 操作用于集群中任何数据库的数据库用户名 `redshift_data_api_user`。此用户名必须已在数据库中创建。
+ 如果您使用临时凭证对无服务器工作组进行身份验证，请确认该策略允许使用 `redshift-serverless:GetCredentials` 操作来检索使用键 `RedshiftDataFullAccess` 标记的工作组。数据库用户按 1:1 的比例映射到源 AWS Identity and Access Management (IAM) 身份。例如，用户 sample\$1user 映射到数据库用户 `IAM:sample_user`，而 IAM 角色 sample\$1role 映射到 `IAMR:sample_role`。有关 IAM 身份的更多信息，请参阅《IAM 用户指南》中的 [IAM 身份（用户、组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。
+ IAM 操作 `redshift-data:GetStatementResult` 同时支持访问 `GetStatementResult` 和 `GetStatementResultV2` API 操作。

以下链接提供了《IAM 用户指南》**中有关 AWS Identity and Access Management 的更多信息。
+ 有关创建 IAM 角色的信息，请参阅[创建 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。
+ 有关创建 IAM 策略的更多信息，请参阅[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。
+ 有关将 IAM 策略添加到用户的信息，请参阅[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

## 在其它账户拥有的集群上运行查询
<a name="data-api-run-query-on-others-cluster"></a>

要对其他账户拥有的集群运行查询，拥有账户必须提供一个 IAM 角色，数据 API 可以在调用账户时代入该角色。例如，假设账户 B 拥有账户 A 需要访问的集群。账户 B 可以将 AWS 托管式策略 `AmazonRedshiftDataFullAccess` 附加到账户 B 的 IAM 角色。然后，账户 B 使用信任策略信任账户 A，如下所示：``

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/someRoleA"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

最后，账户 A 的 IAM 角色需要能够代入账户 B 的 IAM 角色。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::111122223333:role/someRoleB"
    }
}
```

------

## 指定一个 IAM 角色，该角色将资源限制为 AWS 账户中的 Redshift Serverless 工作组和 Amazon Redshift 集群
<a name="data-api-restrict-to-account"></a>

可以在基于身份的策略中指定资源 ARN，以便控制对 AWS 账户中 Redshift Serverless 工作组和 Amazon Redshift 集群的访问权限。此示例显示如何创建一个策略，该策略只支持针对指定 AWS 账户中的工作组和集群访问数据 API。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "redshift-data:CancelStatement",
                "redshift-data:DescribeStatement",
                "redshift-data:GetStatementResult",
                "redshift-data:ListStatements"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "redshift-data:*",
            "Resource": [
                "arn:aws:redshift:us-east-1:111122223333:workgroup/*",
                "arn:aws:redshift:us-east-1:111122223333:cluster:*"
            ]
        }
    ]
}
```

------

## 配置 IAM 策略，来限制只有语句所有者才能访问 SQL 语句信息
<a name="data-api-restrict-to-statement-owner"></a>

默认情况下，Amazon Redshift 数据 API 将调用 `ExecuteStatement` 和 `BatchExecuteStatement` 时使用的 IAM 角色视为 SQL 语句的所有者。任何获准代入该角色的人都可以访问有关 SQL 语句的信息，包括其结果。要将 SQL 语句信息访问权限限制为与特定所有者之间的 IAM 角色会话，请添加条件 `redshift-data:statement-owner-iam-userid: "${aws:userid}"`。以下 IAM 策略会限制访问权限。

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

****  

```
{
"Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "redshift-data:CancelStatement",
                "redshift-data:DescribeStatement",
                "redshift-data:GetStatementResult",
                "redshift-data:ListStatements"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "redshift-data:statement-owner-iam-userid": "${aws:userid}"
                }
            }
        }
    ]
}
```

------

可以将条件 `statement-owner-iam-userid` 与 `CancelStatement`、`DescribeStatement`、`GetStatementResult` 和 `ListStatements` 结合使用。有关更多信息，请参阅 [Amazon Redshift Data API 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshiftdataapi.html#amazonredshiftdataapi-redshift-data_statement-owner-iam-userid)。

## 配置 IAM 策略，来限制只有会话所有者才能访问 SQL 结果
<a name="data-api-restrict-session-owner"></a>

默认情况下，Amazon Redshift 数据 API 将调用 `ExecuteStatement` 和 `BatchExecuteStatement` 时使用的 IAM 角色视为运行 SQL 语句的数据库会话的所有者。任何获准代入该角色的人都可以提交对数据库会话的查询。要将会话访问权限限制为与特定所有者之间的 IAM 角色会话，请添加条件 ` redshift-data:session-owner-iam-userid: "${aws:userid}"`。以下 IAM 策略会限制访问权限。

以下 IAM 策略仅支持会话所有者获取语句结果。条件 `session-owner-iam-userid` 用于将资源访问权限限制为指定的 `userid`。

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

****  

```
{
"Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [ 
                "redshift-data:ExecuteStatement",
                "redshift-data:BatchExecuteStatement"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "redshift-data:session-owner-iam-userid": "${aws:userid}"
                }
            }
        }
    ]
}
```

------

可以将条件 `session-owner-iam-userid` 与 `ExecuteStatement` 和 `BatchExecuteStatement` 结合使用。有关更多信息，请参阅 [Amazon Redshift Data API 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonredshiftdataapi.html#amazonredshiftdataapi-redshift-data_statement-owner-iam-userid)。

# 在 AWS Secrets Manager 中存储数据库凭证
<a name="data-api-secrets"></a>

在调用数据 API 时，您可以使用 AWS Secrets Manager 中的密钥传递集群或无服务器工作组的凭证。要通过此方式传递凭证，您需要指定密钥的名称或密钥的 Amazon 资源名称（ARN）。

要使用 Secrets Manager 存储凭证，您需要 `SecretManagerReadWrite` 托管式策略权限。有关最低权限的更多信息，请参阅《AWS Secrets Manager 用户指南》**中的[使用 AWS Secrets Manager 创建和管理密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html)。

**要将凭证存储在 Amazon Redshift 集群的密钥中**

1. 使用 AWS Secrets Manager 控制台创建包含集群凭证的密钥：
   + 当您选择**存储新密钥**时，选择**Redshift 集群的凭证**。
   + 将**用户名**（数据库用户）、**密码**和 **数据库集群**（集群标识符）的值存储在您的密钥中。
   + 使用键 `RedshiftDataFullAccess` 标记密钥。AWS 托管式策略 `AmazonRedshiftDataFullAccess` 只支持对使用键 `RedshiftDataFullAccess` 进行标记的密钥执行操作 `secretsmanager:GetSecretValue`。

   有关说明，请参阅《AWS Secrets Manager 用户指南》**中的[创建基本密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)。

1. 使用 AWS Secrets Manager 控制台查看您创建的密钥的详细信息，或运行 `aws secretsmanager describe-secret` AWS CLI 命令。

   记下密钥的名称和 ARN。您可以将其用于对数据 API 的调用中。

**将凭证存储在无服务器工作组的密钥中**

1. 使用 AWS Secrets Manager AWS CLI 命令存储包含无服务器工作组凭证的密钥：
   + 在文件中创建密钥，例如名为 `mycreds.json` 的 JSON 文件。在文件中提供**用户名**（数据库用户）和**密码**的值。

     ```
     {
           "username": "myusername",
           "password": "mypassword"
     }
     ```
   + 将值存储在密钥中，并使用键 `RedshiftDataFullAccess` 标记密钥。

     ```
     aws secretsmanager create-secret --name MyRedshiftSecret  --tags Key="RedshiftDataFullAccess",Value="serverless" --secret-string file://mycreds.json
     ```

     下面显示了输出。

     ```
     {
         "ARN": "arn:aws:secretsmanager:region:accountId:secret:MyRedshiftSecret-mvLHxf",
         "Name": "MyRedshiftSecret",
         "VersionId": "a1603925-e8ea-4739-9ae9-e509eEXAMPLE"
     }
     ```

   有关更多信息，请参阅《AWS Secrets Manager User Guide》**中的 [Creating a Basic Secret with AWS CLI](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html#proc-create-api)。

1. 使用 AWS Secrets Manager 控制台查看您创建的密钥的详细信息，或运行 `aws secretsmanager describe-secret` AWS CLI 命令。

   记下密钥的名称和 ARN。您可以将其用于对数据 API 的调用中。

# 为数据 API 创建 Amazon VPC 终端节点 (AWS PrivateLink)
<a name="data-api-vpc-endpoint"></a>

借助 Amazon Virtual Private Cloud (Amazon VPC)，您可以在 Virtual Private Cloud (VPC) 中启动 AWS 资源（例如 Amazon Redshift 集群和应用程序）。AWS PrivateLink 在亚马逊网络上提供了 Virtual Private Cloud (VPC) 和 AWS 服务之间的私有连接。通过使用 AWS PrivateLink，您可以创建 VPC 终端节点，这可让您根据 Amazon VPC 跨不同的账户和 VPC 连接到服务。有关 AWS PrivateLink 的更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的 [VPC 终端节点服务 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-service.html)。

您可以使用 Amazon VPC 终端节点调用数据 API。使用 Amazon VPC 终端节点可保留 Amazon VPC 中应用程序间的流量与AWS网络中的 Data API，而无需使用公有 IP 地址。Amazon VPC 终端节点可帮助您遵守与管理公共互联网连接有关的合规性和法规要求。例如，如果您使用 Amazon VPC 终端节点，则可保持 Amazon EC2 实例上运行的应用程序和包含终端节点的 VPC 中的 Data API 之间的流量。

创建 Amazon VPC 终端节点后，便能开始使用此终端节点，而无需在应用程序中进行任何代码或配置更改。

**为 Data API 创建 Amazon VPC 终端节点**

1. 登录到AWS 管理控制台并打开 Amazon VPC 控制台，网址：[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1. 选择**端点**，然后选择**创建端点**。

1. 在**创建终端节点**页面上，为**服务类别**选择 **AWS 服务**。对于**服务名称**，选择 **redshift-data** (`com.amazonaws.region.redshift-data`)。

1. 对于 **VPC**，选择要在其中创建终端节点的 VPC。

   选择包含用于进行 Data API 调用的应用程序的 VPC。

1. 对于**子网**，请为运行应用程序的 AWS 服务所使用的每个可用区 (AZ) 选择子网。

   要创建 Amazon VPC 终端节点，请指定端点可在其中访问的私有 IP 地址范围。为此，请为每个可用区选择子网。执行此操作会将 VPC 端点限制为特定于每个可用区的私有 IP 地址范围，并且还会在每个可用区中创建一个 Amazon VPC 端点。

1. 对于**启用 DNS 名称**，选择**为此终端节点启用**。

   私有 DNS 会将标准 Data API DNS 主机名 (`https://redshift-data.region.amazonaws.com`) 解析为与特定于 Amazon VPC 终端节点的 DNS 主机名关联的私有 IP 地址。因此，您可以使用 AWS CLI 或 AWS 开发工具包访问 Data API VPC 终端节点，而无需进行任何代码或配置更改来更新 Data API 终端节点 URL。

1. 对于**安全组**，选择要与 Amazon VPC 终端节点关联的安全组。

   选择允许访问运行应用程序的 AWS 服务的安全组。例如，如果 Amazon EC2 实例正在运行您的应用程序，请选择允许访问 Amazon EC2 实例的安全组。利用安全组，您可以控制从 VPC 中的资源发送到 Amazon VPC 终端节点的流量。

1. 选择**Create endpoint**。

创建终端节点后，选择 AWS 管理控制台中的链接以查看终端节点详细信息。

终端节点**详细信息**选项卡将显示在创建 Amazon VPC 终端节点时生成的 DNS 主机名。

您可以使用标准终端节点 (`redshift-data.region.amazonaws.com`) 或特定于 VPC 的终端节点之一来调用 Amazon VPC 中的 Data API。标准 Data API 端点将自动路由到 Amazon VPC 端点。发生此路由的原因是，在创建 Amazon VPC 终端节点时启用了私有 DNS 主机名。

在 Data API 调用中使用 Amazon VPC 终端节点时，应用程序和 Data API 之间的所有流量将在包含它们的 Amazon VPC 中保留。可以将 Amazon VPC 终端节点用于任何类型的 Data API 调用。有关调用 Data API 的信息，请参阅[调用 Amazon Redshift 数据 API 时的注意事项](data-api.md#data-api-calling-considerations)。

# 连接到集群时加入数据库组
<a name="data-api-dbgroups"></a>

数据库组是数据库用户的集合。可以向组授予数据库权限。管理员可以配置 IAM 角色，以便在使用数据 API 运行您的 SQL 时，将这些数据库组考虑在内。有关数据库组的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的[组](https://docs.aws.amazon.com/redshift/latest/dg/r_Groups.html)。

您可以配置数据 API 调用者的 IAM 角色，以便在数据 API 连接到集群时，在调用中指定的数据库用户加入数据库组。只有在连接到预置集群时才支持此功能。连接到 Redshift Serverless 工作组时不支持此功能。数据 API 调用方的 IAM 角色还必须允许 `redshift:JoinGroup` 操作。

通过向 IAM 角色添加标签来对此进行配置。调用方 IAM 角色的管理员添加以 `RedshiftDbGroups` 为键、以数据库组列表为键值的标签。该值是以冒号 (:) 分隔的数据库组名称的列表，总长度不超过 256 个字符。必须事先在连接的数据库中定义数据库组。如果在数据库中找不到任何指定的组，则将其忽略。例如，对于数据库组 `accounting` 和 `retail`，键/值为 `accounting:retail`。标签键/值对 `{"Key":"RedshiftDbGroups","Value":"accounting:retail"}` 由数据 API 用于确定哪些数据库组与调用数据 API 时提供的数据库用户相关联。

**加入数据库组**

1. 登录AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在控制台的导航窗格中，选择**角色**，然后选择要编辑的角色的名称。

1. 选择**标签**选项卡，然后选择**管理标签**。

1. 选择**添加标签**，然后添加键 **RedshiftDbGroups** 以及一个值，该值是 *database-groups-colon-separated* 的列表。

1. 选择**保存更改**。

   现在，当 IAM 主体（附加了此 IAM 角色）调用数据 API 时，指定的数据库用户将加入在 IAM 角色中指定的数据库组。

有关如何将标签附加至主体（包括 IAM 角色和 IAM 用户）的更多信息，请参阅《IAM 用户指南》**中的[标记 IAM 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)部分。