

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 管理 RDS Proxy
<a name="rds-proxy-managing"></a>

 本節提供如何管理 RDS Proxy 操作和組態的資訊。這些程序可協助應用程式以最有效率的方式使用資料庫連線，並達到最大程度的連線重複使用。您越能利用連線重複使用，就越能節省更多 CPU 和記憶體負荷。這樣可以縮短應用程式的延遲，並讓資料庫投入更多資源來處理應用程式要求。

**Topics**
+ [修改 RDS Proxy](rds-proxy-modifying-proxy.md)
+ [使用 RDS Proxy 時新增資料庫使用者](rds-proxy-new-db-user.md)
+ [從標準 IAM 身分驗證移至 RDS Proxy end-to-end IAM 身分驗證](rds-proxy-iam-migration.md)
+ [RDS Proxy 連線考量事項](rds-proxy-connections.md)
+ [避免鎖定 RDS Proxy](rds-proxy-pinning.md)
+ [刪除 RDS Proxy](rds-proxy-deleting.md)

# 修改 RDS Proxy
<a name="rds-proxy-modifying-proxy"></a>

 您可以在建立代理之後變更與該代理相關聯的特定設定。您可以修改代理本身、它的關聯目標群組，或兩者都修改。每個代理都有一個關聯的目標群組。

## AWS 管理主控台
<a name="rds-proxy-modifying-proxy.console"></a>

**重要**  
**Client authentication type** (用戶端身分驗證類型) 和 **IAM authentication** (IAM 身分驗證) 欄位中的值適用於與此代理相關聯的所有 Secrets Manager 機密。若要為每個秘密指定不同的值，請改用 AWS CLI 或 API 修改您的代理。

**若要修改代理的設定**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)：// 開啟 Amazon RDS 主控台。

1.  在導覽窗格中，選擇 **Proxies** (代理)。

1.  在代理清單中，選擇您要修改其設定的代理伺服器，或移至其詳細資訊頁面。

1.  在 **Actions** (動作) 中，選擇 **Modify** (修改)。

1.  輸入或選擇要修改的屬性。您可以修改下列選項：
   +  **Proxy identifier** (Proxy 識別碼) – 輸入新的識別碼，以便將 Proxy 重新命名。
   +  **Idle client connection timeout** (閒置用戶端連線逾時) – 輸入閒置用戶端連線逾時的期間。
   +  **IAM role** (IAM 角色) – 變更從 Secrets Manager 中擷取秘密所使用的 IAM 角色。
**注意**  
如果您將**預設身分驗證機制**設定為 IAM **身分驗證，則無法建立新的 IAM** 角色。
   +  **Secrets Manager secrets** (Secrets Manager 秘密) – 新增或移除 Secrets Manager 秘密。這些秘密對應於資料庫使用者名稱和密碼。
   +  **用戶端身分驗證類型** – 變更用戶端連線至代理的身分驗證類型。
   +  **IAM authentication** (IAM 身分驗證) – 要求或不允許連線至 Proxy 時進行 IAM 身分驗證。
   +  **預設身分驗證機制** – 變更代理用於用戶端連線至代理以及從代理連線至基礎資料庫的預設身分驗證機制。
   +  **Require Transport Layer Security** – 開啟或關閉 Transport Layer Security (TLS) 的需求。
   +  **VPC security group** (VPC 安全群組) – 新增或移除 Proxy 要使用的 VPC 安全群組。
   +  **Enable enhanced logging** (啟用增強型日誌) – 啟用或停用增強型日誌。

1.  選擇 **Modify** (修改)。

如果您找不到您要變更的列出設定，請使用下列程序更新代理的目標群組。與代理相關聯的*目標群組*可控制與實體資料庫連線相關的設定。每個代理都有一個名為 `default` 的關聯目標群組，這些群組將與代理一起自動建立。您無法重新命名預設目標群組。

 您只能從代理詳細資訊頁面修改目標群組，而不能從 **代理**頁面上的清單修改。

**若要修改代理目標群組的設定**

1.  在 **Proxies** (代理) 頁面上，前往代理的詳細資訊頁面。

1.  在**目標群組**中選擇 `default` 連結。目前，所有的代理都有一個名為 `default` 的目標群組。

1.  在**預設**目標群組的詳細資訊頁面上，選擇 **Modify (修改)**。

1.  選擇您可修改之屬性的新設定：
   +  **資料庫** – 選擇不同的 RDS 資料庫執行個體或叢集。
   +  **Connection pool maximum connections** (連線集區最大連線數) – 調整 Proxy 可以使用的最大可用連線數的百分比。
   +  **Session pinning filters** (工作階段鎖定篩選條件) – (選用) 選擇工作階段鎖定篩選條件。這樣做會規避用戶端連線之間多工處理資料庫連線的預設安全措施。目前，PostgreSQL 不支援該設定。唯一的選擇是 `EXCLUDE_VARIABLE_SETS`。

     啟用此設定可能會導致某個連線的工作階段變數影響其他連線。如果您的查詢取決於目前交易之外設定的工作階段變數值，這樣做可能會造成錯誤或正確性問題。請先確認應用程式可安全地在用戶端連線之間共用資料庫連線，再考慮使用此選項。

     以下模式可視為安全：
     + `SET` 陳述式，其中有效的工作階段變數值沒有變更，也就是工作階段變數沒有變更。
     + 您會在同一交易中變更工作階段變數值和執行陳述式。

     如需詳細資訊，請參閱[避免鎖定 RDS Proxy](rds-proxy-pinning.md)。
   +  **Connection borrow timeout** (連線借用逾時) – 調整連線借用逾時間隔。在已為代理使用連線數上限時，則會套用此設定。此設定會決定代理在傳回逾時錯誤之前等待連線變成可用的時間。
   + **初始化查詢**。(選用) 新增初始化查詢，或修改目前的查詢。開啟每個新資料庫連線時，您可為要執行的代理指定一或多個 SQL 陳述式。該設定通常與 `SET` 陳述式搭配使用，確保每個連線都有相同的設定。請確定您新增的查詢有效。若要在單一 `SET` 陳述式中包含多個變數，請使用逗號分隔符號。例如：

     ```
     SET variable1=value1, variable2=value2
     ```

     對於多個陳述式，請使用分號作為分隔符號。

    您無法變更某些屬性，例如目標群組識別碼和資料庫引擎。

