

# 为 Amazon RDS 创建代理
<a name="rds-proxy-creating"></a>

您可以将代理与 RDS for MariaDB、RDS for Microsoft SQL Server、RDS for MySQL 或 RDS for PostgreSQL 数据库实例相关联。

## 控制台
<a name="rds-proxy-creating.console"></a>

**创建代理**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择 **Proxies (代理)**。

1. 选择 **Create proxy (创建代理)**。

1. 为代理配置以下设置。


<table>
<thead>
  <tr><th>设置</th><th>说明</th></tr>
</thead>
<tbody>
  <tr><td><b>引擎系列</b></td><td>代理在解释进出数据库的网络流量时识别的数据库网络协议。 要使用 RDS for PostgreSQL，请确保将 <code>postgres</code> 数据库保留在实例中。请参阅<a href="rds-proxy.troubleshooting.md#rds-proxy-PostgreSQL-troubleshooting.postgresDBDelete">对已删除的 `postgres` 数据库进行故障排除</a>。  </td></tr>
  <tr><td><b>代理标识符</b></td><td>在您的 AWS 账户 ID 和当前 AWS 区域内具有唯一性的名称。</td></tr>
  <tr><td><b>空闲客户端连接超时</b></td><td>如果客户端连接在设定的时间段内保持空闲，则代理会关闭客户端连接。默认情况下，这是 1800 秒（30 分钟）。当应用程序在完成上一个请求后的指定时间内未提交新请求时，连接处于空闲状态。代理将底层数据库连接保持为打开状态，并将其返回到连接池，使其可用于新的客户端连接。<br />要主动移除过时的连接，请减少空闲客户端连接超时。要最大限度地降低工作负载高峰期间的连接成本，请增加此超时。</td></tr>
  <tr><td><b>数据库</b></td><td>要通过此代理访问的 RDS 数据库实例。该列表仅包含具有兼容数据库引擎、引擎版本和其他设置的数据库实例和集群。如果列表为空，请创建与 RDS Proxy 兼容的新数据库实例或集群。为此，请按照 <a href="USER_CreateDBInstance.md">创建 Amazon RDS 数据库实例</a> 中的过程操作。然后，尝试再次创建代理。</td></tr>
  <tr><td><b>连接池最大连接数</b></td><td>一个介于 1 到 100 之间的值，用于定义 RDS 代理可以使用的 <code>max_connections</code> 限制的百分比。如果您只打算对此数据库实例或集群使用一个代理，请将此值设置为 100。有关 RDS 代理如何使用此设置的更多信息，请参阅 <a href="rds-proxy-connections.md#rds-proxy-connection-pooling-tuning.maxconnectionspercent">MaxConnectionsPercent</a>。</td></tr>
  <tr><td><b>会话绑定筛选条件</b></td><td>防止 RDS 代理绑定某些检测到的会话状态来绕过多路复用连接的默认安全措施。目前，PostgreSQL 不支持此设置，唯一可用的选项是 <code>EXCLUDE_VARIABLE_SETS</code>。启用它可能会导致来自一个连接的会话变量影响其它连接，如果查询依赖于在当前事务之外设置的会话变量，则会导致错误或正确性问题。只有在确认您的应用程序可以安全地共享数据库连接后，才能使用此选项。<br />以下模式被认为是安全的：<ul><li> <code>SET</code> 语句，其中没有更改有效会话变量值。换句话说，会话变量没有变化。 </li><li> 您可以更改会话变量值并在同一个事务中执行一条语句。 </li></ul><br />有关更多信息，请参阅 <a href="rds-proxy-pinning.md">避免固定 RDS 代理</a>。</td></tr>
  <tr><td><b>连接借用超时</b></td><td>如果您希望代理使用所有可用的数据库连接，请设置在代理返回超时错误之前的等待时间。最多可以指定五分钟。仅当代理已达到最大连接数并且所有连接都在使用中时，此设置才适用。</td></tr>
  <tr><td><b>初始化查询</b></td><td>（可选）添加初始化查询或修改当前查询。您可以为代理指定一个或多个 SQL 语句，以便在打开每个新数据库连接时运行。此设置通常与 <code>SET</code> 语句一起使用，以确保每个连接具有完全相同的设置。确保您添加的查询有效。要在单个 <code>SET</code> 语句中包含多个变量，请使用逗号分隔符。例如：<pre>SET {{variable1}}={{value1}}, {{variable2}}={{value2}}</pre><br />对于多个语句，请使用分号作为分隔符。 由于您可以将初始化查询作为目标组配置的一部分进行访问，因此初始化查询不受身份验证或加密方法的保护。有权查看或管理代理目标组配置的任何人都可以查看初始化查询。您不应将敏感数据（例如密码或长期保存的加密密钥）添加至此选项。 </td></tr>
  <tr><td><b>AWS Identity and Access Management（IAM）角色</b></td><td>一个有权访问 Secrets Manager 密钥的 IAM 角色，这些密钥代表代理可以使用的数据库用户账户的凭证。或者，您可以从 AWS 管理控制台创建新的 IAM 角色。 如果您的账户中启用了角色管理器，Amazon RDS 将为您附加角色，此处描述的角色选项将替换为<b>自定义</b>选项。要使用其它角色，请选择<b>自定义</b>。有关更多信息，请参阅《IAM 用户指南》<i></i>中的 <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html">IAM 角色创建</a>。 </td></tr>
  <tr><td><b>Secrets Manager 密钥</b></td><td>创建或选择 Secrets Manager 密钥，这些密钥代表可使用代理的数据库用户账户的凭证。<br />当<b>默认身份验证方案</b>设置为<b>无</b>时，此字段为必填字段。当<b>默认身份验证方案</b>设置为 <b>IAM 身份验证</b>时，该字段将变为可选字段，并在控制台中标记为可选字段。<br />您可以从下拉列表中选择一个或多个密钥，也可以使用<b>创建新密钥</b>链接创建新密钥。</td></tr>
  <tr><td><b>客户端身份验证类型</b></td><td>代理对来自客户端的连接使用的身份验证类型。您的选择适用于与此代理关联的所有 Secrets Manager 密钥。如果您需要为每个密钥指定不同的客户端身份验证类型，请使用 AWS CLI 或改用 API 创建代理。只有当您的客户端连接使用数据库凭证进行身份验证时，才指定此选项。</td></tr>
  <tr><td><b>IAM 身份验证</b></td><td>针对是否对代理连接进行 IAM 身份验证，指定<b>必需</b>、<b>允许</b>或<b>不允许</b>。<b>允许</b>选项仅对 RDS for SQL Server 的代理有效。您的选择适用于与此代理关联的所有 Secrets Manager 密钥。如果您需要为每个密钥指定不同的 IAM 身份验证，请使用 AWS CLI 或改用 API 创建代理。</td></tr>
  <tr><td><b>默认身份验证方案</b></td><td>选择代理用于客户端与代理之间连接，以及代理与底层数据库之间连接的默认身份验证类型。您有以下选项：<ul><li><b>无</b>（默认）- 代理从 Secrets Manager 密钥中检索数据库凭证。</li><li><b>IAM 身份验证</b> - 代理使用 IAM 身份验证连接到数据库，从而实现端到端 IAM 身份验证。</li></ul><br />当您选择 <b>IAM 身份验证</b>时，会出现一条信息提示，提醒您为目标组配置中的数据库启用 IAM 数据库身份验证。 此选项仅支持 MySQL、PostgreSQL 和 MariaDB 引擎系列。 </td></tr>
  <tr><td><b>用于 IAM 身份验证的数据库账户</b></td><td>仅当<b>默认身份验证方案</b>设置为 <b>IAM 身份验证</b>且 <b>Identity and Access Management（IAM）角色</b>设为<b>创建 IAM 角色</b>时，才会显示该字段。<br />命名代理要用于 IAM 身份验证的数据库用户账户。此字段为必填字段。通过以下方式指定多个账户：<ul><li>键入数据库用户名将其添加为标签</li><li>使用特定的数据库用户名（例如 <code>db_user</code>、<code>jane_doe</code>）</li><li>为多个用户使用通配符模式（例如 <code>db_test_*</code>）</li></ul><br />每个账户都显示为一个可移除的标签，您可以通过单击 X 图标将其删除。控制台使用这些值在 IAM 角色策略中创建相应的 <code>rds-db:connect</code> 权限。</td></tr>
  <tr><td><b>需要传输层安全性</b></td><td>对所有客户端连接强制执行 TLS/SSL。代理对其与底层数据库的连接使用相同的加密设置，无论客户端连接是已加密还是未加密。</td></tr>
  <tr><td><b>目标连接网络类型</b></td><td>代理用于连接到目标数据库的 IP 版本。从以下选项中进行选择：<ul><li> <b>IPv4</b> - 代理使用 IPv4 地址连接到数据库。 </li><li> <b>IPv6</b> - 代理使用 IPv6 地址连接到数据库。 </li></ul><br />默认值为 IPv4。要使用 IPv6，您的数据库必须支持双栈模式。双栈模式不适用于目标连接。</td></tr>
  <tr><td><b>端点网络类型</b></td><td>客户端用来连接代理的代理端点的 IP 版本。从以下选项中进行选择：<ul><li> <b>IPv4</b> – 代理端点仅使用 IPv4 地址。 </li><li> <b>IPv6</b> — 代理端点仅使用 IPv6 地址。 </li><li> <b>双栈</b> — 代理端点同时支持 IPv4 和 IPv6 地址。 </li></ul><br />默认值为 IPv4。要使用 IPv6 或双栈，必须将您的 VPC 和子网配置为支持所选的网络类型。</td></tr>
  <tr><td><b>子网</b> – </td><td>此字段预填充与您的 VPC 关联的所有子网。您可以移除代理不需要的任何子网，但必须至少保留两个子网。对于 IPv6 或双栈端点网络类型，请确保所选子网支持所选的网络类型。</td></tr>
  <tr><td><b>VPC security group (VPC 安全组</b>)。</td><td>选择现有 VPC 安全组或者从 AWS 管理控制台创建一个新的安全组。配置入站规则以支持应用程序访问代理，并配置出站规则以支持来自数据库目标的流量。 此安全组必须支持从代理到数据库的连接。它既用于从应用程序到代理的入口，也用于从代理到数据库的出口。例如，如果您对数据库和代理使用相同的安全组，则确保该安全组中的资源可以相互通信。 <br />使用共享 VPC 时，避免使用 VPC 的默认安全组或与另一个账户关联的安全组。而是选择属于您的账户的安全组。如果不存在安全组，则创建一个安全组。有关更多信息，请参阅<a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html#vpc-share-limitations">使用共享 VPC</a>。 <br />RDS 跨多个可用区部署代理以确保高可用性。要启用跨可用区通信，代理子网的网络访问控制列表（ACL）必须支持引擎端口上的出口和所有端口上的入口。有关网络 ACL 的更多信息，请参阅<a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html">使用网络 ACL 控制指向子网的流量</a>。如果代理和目标的网络 ACL 相同，则必须添加 <b>TCP</b> 协议入口规则，其中<b>源</b>设置为 VPC CIDR。您还必须添加特定于引擎端口的 <b>TCP</b> 协议出口规则，其中<b>目标</b>设置为 VPC CIDR。</td></tr>
  <tr><td><b>激活增强的日志记录</b></td><td>启用该设置可解决代理兼容性或性能问题。启用后，RDS 代理会记录详细的性能信息，有助于您调试 SQL 行为或代理连接性能和可扩展性。<br />仅启用此设置来进行调试，并确保已采取适当的安全措施来保护日志中的敏感信息。为了最大限度地减少开销，RDS 代理会在激活后 24 小时自动禁用此设置。可以临时使用它来解决特定问题。</td></tr>
