授予对 Amazon Redshift 数据 API 的访问权限 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

授予对 Amazon Redshift 数据 API 的访问权限

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

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

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

考虑与用户关联的 IAM 策略的以下要求:

  • 如果您使用 Amazon Secrets Manager 进行身份验证,请确认策略允许使用 secretsmanager:GetSecretValue 操作来检索使用键 RedshiftDataFullAccess 标记的密钥。

  • 如果您使用临时凭证对集群进行身份验证,请确认该策略允许将 redshift:GetClusterCredentials 操作用于集群中任何数据库的数据库用户名 redshift_data_api_user。此用户名必须已在数据库中创建。

  • 如果您使用临时凭证对无服务器工作组进行身份验证,请确认该策略允许使用 redshift-serverless:GetCredentials 操作来检索使用键 RedshiftDataFullAccess 标记的工作组。数据库用户按 1:1 的比例映射到源 Amazon Identity and Access Management (IAM) 身份。例如,用户 sample_user 映射到数据库用户 IAM:sample_user,而 IAM 角色 sample_role 映射到 IAMR:sample_role。有关 IAM 身份的更多信息,请参阅《IAM 用户指南》中的 IAM 身份(用户、组和角色)

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

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

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

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::accountID-of-account-B:role/someRoleB" } }

以下链接提供了《IAM 用户指南》中有关 Amazon Identity and Access Management 的更多信息。

在 Amazon Secrets Manager 中存储数据库凭证

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

要使用 Secrets Manager 存储凭证,您需要 SecretManagerReadWrite 托管式策略权限。有关最低权限的更多信息,请参阅《Amazon Secrets Manager 用户指南》中的使用 Amazon Secrets Manager 创建和管理密钥

要将凭证存储在 Amazon Redshift 集群的密钥中
  1. 使用 Amazon Secrets Manager 控制台创建包含集群凭证的密钥:

    • 当您选择存储新密钥时,选择Redshift 集群的凭证

    • 用户名(数据库用户)、密码数据库集群(集群标识符)的值存储在您的密钥中。

    • 使用键 RedshiftDataFullAccess 标记密钥。Amazon 托管式策略 AmazonRedshiftDataFullAccess 只允许对使用键 RedshiftDataFullAccess 进行标记的密钥执行操作 secretsmanager:GetSecretValue

    有关说明,请参阅《Amazon Secrets Manager 用户指南》中的创建基本密钥

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

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

将凭证存储在无服务器工作组的密钥中
  1. 使用 Amazon Secrets Manager Amazon 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" }

    有关更多信息,请参阅《Amazon Secrets Manager 用户指南》中的使用 Amazon CLI 创建基本密钥

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

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

为数据 API 创建 Amazon VPC 终端节点 (Amazon PrivateLink)

借助 Amazon Virtual Private Cloud (Amazon VPC),您可以在 Virtual Private Cloud (VPC) 中启动 Amazon 资源(例如 Amazon Redshift 集群和应用程序)。Amazon PrivateLink 在亚马逊网络上提供了 Virtual Private Cloud (VPC) 和 Amazon 服务之间的私有连接。通过使用 Amazon PrivateLink,您可以创建 VPC 终端节点,这可让您根据 Amazon VPC 跨不同的账户和 VPC 连接到服务。有关 Amazon PrivateLink 的更多信息,请参阅《Amazon Virtual Private Cloud 用户指南》中的 VPC 终端节点服务 (Amazon PrivateLink)

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

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

为 Data API 创建 Amazon VPC 终端节点
  1. 登录到Amazon Web Services Management Console并打开 Amazon VPC 控制台,网址:https://console.aws.amazon.com/vpc/

  2. 选择终端节点,然后选择创建终端节点

  3. 创建终端节点页面上,为服务类别选择 Amazon 服务。对于服务名称,选择 redshift-data (com.amazonaws.region.redshift-data)。

  4. 对于 VPC,选择要在其中创建终端节点的 VPC。

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

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

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

  6. 对于启用 DNS 名称,选择为此终端节点启用

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

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

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

  8. 选择Create endpoint

创建终端节点后,选择 Amazon Web Services Management Console中的链接以查看终端节点详细信息。

终端节点详细信息选项卡将显示在创建 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 时的注意事项

连接到集群时加入数据库组

数据库组是数据库用户的集合。可以向组授予数据库权限。管理员可以配置 IAM 角色,以便在使用数据 API 运行您的 SQL 时,将这些数据库组考虑在内。有关数据库组的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的

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

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

将数据库组作为标签添加到 IAM 角色
  1. 登录Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

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

  3. 选择标签选项卡,然后选择管理标签

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

  5. 选择保存更改

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

有关如何将标签附加至主体(包括 IAM 角色和 IAM 用户)的更多信息,请参阅《IAM 用户指南》中的标记 IAM 资源部分。