1.  選擇 **Modify target group (修改目標群組)**。

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

 若要使用 修改代理 AWS CLI，請使用 [modify-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy.html)、 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html)、[deregister-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/deregister-db-proxy-targets.html) 和 [register-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/register-db-proxy-targets.html) 命令。

 使用 `modify-db-proxy` 命令，您可以變更屬性，如下所示：
+  代理使用的 Secrets Manager 秘密組。
+  是否需要 TLS。
+  閒置用戶端逾時。
+  是否記錄來自 SQL 陳述式的額外資訊以供偵錯。
+  用於擷取 Secrets Manager 秘密的 IAM 角色。
+  代理使用的安全群組。
+ 與代理相關聯的預設身分驗證機制。

 下列範例顯示如何將現有的代理重新命名。

```
aws rds modify-db-proxy --db-proxy-name the-proxy --new-db-proxy-name the_new_name
```

若要修改連線相關設定或重新命名目標群組，請使用 `modify-db-proxy-target-group` 命令。目前，所有的代理都有一個名為 `default` 的目標群組。使用此目標群組時，您指定代理的名稱，並將目標群組的名稱指定為 `default`。您無法重新命名預設目標群組。

 下列範例顯示如何先檢查代理的 `MaxIdleConnectionsPercent` 設定，然後使用目標群組將其變更。

```
aws rds describe-db-proxy-target-groups --db-proxy-name the-proxy

{
    "TargetGroups": [
        {
            "Status": "available",
            "UpdatedDate": "2019-11-30T16:49:30.342Z",
            "ConnectionPoolConfig": {
                "MaxIdleConnectionsPercent": 50,
                "ConnectionBorrowTimeout": 120,
                "MaxConnectionsPercent": 100,
                "SessionPinningFilters": []
            },
            "TargetGroupName": "default",
            "CreatedDate": "2019-11-30T16:49:27.940Z",
            "DBProxyName": "the-proxy",
            "IsDefault": true
        }
    ]
}

aws rds modify-db-proxy-target-group --db-proxy-name the-proxy --target-group-name default --connection-pool-config '
{ "MaxIdleConnectionsPercent": 75 }'

{
    "DBProxyTargetGroup": {
        "Status": "available",
        "UpdatedDate": "2019-12-02T04:09:50.420Z",
        "ConnectionPoolConfig": {
            "MaxIdleConnectionsPercent": 75,
            "ConnectionBorrowTimeout": 120,
            "MaxConnectionsPercent": 100,
            "SessionPinningFilters": []
        },
        "TargetGroupName": "default",
        "CreatedDate": "2019-11-30T16:49:27.940Z",
        "DBProxyName": "the-proxy",
        "IsDefault": true
    }
}
```

 使用 `deregister-db-proxy-targets` 和 `register-db-proxy-targets` 命令，您可以透過其目標群組變更 Proxy 與哪一個 RDS 資料庫執行個體相關聯。目前，每個代理都可以連線到一個 RDS 資料庫執行個體。目標群組會追蹤多可用區域組態中所有 RDS 資料庫執行個體的連線詳細資訊。

 下列範例將從與名為 `cluster-56-2020-02-25-1399` 的 Aurora MySQL 叢集關聯的代理開始。此範例顯示如何變更代理，讓它可以連線到名為 `provisioned-cluster` 的不同叢集。

 當您使用 RDS 資料庫執行個體時，請指定 `--db-instance-identifier` 選項。

 下列範例會修改 Aurora MySQL 代理。Aurora PostgreSQL 代理具有連接埠 5432。

```
aws rds describe-db-proxy-targets --db-proxy-name the-proxy

{
    "Targets": [
        {
            "Endpoint": "instance-9814.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-9814"
        },
        {
            "Endpoint": "instance-8898.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-8898"
        },
        {
            "Endpoint": "instance-1018.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-1018"
        },
        {
            "Type": "TRACKED_CLUSTER",
            "Port": 0,
            "RdsResourceId": "cluster-56-2020-02-25-1399"
        },
        {
            "Endpoint": "instance-4330.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-4330"
        }
    ]
}

aws rds deregister-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier cluster-56-2020-02-25-1399

aws rds describe-db-proxy-targets --db-proxy-name the-proxy

{
    "Targets": []
}

aws rds register-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier provisioned-cluster

{
    "DBProxyTargets": [
        {
            "Type": "TRACKED_CLUSTER",
            "Port": 0,
            "RdsResourceId": "provisioned-cluster"
        },
        {
            "Endpoint": "gkldje.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "gkldje"
        },
        {
            "Endpoint": "provisioned-1.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "provisioned-1"
        }
    ]
}
```

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

 若要使用 RDS API 修改 Proxy，請使用 [ModifyDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxy.html)、[ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)、[DeregisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeregisterDBProxyTargets.html) 和 [RegisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RegisterDBProxyTargets.html) 操作。

 使用 `ModifyDBProxy`，您可以變更屬性，如下所示：