</tbody>
</table>


1.  选择 **Create proxy (创建代理)**。

## AWS CLI
<a name="rds-proxy-creating.CLI"></a>

 要使用 AWS CLI 创建代理，请使用以下必需的参数调用 [create-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-proxy.html) 命令：
+ `--db-proxy-name`
+ `--engine-family`
+ `--role-arn`
+ `--vpc-subnet-ids`

`--engine-family` 值区分大小写。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-db-proxy \
    --db-proxy-name {{proxy_name}} \
    --engine-family { MYSQL | POSTGRESQL | SQLSERVER } \
    --role-arn {{iam_role}} \
    --vpc-subnet-ids {{space_separated_list}} \
    [--default-auth-scheme { NONE | IAM_AUTH }] \
    [--auth {{ProxyAuthenticationConfig_JSON_string}}] \
    [--vpc-security-group-ids {{space_separated_list}}] \
    [--require-tls | --no-require-tls] \
    [--idle-client-timeout {{value}}] \
    [--debug-logging | --no-debug-logging] \
    [--endpoint-network-type { IPV4 | IPV6 | DUAL }] \
    [--target-connection-network-type { IPV4 | IPV6 }] \
    [--tags {{comma_separated_list}}]
```
对于：Windows  

```
aws rds create-db-proxy ^
    --db-proxy-name {{proxy_name}} ^
    --engine-family { MYSQL | POSTGRESQL | SQLSERVER } ^
    --role-arn {{iam_role}} ^
    --vpc-subnet-ids {{space_separated_list}} ^
    [--default-auth-scheme { NONE | IAM_AUTH }] ^
    [--auth {{ProxyAuthenticationConfig_JSON_string}}] ^
    [--vpc-security-group-ids {{space_separated_list}}] ^
    [--require-tls | --no-require-tls] ^
    [--idle-client-timeout {{value}}] ^
    [--debug-logging | --no-debug-logging] ^
    [--endpoint-network-type { IPV4 | IPV6 | DUAL }] ^
    [--target-connection-network-type { IPV4 | IPV6 }] ^
    [--tags {{comma_separated_list}}]
