

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

# RDS Proxy 概念和術語
<a name="rds-proxy.howitworks"></a>

 您可以使用 RDS Proxy 來簡化 Amazon RDS 資料庫執行個體的連線管理。

 RDS Proxy 處理用戶端應用程式與資料庫之間的網路流量。它以主動方式達成此功能，首先了解資料庫協定，然後根據據應用程式的 SQL 操作和資料庫中的結果集調整其行為。

 RDS Proxy 減輕了資料庫連線管理的記憶體和 CPU 負荷。當應用程式同時開啟許多連線時，資料庫需要的記憶體和 CPU 資源比較少。它關閉並重新開啟長時間閒置的連線時，也不需要依據應用程式的邏輯。同樣地，當資料庫發生問題時，重新建立連線需要的應用程式邏輯也比較少。

 RDS Proxy 的基礎設施具備高度可用性，並可部署到數個可用區域 (AZ) 上。RDS Proxy 的運算、記憶體和儲存體與您的 RDS 資料庫執行個體無關。這種分離有助於降低資料庫伺服器的負荷，使它們可以投入資源來服務資料庫工作負載。RDS Proxy 運算資源可在無伺服器的狀態下執行，根據您的資料庫工作負載自動擴展。

**Topics**
+ [RDS Proxy 概念概觀](#rds-proxy-overview)
+ [連線集區](#rds-proxy-connection-pooling)
+ [RDS Proxy 安全性](#rds-proxy-security)
+ [容錯移轉](#rds-proxy-failover)
+ [交易](#rds-proxy-transactions)

## RDS Proxy 概念概觀
<a name="rds-proxy-overview"></a>

 RDS Proxy 運用基礎設施來執行連線集區以及以下各節描述的其他功能。您可以在**代理**頁面上看到 RDS 主控台中所代表的代理。

每個 Proxy 都會處理單一 RDS 資料庫執行個體的連線。Proxy 會自動決定 RDS Multi-AZ 資料庫執行個體的目前寫入器執行個體。

 由代理保持開放，並可供資料庫應用程式使用的連線形成了*連線集區*。

 根據預設，RDS Proxy 可以在工作階段中的每一筆交易結束之後重新使用連線。此一交易層級重複使用稱為*多工*。當 RDS Proxy 從連線集區暫時移除連線以重複使用時，該操作就是所謂的*借用*連線。在這麼做是安全的情況下，RDS Proxy 會將該連線傳回至連線集區。

 在某些情況下，RDS Proxy 無法確定在目前工作階段之外重複使用資料庫連線是否安全。這時，它會讓工作階段保持在同一連線上，直到該工作階段結束。這種回復行為稱為*鎖定*。

代理具有預設端點。當使用 Amazon RDS 資料庫執行個體時，您會連線到此端點。您會這樣做，而不是連線到直接連線至執行個體的讀取/寫入端點。對於 RDS 資料庫叢集，您也可以建立額外的讀取/寫入和唯讀端點。如需詳細資訊，請參閱[代理端點概觀](rds-proxy-endpoints.md#rds-proxy-endpoints-overview)。

 例如，您仍然可以連線到叢集端點以進行讀取/寫入連線，而不需要連線集區。您仍然可以連線至讀取器端點，以進行唯讀連線的負載平衡。您仍然可以連線到執行個體端點，以便對叢集內的特定資料庫執行個體進行診斷和疑難排解。如果您使用其他 AWS 服務 AWS Lambda ，例如 連接到 RDS 資料庫，請變更其連線設定以使用代理端點。例如，您可以指定代理端點，以允許 Lambda 函數存取您的資料庫，同時利用 RDS Proxy 功能。

 每個代理都包含一個目標群組。此*目標群組*體現了 Proxy 可以連線的 RDS 資料庫執行個體。與 Proxy 相關聯的 RDS 資料庫執行個體稱為該 Proxy 的*目標*。為了方便起見，當您透過主控台建立代理伺服器時，RDS Proxy 也會建立對應的目標群組，並自動註冊關聯的目標。

 *引擎系列*是一組使用相同資料庫協定的相關資料庫引擎。您可以為您建立的每一個代理選擇引擎系列。

## 連線集區
<a name="rds-proxy-connection-pooling"></a>

每個 Proxy 都會針對其相關聯 RDS 資料庫的寫入器和讀取器執行個體個別執行連線集區。*連線集區*是一種最佳化，可以減輕開啟和關閉連線，以及保持許多連線同時開啟的相關負荷。此一負荷包含處理每個新連線所需的記憶體。它還涉及關閉每個連線和開啟新連線的 CPU 額外負荷。範例包括 Transport Layer Security/Secure Sockets Layer (TLS/SSL) 交握、身分驗證、協商功能等。連線集區簡化了應用程式的邏輯。您不需要撰寫應用程式碼，以便同時開啟的連線數降到最低。

 每個 Proxy 也會執行連線多工，又稱為連線重用。RDS Proxy 運用「多工」**，使用一個基礎資料庫連線執行一筆交易的所有操作。然後，RDS 可以使用不同的連線處理下一筆交易。您可以同時開啟到代理的多個連線，代理則使較少的資料庫執行個體或叢集連線保持開啟。這樣做可以進一步減輕資料庫伺服器上連線的記憶體負荷。此技術也可以降低發生「連線數太多」錯誤的可能性。

## RDS Proxy 安全性
<a name="rds-proxy-security"></a>

 RDS Proxy 會使用現有的 RDS 安全機制，例如 TLS/SSL 和 AWS Identity and Access Management (IAM)。如需這些安全功能的一般資訊，請參閱 [Amazon RDS 的安全性](UsingWithRDS.md)。此外，請務必熟悉 RDS 如何使用身分驗證、授權和其他安全領域。

 RDS Proxy 可以充當用戶端應用程式和基礎資料庫之間的額外安全層。例如，即使基礎資料庫執行個體支援舊版 TLS，您仍可使用 TLS 1.3 連線至代理。您可以使用 IAM 角色連接到代理，即使代理使用資料庫使用者和密碼身分驗證方法連接到資料庫。您可以使用這種技術，強制資料庫應用程式執行嚴格的身分驗證要求，而無需在資料庫執行個體上進行昂貴的遷移工作。

您可以搭配 RDS Proxy 使用下列身分驗證方法：
+ **資料庫登入資料**
+ **標準 IAM 身分驗證**
+ **End-to-end IAM 身分驗證**

### 搭配 RDS Proxy 使用 IAM
<a name="rds-proxy-security.IAM"></a>

RDS Proxy 提供兩種 IAM 身分驗證方法：
+ **標準 IAM 身分**驗證：在代理使用存放在 Secrets Manager 中的登入資料連線到資料庫時，對代理的連線強制執行 IAM 身分驗證。即使資料庫使用原生密碼身分驗證，這也會強制執行資料庫存取的 IAM 身分驗證。代理會從 Secrets Manager 擷取資料庫登入資料，並代表您的應用程式處理對資料庫的身分驗證。
+ **End-to-end IAM 身分驗證**：針對直接從應用程式透過代理連線到資料庫的連線，強制執行 IAM 身分驗證。End-to-end IAM 身分驗證可簡化您的安全組態，並避免在 Secrets Manager 中管理資料庫登入資料。這一層額外的安全層會強制執行從用戶端應用程式到資料庫的 IAM 型存取控制。

若要使用標準 IAM 身分驗證，請將您的代理設定為使用 Secrets Manager 秘密進行身分驗證，並為用戶端連線啟用 IAM 身分驗證。您的應用程式使用 IAM 向代理進行身分驗證，而代理使用從 Secrets Manager 擷取的登入資料向資料庫進行身分驗證。

若要使用end-to-end IAM 身分驗證，請在建立或修改代理時，將代理設定為在設定預設身分驗證機制時使用 IAM 身分驗證。

對於end-to-end IAM 身分驗證，您必須更新與代理相關聯的 IAM 角色，以授予 `rds-db:connect`許可。透過end-to-end IAM 身分驗證，不需要透過 Secrets Manager 秘密向代理註冊個別資料庫使用者。

### 搭配 RDS Proxy 使用 TLS/SSL
<a name="rds-proxy-security.tls"></a>

 您可以使用 TLS/SSL 通訊協定連線到 RDS Proxy。

**注意**  
 RDS Proxy 使用來自 AWS Certificate Manager (ACM) 的憑證。如果您正在使用 RDS Proxy，您不需要下載 Amazon RDS 憑證或更新使用 RDS Proxy 連線的應用程式。

若要針對代理與資料庫之間的所有連線強制執行 TLS，您可以在 AWS 管理主控台中建立或修改代理時，指定**需要 Transport Layer Security** 設定。

RDS Proxy 也能確保您的工作階段在用戶端與 RDS Proxy 端點之間使用 TLS/SSL。若要讓 RDS Proxy 執行此作業，請在用戶端指定需求。SSL 工作階段變數不會針對使用 RDS Proxy 之資料庫的 SSL 連線進行設定。
+  若為 RDS for MySQL，請在執行 `mysql` 命令時，使用 `--ssl-mode` 參數在用戶端指定需求。
+  若為 Amazon RDS PostgreSQL，請在執行 `psql` 命令時，指定 `sslmode=require` 做為 `conninfo` 字串的一部分。

RDS Proxy 支援 TLS 通訊協定 1.0、1.1、1.2 和 1.3 版。您可以使用比基礎資料庫中所使用之 TLS 更新的版本連線至代理。

根據預設，用戶端程式會使用 RDS Proxy 建立加密連線，並且可透過 `--ssl-mode` 選項取得進一步的控制。RDS Proxy 在用戶端支援所有 SSL 模式。

 針對用戶端，SSL 模式如下：

**PREFERRED**  
 SSL 為第一個選擇，但並非必要。

**DISABLED**  
 不允許任何 SSL。

**REQUIRED**  
 強制採用 SSL。

**VERIFY\$1CA**  
 強制採用 SSL 並驗證憑證授權單位 (CA)。

**VERIFY\$1IDENTITY**  
 強制採用 SSL 並驗證 CA 和 CA 主機名稱。

 在搭配 `--ssl-mode` `VERIFY_CA` 或 `VERIFY_IDENTITY` 使用用戶端時，請指定指向 `--ssl-ca` 格式 CA 的 `.pem` 選項。對於要使用的 `.pem` 檔案，請從 [Amazon Trust Services](https://www.amazontrust.com/repository/) 下載所有根 CA PEM 並將它們放入單一 `.pem` 檔案。

 RDS Proxy 使用萬用字元憑證，此憑證同時套用至網域及其子網域。如果您使用 `mysql` 用戶端來利用 SSL 模式 `VERIFY_IDENTITY` 連接，則目前必須使用 MySQL 8.0 相容的 `mysql` 命令。

## 容錯移轉
<a name="rds-proxy-failover"></a>

 *容錯移轉*是一種高可用性功能，當原始執行個體無法使用時，用另一個來取代該資料庫執行個體。發生容錯移轉可能是因為資料庫執行個體發生問題。它也可能是正常維護程序的一部分，例如在資料庫升級期間。容錯移轉適用於多可用區域組態中的 RDS 資料庫執行個體。

 透過代理進行連線可讓您的應用程式對於資料庫容錯移轉更有彈性。當原始資料庫執行個體無法使用時，RDS Proxy 會連線至待命資料庫，而不會捨棄閒置的應用程式連線。這樣有助於加速並簡化容錯移轉程序。這對應用程式的干擾也比一般的重新啟動或資料庫問題更少。

 如果沒有 RDS Proxy，容錯移轉將導致短暫的執行中斷。在中斷期間，您無法對容錯移轉中的資料庫執行寫入操作。任何現有的資料庫連線都會中斷，您的應用程式必須將其重新開啟。當提升唯讀資料庫執行個體，以取代無法使用的執行個體時，該資料庫將可使用於新連線和寫入操作。

 在資料庫容錯移轉期間，RDS Proxy 繼續接受位於相同 IP 地址的連線，並自動將連線導向至新的主要資料庫執個體。透過 RDS Proxy 連線的用戶端不會受到下列項目影響：
+  容錯移轉時的網域名稱系統 (DNS) 傳播延遲。
+  本機 DNS 快取。
+  連線逾時。
+  不確定哪個資料庫執行個體是目前的寫入器。
+  等候來自已不可使用，卻未關閉連線的前寫入器的查詢回應。

 對於自行維護連線集區的應用程式而言，經歷 RDS Proxy 意味著大部分的連線在容錯移轉或其他中斷期間保持活動狀態。只會取消處於交易或 SQL 陳述式中間的連線。RDS Proxy 會立即接受新的連線。當資料庫寫入器無法使用時，RDS Proxy 會將傳入的請求排入佇列。

 對於不自行維護連線集區的應用程式，RDS Proxy 提供了更快的連線速率和更多的開放連線。它免除了從資料庫頻繁重新連接的昂貴負荷。它會重複使用 RDS Proxy 的連線集區中維護的資料庫連線，而達成此功能。此方法對於 TLS 連線來說尤其重要，因為設定成本很大。

## 交易
<a name="rds-proxy-transactions"></a>

 單一交易中的所有陳述式總是使用相同的基礎資料庫連線。當交易結束時，連線將可提供給不同的工作階段使用。使用交易做為粒度單位會產生下列後果：
+  開啟 RDS for MySQL `autocommit` 設定時，連線可能會在每一個別陳述式之後重複使用。
+  相反地，`autocommit` 設定關閉時，您在工作階段中發出的第一個陳述式會開始新的交易。例如，假設您輸入一連串的 `SELECT`、`INSERT`、`UPDATE` 和其他資料操作語言 (DML) 陳述式。在此情況下，直到您發出 `COMMIT`、`ROLLBACK` 或以另外方式結束交易之前，都不會重複使用連線。
+  輸入資料定義語言 (DDL) 陳述式將使交易在陳述式完成後結束。

 RDS Proxy 透過資料庫用戶端應用程式使用的網路協定偵測交易何時結束。交易偵測並不依賴 SQL 陳述式的文字中出現的 `COMMIT` 或 `ROLLBACK` 等關鍵字。

 在某些情況下，RDS Proxy 可能會偵測到資料庫要求，使得將工作階段移到不同的連線變得不切實際。這時，它會在剩餘的工作階段關閉該連線的多工功能。如果 RDS Proxy 無法確定多工在此工作階段中實際可行，則適用相同的規則。此操作稱為*鎖定*。如需偵測和最小化鎖定的方法，請參閱 [避免鎖定 RDS Proxy](rds-proxy-pinning.md)。