+  代理使用的 Secrets Manager 秘密組。
+  是否需要 TLS。
+  閒置用戶端逾時。
+  是否記錄來自 SQL 陳述式的額外資訊以供偵錯。
+  用於擷取 Secrets Manager 秘密的 IAM 角色。
+  代理使用的安全群組。

使用 `ModifyDBProxyTargetGroup`，您可以修改連線相關設定。目前，所有的代理都有一個名為 `default` 的目標群組。使用此目標群組時，您指定代理的名稱，並將目標群組的名稱指定為 `default`。您無法重新命名預設目標群組。

 使用 `DeregisterDBProxyTargets` 和 `RegisterDBProxyTargets`，您可以透過其目標群組變更 Proxy 與哪一個 RDS 資料庫執行個體相關聯。目前，每個 Proxy 都可以連線到一個 RDS 資料庫執行個體。目標群組會追蹤多可用區域組態中 RDS 資料庫執行個體的連線詳細資訊。

# 使用 RDS Proxy 時新增資料庫使用者
<a name="rds-proxy-new-db-user"></a>

在某些情況下，您可能會將新的資料庫使用者新增至與 Proxy 相關聯的 RDS 資料庫執行個體或叢集。根據您是否使用標準身分驗證搭配 Secrets Manager 秘密或end-to-endIAM 身分驗證，繼續進行。

如果您使用標準 IAM 身分驗證，請遵循下列指示：

1. 使用 [設定 RDS Proxy 的資料庫登入資料](rds-proxy-secrets-arns.md) 中描述的程序建立新的 Secrets Manager 秘密。

1. 更新 IAM 角色，以授予 RDS Proxy 存取新 Secrets Manager 私密的權限。若要這麼做，請更新 IAM 角色政策的資源區段。

1. 修改 RDS Proxy，在 **Secrets Manager 密碼**下新增新的 Secrets Manager 密碼。

1.  如果新使用者取代了現有使用者，請為現有使用者更新儲存於代理的 Secrets Manager 秘密中的登入資料。

如果您使用的是end-to-end IAM 身分驗證，則需要建立資料庫使用者並設定 IAM 許可。若要這樣做，請進行下列步驟：

1. 在資料庫中建立新的資料庫使用者，以符合您要用於身分驗證的 IAM 使用者或角色名稱。