```

以下是 `--auth` 选项的 JSON 值的示例。此示例对每个密钥应用不同的客户端身份验证类型。

```
[
  {
    "Description": "proxy description 1",
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789123:secret/1234abcd-12ab-34cd-56ef-1234567890ab",
    "IAMAuth": "DISABLED",
    "ClientPasswordAuthType": "POSTGRES_SCRAM_SHA_256"
  },
  
  {
    "Description": "proxy description 2",
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:us-west-2:111122223333:secret/1234abcd-12ab-34cd-56ef-1234567890cd",
    "IAMAuth": "DISABLED",
    "ClientPasswordAuthType": "POSTGRES_MD5"
    
  },
  
  {
    "Description": "proxy description 3",
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:us-west-2:111122221111:secret/1234abcd-12ab-34cd-56ef-1234567890ef",
    "IAMAuth": "REQUIRED"
  }
  
]
```

`--endpoint-network-type` 参数指定客户端用于连接代理的代理端点的 IP 版本。有效值为：
+ `IPV4` – 代理端点仅使用 IPv4 地址（默认）。
+ `IPV6` – 代理端点仅使用 IPv6 地址。
+ `DUAL` – 代理端点支持 IPv4 和 IPv6 地址。

`--target-connection-network-type` 参数指定代理用于连接到目标数据库的 IP 版本。有效值为：
+ `IPV4` – 代理使用 IPv4 地址连接到数据库（默认）。
+ `IPV6` – 代理使用 IPv6 地址连接到数据库。

要使用 IPv6 或双栈端点网络类型，必须将您的 VPC 和子网配置为支持所选网络类型。要使用 IPv6 目标连接网络类型，您的数据库必须支持双栈模式。

**提示**  
 如果您尚不知道要用于 `--vpc-subnet-ids` 参数的子网 ID，请参阅 [设置 RDS 代理的网络先决条件](rds-proxy-network-prereqs.md) 获取有关如何查找它们的示例。

**注意**  
安全组必须允许访问代理连接到的数据库。同一安全组用于从应用程序到代理的入口以及从代理到数据库的出口。例如，假设您对数据库和代理使用同一安全组。在这种情况下，请确保您指定该安全组中的资源可以与同一安全组中的其他资源进行通信。  
使用共享 VPC 时，您不能使用 VPC 的默认安全组，也不能使用属于其他账户的安全组。选择属于您账户的安全组。如果不存在，请创建一个。有关此限制的详细信息，请参阅[使用共享 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html#vpc-share-limitations)。

 要为代理创建正确的关联，您还可以使用 [register-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/register-db-proxy-targets.html) 命令。指定目标组名称 `default`。创建每个代理时，RDS Proxy 会自动创建一个此名称的目标组。

```
aws rds register-db-proxy-targets
    --db-proxy-name {{value}}
    [--target-group-name {{target_group_name}}]
    [--db-instance-identifiers {{space_separated_list}}]  # rds db instances, or
    [--db-cluster-identifiers {{cluster_id}}]        # rds db cluster (all instances)
```

## RDS API
<a name="rds-proxy-creating.API"></a>

 要创建 RDS 代理，请调用 Amazon RDS API 操作 [CreateDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBProxy.html)。传递具有 [AuthConfig](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AuthConfig.html) 数据结构的参数。

 创建每个代理时，RDS Proxy 会自动创建一个名为 `default` 的目标组。通过调用函数 [RegisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RegisterDBProxyTargets.html)，将 RDS 数据库实例与目标组关联。

**重要**  
当您选择 **IAM 身份验证**作为默认身份验证方案时：  
在代理成功连接之前，您必须在目标数据库实例或集群上启用 IAM 数据库身份验证。
如果选择**创建 IAM 角色**，则必须填写**用于 IAM 身份验证的数据库账户**字段。
如果选择现有 IAM 角色，则控制台不会自动更新具有数据库连接权限的角色。请检查该角色是否具有必要的 `rds-db:connect` 权限。