1. 確定資料庫使用者已在資料庫中設定 IAM 身分驗證外掛程式。請參閱 [使用 IAM 身分驗證建立資料庫帳戶](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

1. 更新 IAM 政策以將`rds-db:connect`許可授予 IAM 使用者或角色，如中所述[建立end-to-end IAM 身分驗證的 IAM 政策](rds-proxy-iam-setup.md#rds-proxy-iam-setup-e2e-steps)。

1. 確保您的代理設定為使用 IAM 身分驗證作為預設身分驗證機制。

透過end-to-end IAM 身分驗證，您不需要在 Secrets Manager 秘密中管理資料庫憑證，因為 IAM 憑證用於從用戶端到代理以及從代理到資料庫的身分驗證。

## 使用 RDS Proxy 時，將資料庫使用者新增至 PostgreSQL 資料庫
<a name="rds-proxy-new-db-user-pg"></a>

將新使用者新增至 PostgreSQL 資料庫時，如果您已執行下列命令：

```
REVOKE CONNECT ON DATABASE postgres FROM PUBLIC;
```

授予 `rdsproxyadmin` 使用者 `CONNECT` 權限，讓使用者可以監控目標資料庫上的連線。

```
GRANT CONNECT ON DATABASE postgres TO rdsproxyadmin;
```

您也可以透過在上述命令中將 `rdsproxyadmin` 變更為資料庫使用者，來允許其他目標資料庫使用者執行運作狀態檢查。

## 使用 RDS Proxy 時變更資料庫使用者的密碼
<a name="rds-proxy-changing-db-user-password"></a>

在某些情況下，您可能會在與 Proxy 相關聯的 RDS 資料庫執行個體中變更資料庫使用者的密碼。如果是這樣，請使用新密碼更新對應的 Secrets Manager 秘密。

如果您使用end-to-end IAM 身分驗證，則不需要更新 Secrets Manager 秘密中的任何密碼。

# 從標準 IAM 身分驗證移至 RDS Proxy end-to-end IAM 身分驗證
<a name="rds-proxy-iam-migration"></a>

 如果您目前使用 RDS Proxy 的標準 IAM 身分驗證，其中用戶端使用 IAM 向代理進行身分驗證，但代理使用秘密連接到資料庫，則可以遷移到用戶端end-to-end代理和proxy-to-database連線都使用 IAM 身分驗證的端對端 IAM 身分驗證。 client-to-proxy 

**移至end-to-end IAM 身分驗證**

1. **更新 RDS Proxy IAM 角色許可**

   建立包含 Secrets Manager 和 許可的已更新代理`rds:db-connect`許可政策：

   ```
   # Create updated proxy permission policy
   cat > updated-proxy-policy.json ≪ EOF
   ```

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "GetSecretsValue",
         "Action": [
           "secretsmanager:GetSecretValue"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-1234f"
         ]
       },
       {
         "Sid": "RdsDBConnect",
         "Action": [
           "rds-db:connect"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:rds-db:us-east-1:123456789012:dbuser:cluster-ABCDEFGHIJKL01234/jane_doe"
         ]
       }
     ]
   }
   ```

   更新代理您的角色政策：

   ```
   aws iam put-role-policy \
               --role-name RDSProxyRole \
               --policy-name UpdatedProxyPermissions \
               --policy-document file://updated-proxy-policy.json
   ```

1. 修改 RDS Proxy 以啟用end-to-end IAM 身分驗證

   ```
   aws rds modify-db-proxy \
     --db-proxy-name my-database-proxy \
     --default-auth-scheme IAM_AUTH \
     --region us-east-1
   ```

   確認 RDS Proxy 狀態為**可用**，並且在繼續以確保遷移期間零停機時間`DefaultAuthScheme``IAM_AUTH`之前。

   ```
   aws rds describe-db-proxies --db-proxy-name my-database-proxy --region us-east-1
   ```

   預期的輸出結果：

   ```
   {
     "DBProxies": [
       {
         "DBProxyName": "my-database-proxy",
         "DBProxyArn": "arn:aws:rds:us-east-1:123456789012:db-proxy:prx-0123456789abcdef",
         "Status": "available",
         ...
         "DefaultAuthScheme": "IAM_AUTH"
       }
     ]
   }
   ```

1. 在資料庫上啟用 IAM 身分驗證

   ```
   aws rds modify-db-cluster \
     --db-cluster-identifier my-database-cluster \
     --enable-iam-database-authentication \
     --region us-east-1
   ```

1. 設定資料庫使用者進行 IAM 身分驗證

   對於 RDS for PostgreSQL：

   ```
   GRANT rds_iam TO jane_doe;
   ```

   對於 RDS for MySQL 和 RDS for MariaDB：

   ```
   ALTER USER 'jane_doe' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
   ALTER USER 'jane_doe'@'%' REQUIRE SSL;
   ```

1. 您的用戶端應用程式程式碼不需要變更。連線程序保持不變：

   對於 RDS for PostgreSQL：

   ```
   # Generate authentication token
   export PGPASSWORD=$(aws rds generate-db-auth-token \
     --hostname my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com \
     --port 5432 \
     --username jane_doe \
     --region us-east-1)
   
   # Connect to database through proxy
   psql "host=my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com port=5432 user=jane_doe dbname=postgres password=$PGPASSWORD sslmode=require sslrootcert=us-east-1-bundle.pem"
   ```

   對於 RDS for MySQL 和 RDS for MariaDB：

   ```
   # Generate authentication token
   export MYSQL_PWD=$(aws rds generate-db-auth-token \
     --hostname my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com \
     --port 3306 \
     --username jane_doe \
     --region us-east-1)
   
   # Connect to database through proxy
   mysql -h my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com \
     -P 3306 \
     -u jane_doe \
     --ssl-ca=us-east-1-bundle.pem \
     --enable-cleartext-plugin
   ```

# RDS Proxy 連線考量事項
<a name="rds-proxy-connections"></a>

## 配置連線設定
<a name="rds-proxy-connection-pooling-tuning"></a>

若要調整 RDS Proxy 的連線集區，可以修改以下設定：
+ [IdleClientTimeout](#rds-proxy-connection-pooling-tuning.idleclienttimeout)
+ [MaxConnectionsPercent](#rds-proxy-connection-pooling-tuning.maxconnectionspercent)
+ [MaxIdleConnectionsPercent](#rds-proxy-connection-pooling-tuning.maxidleconnectionspercent)
+ [ConnectionBorrowTimeout](#rds-proxy-connection-pooling-tuning.connectionborrowtimeout)

### IdleClientTimeout
<a name="rds-proxy-connection-pooling-tuning.idleclienttimeout"></a>

您可以指定 Proxy 關閉用戶端連線之前允許的閒置時間長度。預設值為 1,800 秒 (30 分鐘)。

上一個要求完成後若應用程式未在的指定時間內提交新要求，用戶端連線就會被視為*閒置*。基礎資料庫連線保持開啟狀態，並傳回至連線集區。因此，它可供新的用戶端連線使用。如果您希望 Proxy 主動移除過時的連線，則降低閒置用戶端連線逾時。如果您的工作負載會經常與 Proxy 建立連線，則提高閒置用戶端連線逾時，以節省建立連線的成本。

此設定以 RDS 主控台中的 **Idle client connection timeout** (閒置用戶端連線逾時) 欄位，以及 `IdleClientTimeout` 和 API 中的 AWS CLI 設定表示。若要了解如何在 RDS 主控台中變更 **Idle client connection timeout** (閒置用戶端連線逾時) 欄位的值，請參閱 [AWS 管理主控台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。若要了解如何變更 `IdleClientTimeout` 設定的值，請參閱 CLI 命令 [modify-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy.html) 或 API 操作 [ModifyDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxy.html)。

### MaxConnectionsPercent
<a name="rds-proxy-connection-pooling-tuning.maxconnectionspercent"></a>

您可以限制 RDS Proxy 可以與目標資料庫建立的連線數。需以資料庫的可用最大連線數百分比形式指定限制。此設定以 RDS 主控台中的 **Connection pool maximum connections** (連線集區最大連線數) 欄位，以及 AWS CLI 和 API 中的 `MaxConnectionsPercent` 設定表示。

`MaxConnectionsPercent` 值會以目標群組所使用的 RDS 資料庫執行個體 的 `max_connections` 設定百分比來表示。Proxy 不會事先保留這些連線。此設定可讓 Proxy 在工作負載需要時建立這些連線。

例如，對於 `max_connections` 設定為 1000 且 `MaxConnectionsPercent` 設為 95 的已註冊資料庫目標，RDS Proxy 會將 950 個連線設定為同時連線至該資料庫目標的上限。

工作負載達到允許的資料庫連線數目上限的常見副作用，是會增加整體查詢延遲，以及提高 `DatabaseConnectionsBorrowLatency` 指標。您可以透過比較 `DatabaseConnections` 和 `MaxDatabaseConnectionsAllowed` 指標，來監控目前使用的資料庫連線和允許的總數。

設定此參數時，請注意下列最佳實務：
+ 為工作負載模式的變更提供足夠的連線預留空間。建議將參數設定至少比您最近監控的最大使用量高出 30%。由於 RDS Proxy 會在多個節點之間重新分配資料庫連線配額，因此內部容量變更可能需要至少 30% 的成長空間才能進行其他連線，以避免增加借用延遲。
+ RDS Proxy 會保留特定數量的連線以進行主動監控，以支援快速容錯移轉、流量路由和內部操作。`MaxDatabaseConnectionsAllowed` 指標不包括這些保留的連線。它代表可用於服務工作負載的連線數，並且可以低於從 `MaxConnectionsPercent` 設定衍生的值。

  最小建議 `MaxConnectionsPercent` 值
  + db.t3.small：30
  + db.t3.medium 或以上：20

若要了解如何在 RDS 主控台中變更 **Connection pool maximum connections** (連線集區最大連線數) 欄位的值，請參閱 [AWS 管理主控台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。若要了解如何變更 `MaxConnectionsPercent` 設定的值，請參閱 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

 如需資料庫連線數限制的詳細資訊，請參閱[資料庫連線數上限](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections)。

### MaxIdleConnectionsPercent
<a name="rds-proxy-connection-pooling-tuning.maxidleconnectionspercent"></a>

您可以控制 RDS Proxy 可在連線集區中保留的閒置資料庫連線數。根據預設，集區中的資料庫連線五分鐘內沒有任何活動時，RDS Proxy 就會將連線視為*閒置*。

`MaxIdleConnectionsPercent` 值會以 RDS 資料庫執行個體目標群組的 `max_connections` 設定百分比來表示。預設值為 `MaxConnectionsPercent` 的 50%，上限為 `MaxConnectionsPercent` 的值。例如，如果 `MaxConnectionsPercent` 為 80，則 `MaxIdleConnectionsPercent` 的預設值為 40。如果未指定 `MaxConnectionsPercent` 的值，則對於 RDS for SQL Server，`MaxIdleConnectionsPercent` 為 5，而所有其他引擎的預設值為 50。

值大時，Proxy 會將高百分比的閒置資料庫連線維持在開啟狀態。值小時，Proxy 就會關閉高百分比的閒置資料庫連線。如果您的工作負載無法預測，請考慮為 `MaxIdleConnectionsPercent` 設定一個高值。這麼做表示 RDS Proxy 可以因應活動中的突增情況，而無需開啟大量新的資料庫連線。

此設定以 AWS CLI 和 API 中 `DBProxyTargetGroup` 的 `MaxIdleConnectionsPercent` 設定表示。若要了解如何變更 `MaxIdleConnectionsPercent` 設定的值，請參閱 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

 如需資料庫連線數限制的詳細資訊，請參閱[資料庫連線數上限](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections)。

### ConnectionBorrowTimeout
<a name="rds-proxy-connection-pooling-tuning.connectionborrowtimeout"></a>

您可以選擇 RDS Proxy 在傳回逾時錯誤之前，等待連線集區中的資料庫連線變成可用的時間。預設值為 120 秒。此設定適用於連線數達到最大值，因此連線集區中沒有可用的連線時。這也適用於沒有適當的資料庫執行個體可用於處理請求的情況，例如容錯移轉操作進行中時。透過此設定，您可為應用程式設定最佳等待期間，而不必變更應用程式的程式碼中的查詢逾時。

此設定以 RDS 主控台中的 **Connection borrow timeout** (連線借用逾時) 欄位，或者 AWS CLI 或 API 中 `DBProxyTargetGroup` 的 `ConnectionBorrowTimeout` 設定表示。若要了解如何在 RDS 主控台中變更 **Connection borrow timeout** (連線借用逾時) 欄位的值，請參閱 [AWS 管理主控台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。若要了解如何變更 `ConnectionBorrowTimeout` 設定的值，請參閱 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

## 用戶端與資料庫連線
<a name="rds-proxy-connection-life"></a>

從應用程式到 RDS Proxy 的連線稱為用戶端連線。從 Proxy 到資料庫的連線為資料庫連線。使用 RDS Proxy 時，用戶端連線會在 Proxy 終止，而資料庫連線則是在 RDS Proxy 內管理。

應用程式端連線集區可提供減少應用程式與 RDS Proxy 之間建立重複連線的好處。

在實作應用程式端連線集區之前，請考量下列組態層面：
+ 用戶端連線生命週期上限：RDS Proxy 會將用戶端連線的生命週期上限強制為 24 小時。此值不可設定。設定連線生命週期上限少於 24 小時的集區，以避免意外的用戶端連線中斷。
+ 用戶端連線閒置逾時：RDS Proxy 會強制執行用戶端連線的閒置時間上限。設定閒置連線逾時值低於 RDS Proxy 用戶端連線閒置逾時設定的集區，以避免意外連線中斷。

在應用程式端連線集區中設定的用戶端連線數目上限不必限制為 RDS Proxy 的 **max\$1connections** 設定。

用戶端連線集區會延長用戶端連線生命週期。如果您的連線遭遇綁定，則集區用戶端連線可能會降低多工效率。在應用程式端連線集區中綁定但閒置的用戶端連線會繼續保留資料庫連線，並防止其他用戶端連線重複使用資料庫連線。檢閱您的 Proxy 日誌，以檢查您的連線是否遭遇綁定。

**注意**  
RDS Proxy 會在不再使用資料庫連線 24 小時後的某個時間，關閉資料庫連線。無論閒置連線數上限設定的值為何，Proxy 都會執行此動作。

# 避免鎖定 RDS Proxy
<a name="rds-proxy-pinning"></a>

 當資料庫請求不依賴先前請求的狀態資訊時，多工會更有效率。在這種情況下，RDS Proxy 可以在每一筆交易結束時重複使用連線。這類狀態資訊的範例包括您可以透過 `SET` 或 `SELECT` 陳述式變更的大部分變數和組態參數。根據預設，用戶端連線上的 SQL 交易可以在基礎資料庫連線之間進行多工。

 您與代理的連線可能會進入一種稱為*鎖定*的狀態。連線被鎖定時，每一筆後續交易都會使用相同的基礎資料庫連線，直到工作階段結束為止。其他用戶端連線也無法重複使用該資料庫連線，直到工作階段結束為止。工作階段會在用戶端連線中斷時結束。

 在偵測到不適用於其他工作階段的工作階段狀態變更時，RDS Proxy 會自動將用戶端連線鎖定至特定資料庫連線。鎖定會降低連線重複使用的有效性。如果所有或幾乎所有的連線都遭遇鎖定，請考慮修改應用程式的程式碼或工作負載，以減少導致鎖定的情況。

例如，您的應用程式變更了工作階段變數或組態參數。在此情況下，稍後的陳述式可能會依賴新的變數或參數才會生效。因此，當 RDS Proxy 處理請求，而變更工作階段變數或組態設定時，會將該工作階段到資料庫的連線鎖定。這樣一來，工作階段狀態對於同一工作階段中的所有後續交易仍然有效。

 對於部分資料庫引擎，此規則不適用於您可以設定的所有參數。RDS Proxy 會追蹤某些陳述式和變數。因此，當您修改這些項目時，RDS Proxy 不會鎖定工作階段。在這種情況下，RDS Proxy 只會重複使用其他工作階段的連線，這些工作階段具有與這些設定相同的值。如需 RDS Proxy 針對資料庫引擎追蹤哪些項目的詳細資訊，請參閱下列內容：
+ [RDS Proxy 針對 RDS for SQL Server 資料庫追蹤哪些項目](#rds-proxy-pinning.sql-server-tracked-vars)
+ [RDS Proxy 針對 RDS for MariaDB 和 RDS for MySQL 資料庫追蹤哪些項目](#rds-proxy-pinning.mysql-tracked-vars)

## RDS Proxy 針對 RDS for SQL Server 資料庫追蹤哪些項目
<a name="rds-proxy-pinning.sql-server-tracked-vars"></a>

RDS Proxy 會追蹤下列 SQL Server 陳述式：
+ `USE`
+ `SET ANSI_NULLS`
+ `SET ANSI_PADDING`
+ `SET ANSI_WARNINGS`
+ `SET ARITHABORT`
+ `SET CONCAT_NULL_YIELDS_NULL`
+ `SET CURSOR_CLOSE_ON_COMMIT`
+ `SET DATEFIRST`
+ `SET DATEFORMAT`
+ `SET LANGUAGE`
+ `SET LOCK_TIMEOUT`
+ `SET NUMERIC_ROUNDABORT`
+ `SET QUOTED_IDENTIFIER`
+ `SET TEXTSIZE`
+ `SET TRANSACTION ISOLATION LEVEL`

## RDS Proxy 針對 RDS for MariaDB 和 RDS for MySQL 資料庫追蹤哪些項目
<a name="rds-proxy-pinning.mysql-tracked-vars"></a>

RDS Proxy 會追蹤下列 MariaDB 和 MySQL 陳述式：
+ DROP DATABASE
+ DROP SCHEMA
+ USE

RDS Proxy 會追蹤下列 MySQL 和 MariaDB 變數：
+ `AUTOCOMMIT`
+ `AUTO_INCREMENT_INCREMENT`
+ `CHARACTER SET (or CHAR SET)`
+ `CHARACTER_SET_CLIENT`
+ `CHARACTER_SET_DATABASE`
+ `CHARACTER_SET_FILESYSTEM`
+ `CHARACTER_SET_CONNECTION`
+ `CHARACTER_SET_RESULTS`
+ `CHARACTER_SET_SERVER`
+ `COLLATION_CONNECTION`
+ `COLLATION_DATABASE`
+ `COLLATION_SERVER`
+ `INTERACTIVE_TIMEOUT`
+ `NAMES`
+ `NET_WRITE_TIMEOUT`
+ `QUERY_CACHE_TYPE`
+ `SESSION_TRACK_SCHEMA`
+ `SQL_MODE`
+ `TIME_ZONE`
+ `TRANSACTION_ISOLATION (or TX_ISOLATION)`
+ `TRANSACTION_READ_ONLY (or TX_READ_ONLY)`
+ `WAIT_TIMEOUT`

**注意**  
當您在工作階段範圍設定變數時，RDS Proxy 會追蹤對 `TRANSACTION_ISOLATION` 和 `TRANSACTION_READ_ONLY` 變數的變更。不過，如果您在下一個交易範圍設定它們，RDS Proxy 會鎖定連線。無論您使用 `SET` 陳述式或 `SET TRANSACTION` 陳述式來設定這些值，此行為都適用。

## 盡可能減少鎖定
<a name="rds-proxy-pinning.minimizing"></a>

 RDS Proxy 的效能調校涉及試圖藉由將鎖定降到最低，讓交易層級的連線重複使用 (多工) 達到最大。

您可以執行下列操作，盡可能減少鎖定：
+  避免可能導致鎖定的不必要資料庫要求。
+  在所有連線中一致地設定變數和組態設定。這樣，稍後的工作階段更有可能重複使用具有這些特定設置的連線。

   但是，對於 PostgreSQL，設定變數會導致工作階段鎖定。
+  若為 MySQL 引擎系列資料庫，將工作階段鎖定篩選條件套用至代理。如果您知道鎖定並不會影響應用程式的正確操作，就可以免除某些類型的操作將工作階段鎖定。
+  監控 Amazon CloudWatch 指標 `DatabaseConnectionsCurrentlySessionPinned`，以查看鎖定發生的頻率。如需有關此 CloudWatch 指標和其他 CloudWatch 指標的資訊，請參閱 [使用 Amazon CloudWatch 監控 RDS Proxy 指標使用 CloudWatch 監控 RDS Proxy](rds-proxy.monitoring.md)。
+  如果您使用 `SET` 陳述式為每個用戶端連線執行相同的初始化，您可以執行此操作，同時保留交易層級的多工。在此情況下，您可以將設定初始工作階段狀態的陳述式移至代理所使用的初始化查詢中。此屬性為一包含一個或多個以分號分隔的 SQL 陳述式的字串。

   例如，您可以為設定特定組態參數的代理定義初始化查詢。然後，每當它為該代理設定新連線時，RDS Proxy 會套用這些設定。您可以從應用程式的程式碼中移除相應的 `SET` 陳述式，這樣它們就不會干擾交易層級的多工。

   如需代理發生鎖定頻率的指標，請參閱 [使用 Amazon CloudWatch 監控 RDS Proxy 指標使用 CloudWatch 監控 RDS Proxy](rds-proxy.monitoring.md)。

## 導致所有引擎系列鎖定的條件
<a name="rds-proxy-pinning.all"></a>

 在下列情況下，多工可能會導致意外行為，代理將工作階段鎖定於目前連線：
+ 文字大小大於 16 KB 的任何陳述式會導致代理鎖定工作階段。

## 導致 RDS for Microsoft SQL Server 鎖定的條件
<a name="rds-proxy-pinning.sqlserver"></a>

 若為 RDS for SQL Server，下列互動也會導致鎖定：
+ 使用多個作用中結果集 (MARS)。如需 MARS 的詳細資訊，請參閱 [SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver16) 文件。
+ 使用分散式交易協調器 (DTC) 通訊。
+ 建立暫存資料表、交易、游標或預備陳述式。
+ 使用下列 `SET` 陳述式：
  + `SET ANSI_DEFAULTS`
  + `SET ANSI_NULL_DFLT`
  + `SET ARITHIGNORE`
  + `SET DEADLOCK_PRIORITY`
  + `SET FIPS_FLAGGER`
  + `SET FMTONLY`
  + `SET FORCEPLAN`
  + `SET IDENTITY_INSERT`
  + `SET NOCOUNT`
  + `SET NOEXEC`
  + `SET OFFSETS`
  + `SET PARSEONLY`
  + `SET QUERY_GOVERNOR_COST_LIMIT`
  + `SET REMOTE_PROC_TRANSACTIONS`
  + `SET ROWCOUNT`
  + `SET SHOWPLAN_ALL`、`SHOWPLAN_TEXT` 與 `SHOWPLAN_XML`
  + `SET STATISTICS`
  + `SET XACT_ABORT`

## 導致 RDS for MariaDB 和 RDS for MySQL 鎖定的條件
<a name="rds-proxy-pinning.mysql"></a>

 對於 MariaDB 和 MySQL，下列互動也會導致鎖定：
+ 明確的資料表鎖定陳述式 `LOCK TABLE`、`LOCK TABLES` 或 `FLUSH TABLES WITH READ LOCK` 會導致代理鎖定工作階段。
+ 使用 `GET_LOCK` 建立具名鎖定會導致代理鎖定工作階段。
+ 設定使用者或系統變數 (有某些例外) 會將工作階段鎖定至代理。如果這會大幅限制連線重複使用，您可以設定 `SET` 操作以避免鎖定。若要這樣做，請調整工作階段鎖定篩選屬性。如需詳細資訊，請參閱[為 Amazon RDS 建立代理](rds-proxy-creating.md)及[修改 RDS Proxy](rds-proxy-modifying-proxy.md)。
+ 建立一個暫時資料表會導致代理鎖定工作階段。這樣，無論交易邊界如何，暫時資料表的內容在整個工作階段中都會保留。
+ 呼叫 `ROW_COUNT` 和 `FOUND_ROWS` 函數有時會導致鎖定。
+ 預備陳述式導致代理鎖定工作階段。無論預備陳述式使用 SQL 文字或二進位協定，此規則都適用。
+ 當您使用 SET LOCAL 時，RDS Proxy 不會釘選連線。
+ 呼叫存放程序和存放函數不會導致鎖定。RDS Proxy 不會偵測由此類呼叫導致的任何工作階段狀態變更。如果您依賴該工作階段狀態在交易之間持續存在，請確保您的應用程式不會在預存常式內變更工作階段狀態。例如，RDS Proxy 目前與會建立可在所有交易之間持續存在的暫時資料表之預存程序不相容。
+ 具有 MySQL （語法 /\$1！ ... \$1/) 或 MariaDB （語法 /\$1M！ ... \$1/) 可執行註解的查詢會導致鎖定。RDS Proxy 無法剖析這些註解中內嵌的 SQL，以追蹤工作階段狀態變更。

 如果您對應用程式行為具有專業知識，您可以略過特定應用程式陳述式的鎖定行為。若要這麼做，請在建立代理時選擇**工作階段鎖定篩選條件**選項。您目前可以選擇退出工作階段鎖定，以便設定工作階段變數和組態設定。

## 導致 RDS for PostgreSQL 鎖定的條件
<a name="rds-proxy-pinning.postgres"></a>

 若是 PostgreSQL，下列互動也會導致鎖定：
+  使用 `SET` 命令。
+  使用 `PREPARE`、`DISCARD`、`DEALLOCATE` 或 `EXECUTE` 命令來管理預備陳述式。
+  建立暫時序列、資料表或檢視。
+  宣告游標。
+  放棄工作階段狀態。
+  在通知通道上接聽。
+  載入程式庫模組，例如 `auto_explain`。
+  使用 `nextval` 和 `setval` 等函數操作序列。
+  使用 `pg_advisory_lock` 和 `pg_try_advisory_lock` 等函數與鎖定互動。
**注意**  
RDS Proxy 不會鎖定交易層級諮詢鎖定，特別是 `pg_advisory_xact_lock`、`pg_advisory_xact_lock_shared`、`pg_try_advisory_xact_lock` 和 `pg_try_advisory_xact_lock_shared`。
+ 設定參數或將參數重設為預設值。具體而言，使用 `SET` 和 `set_config` 命令將預設值指派給工作階段變數。
+ 呼叫存放程序和存放函數不會導致鎖定。RDS Proxy 不會偵測由此類呼叫導致的任何工作階段狀態變更。如果您依賴該工作階段狀態在交易之間持續存在，請確保您的應用程式不會在預存常式內變更工作階段狀態。例如，RDS Proxy 目前與會建立可在所有交易之間持續存在的暫時資料表之預存程序不相容。
+ 捨棄工作階段狀態。如果您使用連線集區程式庫，並將 `DISCARD ALL` 查詢設定為重設查詢，RDS Proxy 會在發行時鎖定您的用戶端連線。這會降低代理的多工效率，並可能導致非預期的結果，因為 `DISCARD ALL` 命令可能會干擾工作階段狀態管理。

# 刪除 RDS Proxy
<a name="rds-proxy-deleting"></a>

 當您不再需要代理時，可以將它刪除。如果您讓與某一代理關聯的資料庫執行個體或叢集停止服務，也可能會刪除該代理。

## AWS 管理主控台
<a name="rds-proxy-deleting.console"></a>

**若要刪除代理**

1. 登入 AWS 管理主控台，開啟位於 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/) 的 Amazon RDS 主控台。

1.  在導覽窗格中，選擇 **Proxies** (代理)。

1.  從清單中選擇要刪除的代理。

1.  選擇 **Delete Proxy (刪除代理)**。

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

 若要刪除資料庫代理，請使用 AWS CLI 命令 [delete-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-proxy.html)。若要移除相關的關聯，請同時使用 [deregister-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/deregister-db-proxy-targets.html) 命令。

```
aws rds delete-db-proxy --name proxy_name
```

```
aws rds deregister-db-proxy-targets
    --db-proxy-name proxy_name
    [--target-group-name target_group_name]
    [--target-ids comma_separated_list]       # or
    [--db-instance-identifiers instance_id]       # or
    [--db-cluster-identifiers cluster_id]
```

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

 若要刪除資料庫代理，請呼叫 Amazon RDS API 函數 [DeleteDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteDBProxy.html)。若要刪除相關項目和關聯，您也可以呼叫函數 [DeleteDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteDBProxyTargetGroup.html) 和 [DeregisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeregisterDBProxyTargets.html)。