

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

# Amazon RDS Proxy
<a name="rds-proxy"></a>

透過使用 Amazon RDS Proxy，您可以允許應用程式集中和共用資料庫連線，以改善其擴展能力。RDS Proxy 會自動連線至待命資料庫執行個體，同時保留應用程式連線，使應用程式更具有資料庫故障彈性。透過使用 RDS Proxy，您可以針對連線至代理的用戶端強制執行 AWS Identity and Access Management (IAM) 身分驗證，而代理可以使用 IAM 資料庫身分驗證或存放於 中的登入資料來連線至資料庫 AWS Secrets Manager。

![\[應用程式如何連線至 RDS Proxy 的概觀\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/Proxy-Overview.png)


 使用 RDS Proxy，您可以處理資料庫流量中無法預測的突增情況。否則，這些突增情況可能會因超額訂閱連線或快速建立新連線而導致問題發生。RDS Proxy 會建立資料庫連線集區，並重複使用此集區中的連線。這種方法可以避免每次開啟新資料庫連線的記憶體和 CPU 額外負荷。若要保護資料庫免於過度訂閱，您可以控制建立的資料庫連線數。

 RDS Proxy 會將無法立即從連線集區提供服務的應用程式連線排入佇列或節流。雖然延遲可能會增加，但您的應用程式可以繼續擴展，而不會突然失敗或讓資料庫無法負荷。如果連線請求超過了您指定的限制，則 RDS Proxy 會拒絕應用程式連線 (也就是說，它會分散負載)，同時維持 RDS 能以可用容量提供服務的負載的可預測效能。

![\[應用程式如何連線至 RDS Proxy 以及所涉及連線類型的詳細檢視。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/Proxy-detail.png)


 您可以減少處理登入憑證，並為每個新連線建立安全連線的負荷。RDS Proxy 可以代表資料庫處理其中的一些工作。

 RDS Proxy 與其支援的引擎版本完全相容。您可以針對大部分的應用程式啟用 RDS Proxy，而不需要變更程式碼。

**Topics**
+ [區域和版本可用性](#rds-proxy.RegionVersionAvailability)
+ [RDS Proxy 的配額和限制](#rds-proxy.limitations)
+ [規劃在哪裡使用 RDS Proxy](rds-proxy-planning.md)
+ [RDS Proxy 概念和術語](rds-proxy.howitworks.md)
+ [RDS Proxy 入門](rds-proxy-setup.md)
+ [管理 RDS Proxy](rds-proxy-managing.md)
+ [使用 Amazon RDS Proxy 端點](rds-proxy-endpoints.md)
+ [使用 Amazon CloudWatch 監控 RDS Proxy 指標](rds-proxy.monitoring.md)
+ [使用 RDS Proxy 事件](rds-proxy.events.md)
+ [RDS Proxy 的故障診斷](rds-proxy.troubleshooting.md)
+ [將 RDS Proxy 與 AWS CloudFormation 搭配使用](rds-proxy-cfn.md)

## 區域和版本可用性
<a name="rds-proxy.RegionVersionAvailability"></a>

功能可用性和支援會因每個資料庫引擎的特定版本以及 AWS 區域而有所不同。如需 Amazon RDS 搭配 RDS Proxy 版本和區域可用性的詳細資訊，請參閱 [Amazon RDS Proxy 的支援區域和資料庫引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSProxy.md)。

## RDS Proxy 的配額和限制
<a name="rds-proxy.limitations"></a>

 下列配額和限制適用於 RDS Proxy：
+  每個 AWS 帳戶 ID 限制為 20 個代理。如果您的應用程式需要更多代理，請透過 中的 **Service Quotas** 頁面要求增加 AWS 管理主控台。在 **Service Quotas** 頁面中，選取 **Amazon Relational Database Service (Amazon RDS)** 並尋找**代理**以請求增加配額。 AWS 可以自動增加您的配額或等待 支援審核您的請求。
+ 每個代理最多可以有 200 個關聯的 Secrets Manager 秘密，因此在使用秘密時，限制最多 200 個不同使用者帳戶的連線。
+  每個代理都有預設端點，只會佈建在從代理設定的子網路中選取的兩個可用區域。如果設定超過兩個AZs子網路，則會選取任兩個。
+  您最多可以為每個代理新增 20 個額外的代理端點。這些額外的端點會佈建在建立期間指定的所有可用區域。您可以建立、檢視、修改和刪除這些端點。
+ 對於複寫組態中的 RDS 資料庫執行個體，您只能將代理與寫入器資料庫執行個體，而不是與僅供讀取複本關聯。
+ 您的 RDS Proxy 必須位於與資料庫相同的 Virtual Private Cloud (VPC) 中。代理不可以公開存取，但資料庫可以。例如，如果您在本機主機上設計資料庫的原型，除非您設定必要的網路要求以允許與代理的連線，否則無法連線至您的代理。這是因為您的本機主機位於代理的 VPC 之外。
+  您無法將 RDS Proxy 與其租用設定為 `dedicated` 的 VPC 搭配使用。
+  您無法在`Enforce Mode`已啟用加密控制的 VPC 中使用 RDS Proxy。
+ 對於 IPv6 端點網路類型，請將您的 VPC 和子網路設定為僅支援 IPv6。對於 IPv4 和 IPv6 目標連線網路類型，請將您的 VPC 和子網路設定為支援雙重堆疊模式。
+ 如果您使用 RDS Proxy 搭配已啟用 IAM 身分驗證的 RDS 資料庫執行個體，代理可以使用 IAM 身分驗證或存放在 Secrets Manager 中的登入資料連線到資料庫。連線至代理的用戶端必須使用 IAM 登入資料進行身分驗證。如需詳細組態指示，請參閱 [設定 RDS Proxy 的資料庫登入資料](rds-proxy-secrets-arns.md) 和 [設定 RDS Proxy 的 IAM 身分驗證](rds-proxy-iam-setup.md)
+  使用 SSL 主機名稱驗證時，您無法將 RDS Proxy 與自訂 DNS 搭配使用。
+  每個代理都可以與單一目標資料庫執行個體相關聯。不過，您可以將多個代理與同一個資料庫執行個體建立關聯。
+ 文字大小大於 16 KB 的任何陳述式會導致代理將工作階段鎖定至目前的連線。
+ 某些區域具有要在建立 Proxy 時考量的可用區域 (AZ) 限制。美國東部 (維吉尼亞北部) 區域不支援 `use1-az3` 可用區域中的 RDS Proxy。美國西部 (加利佛尼亞北部) 區域不支援 `usw1-az2` 可用區域中的 RDS Proxy。在建立 Proxy 時，若選取子網路，請確定您未在上述可用區域中選取子網路。
+ 目前，RDS Proxy 不支援任何全域條件內容金鑰。

  如需有關全域條件內容索引鍵的詳細資訊，請參閱《*IAM 使用者指南*》中的 [AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。
+ 您無法將 RDS Proxy 與 RDS Custom for SQL Server 搭配使用。
+ 若要反映代理的任何資料庫參數群組修改，即使您選擇立即套用變更，仍需要將執行個體重新開機。對於叢集層級參數，需要全叢集重新開機。
+ 當您註冊代理目標時，您的代理會自動建立 `rdsproxyadmin` 資料庫使用者。這是受保護的使用者，對於代理功能至關重要。您應避免竄改任何容量中的 `rdsproxyadmin` 使用者。刪除或修改 `rdsproxyadmin` 使用者或其許可，可能會導致您應用程式的代理完全無法使用。

如需每個資料庫引擎的其他限制，請參閱下列各節：
+ [RDS for MariaDB 的其他限制](#rds-proxy.limitations-mdb)
+ [RDS for Microsoft SQL Server 的其他限制](#rds-proxy.limitations-ms)
+ [RDS for MySQL 的其他限制](#rds-proxy.limitations-my)
+ [RDS for PostgreSQL 的其他限制](#rds-proxy.limitations-pg)

### RDS for MariaDB 的其他限制
<a name="rds-proxy.limitations-mdb"></a>

 下列額外限制適用於具有 RDS for MariaDB 資料庫的 RDS Proxy：
+  目前，所有代理都在 MariaDB 的連接埠 3306 上接聽。代理仍會使用您在資料庫設定中指定的連接埠來連線至您的資料庫。
+ 您無法使用 RDS Proxy，搭配 Amazon EC2 執行個體中的自我管理 MariaDB 資料庫。
+ 您無法將 RDS Proxy 與其資料庫參數群組中 `read_only` 參數設定為 `1` 的 RDS for MariaDB 資料庫執行個體搭配使用。
+ RDS Proxy 不支援 MariaDB 壓縮模式。例如，其不支援 `mysql` 命令的 `--compress` 或 `-C` 選項使所用的壓縮。
+ 某些 SQL 陳述式和函數可變更連線狀態，而不會導致鎖定。如需最新的鎖定行為，請參閱 [避免鎖定 RDS Proxy](rds-proxy-pinning.md)。
+ RDS Proxy 不支援 MariaDB `auth_ed25519` 外掛程式。
+ RDS Proxy 不支援 MariaDB 資料庫的 Transport Layer Security (TLS) 1.3 版。
+ 當 RDS Proxy 重複使用相同的資料庫連線來執行另一個查詢時，處理 `GET DIAGNOSTIC` 命令的資料庫連線可能會傳回不正確的資訊。當 RDS Proxy 多工進行資料庫連線時，可能會發生這種情況。如需詳細資訊，請參閱[RDS Proxy 概念概觀](rds-proxy.howitworks.md#rds-proxy-overview)。
+ RDS Proxy 目前不支援 MariaDB 之 `ClientPasswordAuthType` 的 `caching_sha2_password` 選項。

**重要**  
 對於與 MariaDB 資料庫相關聯的代理，請勿在初始化查詢中 `sql_auto_is_null` 將配置參數設置為 `true` 或非零值。這樣做可能會導致應用程式行為不正確。

### RDS for Microsoft SQL Server 的其他限制
<a name="rds-proxy.limitations-ms"></a>

 下列額外限制適用於具有 RDS for Microsoft SQL Server 資料庫的 RDS Proxy：
+ 您需要為代理建立的 Secrets Manager 秘密數目取決於資料庫執行個體使用的定序。例如，假設您的資料庫執行個體使用區分大小寫的定序。如果您的應用程式同時接受 "Admin" 和 "admin" ，則您的代理需要兩個單獨的秘密。如需有關 SQL Server 中定序的詳細資訊，請參閱 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) 文件。
+ RDS Proxy 不支援使用 Active Directory 的連線。
+ 您無法使用 IAM 身分驗證，搭配不支援權杖屬性的用戶端。如需詳細資訊，請參閱[連線至 Microsoft SQL Server 的考量事項](rds-proxy-connecting.md#rds-proxy-connecting-sqlserver)。
+ `@@IDENTITY`、`@@ROWCOUNT`、和 `SCOPE_IDENTITY` 的結果未必永遠準確。作為解決方法，請在同一工作階段陳述式中擷取其值，以確保它們傳回正確的資訊。
+ 如果連線使用多個作用中結果集 (MARS)，則 RDS Proxy 不會執行初始化查詢。如需 MARS 的相關資訊，請參閱 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver16) 文件。
+ 目前，RDS Proxy 不支援在主要版本 *SQL Server 2022* 上執行的 RDS for SQL Server 資料庫執行個體。
+ RDS Proxy 不支援在主要版本 *SQL Server 2014* 上執行的 RDS for SQL Server 資料庫執行個體。
+ RDS Proxy 不支援無法處理單一 TLS 記錄中多個回應訊息的用戶端應用程式。
+ RDS Proxy 不支援 RDS for SQL Server 的end-to-endIAM 身分驗證。

### RDS for MySQL 的其他限制
<a name="rds-proxy.limitations-my"></a>

 下列額外限制適用於具有 RDS for MySQL 資料庫的 RDS Proxy：
+ RDS Proxy 對於 `caching_sha2_password` 身分驗證的支援需要安全 (TLS) 連線。
+ RDS Proxy 對於 `caching_sha2_password` 的支援已知與特定 go-sql 驅動程式版本存在相容性問題。
+ 使用 MySQL 8.4 C 驅動程式時，如果預備陳述式中的參數計數超過預留位置計數，`mysql_stmt_bind_named_param` API 可能會形成格式錯誤的封包。這會導致不正確的回應。如需詳細資訊，請參閱 [MySQL 錯誤報告](https://bugs.mysql.com/bug.php?id=116860&thanks=4)。
+ 目前，所有代理都在 MySQL 的連接埠 3306 上接聽。代理仍會使用您在資料庫設定中指定的連接埠來連線至您的資料庫。
+  您不能將 RDS Proxy 用於 EC2 執行個體中的自我管理 MySQL 資料庫。
+  您無法將 RDS Proxy 與其資料庫參數群組中 `read_only` 參數設定為 `1` 的 RDS for MySQL 資料庫執行個體搭配使用。
+ RDS Proxy 不支援 MySQL 壓縮模式。例如，其不支援 `mysql` 命令的 `--compress` 或 `-C` 選項使所用的壓縮。
+ 當 RDS Proxy 重複使用相同的資料庫連線來執行另一個查詢時，處理 `GET DIAGNOSTIC` 命令的資料庫連線可能會傳回不正確的資訊。當 RDS Proxy 多工進行資料庫連線時，可能會發生這種情況。
+ 某些 SQL 陳述式和函數 (例如 `SET LOCAL`) 可變更連線狀態，而不會導致鎖定。如需最新的鎖定行為，請參閱 [避免鎖定 RDS Proxy](rds-proxy-pinning.md)。
+ 不支援在多陳述式查詢中使用 `ROW_COUNT()` 函數。
+ RDS Proxy 不支援無法處理單一 TLS 記錄中多個回應訊息的用戶端應用程式。
+ RDS Proxy 不支援 MySQL 雙密碼。
+ 當您在 RDS 資料庫參數群組中設定 `init_connect` 參數以設定工作階段狀態變數時，RDS Proxy 可能無法如預期般運作。請改為設定代理的初始化查詢，以便在使用代理連線到資料庫時執行工作階段初始化陳述式。

**重要**  
 對於與 MySQL 資料庫相關聯的代理，請勿在初始化查詢中 `sql_auto_is_null` 將配置參數設置為 `true` 或非零值。這樣做可能會導致應用程式行為不正確。

### RDS for PostgreSQL 的其他限制
<a name="rds-proxy.limitations-pg"></a>

 下列額外限制適用於具有 RDS for PostgreSQL 資料庫的 RDS Proxy：
+ RDS Proxy 不支援 PostgreSQL 工作階段鎖定篩選條件。
+  目前，所有代理都在 PostgreSQL 的連接埠 5432 上接聽。
+ 針對 PostgreSQL，RDS Proxy 目前不支援藉由發出 `CancelRequest` 取消來自用戶端的查詢。例如，使用 Ctrl\$1C 在互動式 psql 工作階段中取消長時間執行的查詢時，就是這種情況。
+  PostgreSQL 函數 [lastval](https://www.postgresql.org/docs/current/functions-sequence.html) 的結果未必永遠準確。您可以採取的因應措施是，將 [INSERT](https://www.postgresql.org/docs/current/sql-insert.html) 陳述式與 `RETURNING` 子句搭配使用。
+ RDS 代理目前不支援串流複寫模式。
+ 使用 RDS for PostgreSQL 16，對 `scram_iterations` 值的修改只會影響代理和資料庫之間的身分驗證程序。具體而言，如果您將 `ClientPasswordAuthType` 設定為 `scram-sha-256`，對 `scram_iterations` 值進行的任何自訂都不會影響 client-to-proxy 密碼身分驗證。反之，client-to-proxy 密碼身分驗證的迭代值固定為 4096。
+ 預設`postgres`資料庫必須存在於 RDS for PostgreSQL 執行個體上，RDS Proxy 才能運作。請勿刪除此資料庫，即使您的應用程式使用不同的資料庫。
+ 如果您使用 `ALTER ROLE` 來變更具有 `SET ROLE` 的使用者角色，則當使用者與代理的後續連線遇到鎖定時，可能不會使用此角色設定。為了防止這種情況，使用代理時，請在代理的初始化查詢中使用 `SET ROLE`。如需詳細資訊，請參閱 [為 Amazon RDS 建立代理](rds-proxy-creating.md) 中的**初始化查詢**。

**重要**  
對於具有 PostgreSQL 資料庫的現有代理，如果您將資料庫驗身分證修改為僅使用 `SCRAM`，則該代理會變成無法使用，最多持續 60 秒。若要避免發生此問題，請執行下列其中一項：  
確定資料庫同時允許 `SCRAM` 和 `MD5` 身分驗證。
若只要使用 `SCRAM` 身分驗證，請建立新代理、將您的應用程式流量遷移至新代理，然後刪除先前與資料庫相關聯的代理。

# 規劃在哪裡使用 RDS Proxy
<a name="rds-proxy-planning"></a>

 您可以決定哪些資料庫執行個體、叢集和應用程式可能因為使用 RDS Proxy 而獲益最大。若要執行這項操作，請考慮下列因素：
+  任何遇到「線數太多」錯誤的資料庫執行個體都是與代理關聯的理想候選者。其經常的特徵是具有較高的 `ConnectionAttempts` CloudWatch 指標值。代理讓應用程式能開啟多個用戶端連線，代理則管理較少數量到資料庫執行個體的長時間連線。
+  對於使用較小的 AWS 執行個體類別的資料庫執行個體，例如 T2 或 T3，使用代理有助於避免out-of-memory的情況。它也可以協助減少建立連線的 CPU 額外負荷。處理大量連線時，可能會發生這些情況。
+  您可以監控特定 Amazon CloudWatch 指標，以判斷資料庫執行個體是否接近特定的限制類型。這些限制是指連線數目以及與連線管理相關聯的記憶體。您也可以監控特定 CloudWatch 指標，以決定資料庫執行個體是否正在處理許多短期連線。開啟和關閉這類連線可能會對資料庫造成效能負荷。如需欲監控指標的相關資訊，請參閱 [使用 Amazon CloudWatch 監控 RDS Proxy 指標使用 CloudWatch 監控 RDS Proxy](rds-proxy.monitoring.md)。
+  AWS Lambda 函數也可以是使用代理的良好候選項目。這些函數經常進行短暫的資料庫連線，這些連線將受益於 RDS Proxy 提供的連線集區。您可以利用 Lambda 函數中已有的任何 IAM 身分驗證，而不是在 Lambda 應用程式的程式碼中管理資料庫登入資料。
+  通常會大量開啟和關閉的資料庫連線，而且沒有內建的連線集區機制的應用程式，都很適合使用 proxy。
+  長期保持大量連線開啟的應用程式通常是搭配代理使用的理想候選者。軟體即服務 (SaaS) 或電子商務等產業中的應用程式通常會保持連線開啟，將資料庫要求的延遲降至最低。相較於直接連線至資料庫執行個體，應用程式可以透過 RDS Proxy 將更多連線保持開啟。
+  由於為所有資料庫執行個體設定此類身分驗證的複雜性，您可能尚未採用 IAM 身分驗證和 Secrets Manager。代理可以針對特定應用程式強制執行用戶端連線的身分驗證政策。您可以利用 Lambda 函數中已有的任何 IAM 身分驗證，而不是在 Lambda 應用程式的程式碼中管理資料庫登入資料。
+  RDS Proxy 可協助讓應用程式對資料庫失敗更具彈性且更為透明。RDS Proxy 會略過網域名稱系統 (DNS) 快取，將 Amazon RDS Multi-AZ 資料庫執行個體的容錯移轉時間縮短高達 66%。RDS Proxy 也會自動將流量路由到新的資料庫執行個體，同時保留應用程式連線。這使得應用程式的容錯移轉更加透明。

# 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)。

# RDS Proxy 入門
<a name="rds-proxy-setup"></a>

使用以下頁面中的資訊來設定和管理 [Amazon RDS Proxy ](rds-proxy.md) 並設定相關的安全性選項。安全性選項會控制誰可以存取每個代理，以及每個代理如何連線至資料庫執行個體。

如果您是初次使用 RDS Proxy，建議您依照我們呈現的順序遵循頁面。

**Topics**
+ [設定 RDS Proxy 的網路先決條件](rds-proxy-network-prereqs.md)
+ [設定 RDS Proxy 的資料庫登入資料](rds-proxy-secrets-arns.md)
+ [設定 RDS Proxy 的 IAM 身分驗證](rds-proxy-iam-setup.md)
+ [為 Amazon RDS 建立代理](rds-proxy-creating.md)
+ [檢視代理](rds-proxy-viewing.md)
+ [透過 RDS Proxy 連線至資料庫](rds-proxy-connecting.md)

# 設定 RDS Proxy 的網路先決條件
<a name="rds-proxy-network-prereqs"></a>

 使用 RDS Proxy 需要您在 RDS 資料庫執行個體與 RDS Proxy 之間擁有通用的虛擬私有雲端 (VPC)。此 VPC 應至少有兩個位於不同可用區域的子網路。您的帳戶可以擁有這些子網路，或與其他帳戶共用。如需 VPC 共用的詳細資訊，請參閱[使用共用 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)。

對於 IPv6 支援，需要額外的網路組態：
+ **IPv6 端點網路類型** – 您的 VPC 和子網路必須設定為支援 IPv6。這包括將 IPv6 CIDR 區塊指派給您的 VPC 和子網路。
+ **雙堆疊端點網路類型** – 您的 VPC 和子網路必須同時支援 IPv4 和 IPv6 定址。
+ **IPv6 目標連線網路類型** – 資料庫必須設定為雙堆疊模式，以支援來自代理的 IPv6 連線。

您的用戶端應用程式資源 (例如 Amazon EC2、Lambda 或 Amazon ECS) 可以位於與代理相同的 VPC 中。或者，它們可以位於與代理不同的 VPC 中。如果您已成功連線到任何 RDS 資料庫執行個體，表示您已擁有所需的網路資源。

**Topics**
+ [取得子網路的相關資訊](#rds-proxy-network-prereqs.subnet-info)
+ [規劃 IP 地址容量](#rds-proxy-network-prereqs.plan-ip-address)

## 取得子網路的相關資訊
<a name="rds-proxy-network-prereqs.subnet-info"></a>

若要建立代理，您必須提供代理操作所在的子網路和 VPC。下列 Linux 範例顯示的 AWS CLI 命令會檢查 擁有VPCs 和子網路 AWS 帳戶。特別是，當您使用 CLI 建立代理時，您會傳遞子網路 ID 做為參數。

```
aws ec2 describe-vpcs
aws ec2 describe-internet-gateways
aws ec2 describe-subnets --query '*[].[VpcId,SubnetId]' --output text | sort
```

下列 Linux 範例顯示 AWS CLI 命令，以判斷與特定 RDS 資料庫執行個體 對應的子網路 IDs。尋找資料庫執行個體的 VPC ID。檢查 VPC 以尋找其子網路。下列 Linux 範例會顯示做法。

```
$ #From the DB instance, trace through the DBSubnetGroup and Subnets to find the subnet IDs.
$ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0]|[Subnets]|[0]|[*].SubnetIdentifier' --output text
```

```
subnet_id_1
subnet_id_2
subnet_id_3
...
```

```
$ #From the DB instance, find the VPC.
$ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0].VpcId' --output text
```

```
my_vpc_id
```

```
$ aws ec2 describe-subnets --filters Name=vpc-id,Values=my_vpc_id --query '*[].[SubnetId]' --output text
```

```
subnet_id_1
subnet_id_2
subnet_id_3
subnet_id_4
subnet_id_5
subnet_id_6
```

## 規劃 IP 地址容量
<a name="rds-proxy-network-prereqs.plan-ip-address"></a>

RDS Proxy 會根據註冊的資料庫執行個體大小和數目，視需要自動調整其容量。某些操作可能還需要額外的代理容量，例如增加已註冊資料庫的大小或內部 RDS Proxy 維護操作。在這些操作期間，您的代理可能需要更多的 IP 地址來佈建額外的容量。這些額外的位址可讓您的代理擴展，而不會影響您的工作負載。子網路中若少了可用的 IP 地址會阻止代理縱向擴展。這可能會導致更高的查詢延遲或用戶端連線失敗。當您的子網路中沒有足夠的可用 IP 地址時，RDS 會透過事件 `RDS-EVENT-0243` 通知您。如需此金鑰的相關資訊，請參閱 [使用 RDS Proxy 事件使用 RDS Proxy 事件](rds-proxy.events.md)。

**注意**  
RDS Proxy 不會為 VPC 中的每個代理耗用超過 215 個 IP 地址。

以下是根據資料庫執行個體類別大小，建議在子網路中為您的代理保留可用的 IP 位址數目下限。


|  DB instance class (資料庫執行個體類別)  |  可用 IP 地址數目下限  | 
| --- | --- | 
|  db.\$1.xlarge 或更小   |  10  | 
|  db.\$1.24xlarge   |  15  | 
|  db.\$1.24xlarge   |  25  | 
|  db.\$1.24xlarge   |  45  | 
|  db.\$1.24xlarge   |  60  | 
|  db.\$1.24xlarge   |  75  | 
|  db.\$1.24xlarge   |  110  | 

這些建議 IP 地址數量是僅具有預設端點的代理預估值。具有其他端點或僅供讀取複本的代理可能需要更多可用的 IP 地址。對於每個額外的端點，建議您多保留三個 IP 地址。對於每個僅供讀取複本，建議您根據該僅供讀取複本的大小，保留資料表中指定的額外 IP 地址。

# 設定 RDS Proxy 的資料庫登入資料
<a name="rds-proxy-secrets-arns"></a>

Amazon RDS 中的 RDS Proxy 會使用 AWS Secrets Manager 來安全地存放和管理資料庫登入資料。您可以將代理與包含必要身分驗證詳細資訊的 Secrets Manager 秘密建立關聯，而不是在應用程式中內嵌憑證。您在 RDS 資料庫執行個體上為代理連線的每個資料庫使用者帳戶建立個別的 Secrets Manager 秘密。

或者，您可以將 RDS Proxy 設定為使用end-to-end IAM 身分驗證，這樣就不需要在 Secrets Manager 中存放資料庫登入資料。RDS Proxy 會針對client-to-proxy連線和 proxy-to-database連線使用 IAM 身分驗證。這提供完全整合的 IAM 型身分驗證解決方案，不需要管理秘密或密碼。如需新增 IAM 資料庫使用者的相關資訊，請參閱 [使用 IAM 身分驗證建立資料庫帳戶](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

**Topics**
+ [建立要與 RDS Proxy 搭配使用的秘密](#rds-proxy-secrets-create)

## 建立要與 RDS Proxy 搭配使用的秘密
<a name="rds-proxy-secrets-create"></a>

建立代理之前，您必須先建立至少一個存放資料庫憑證的秘密。

### 主控台
<a name="rds-proxy-secrets-create-console"></a>

**若要建立機密**

1. 請開啟位於 [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/) 的機密管理員控制台。

1. 選擇 **Store a new secret** (存放新機密)。

1. 選擇 **Amazon RDS 資料庫的憑證**。

1. 輸入使用者名稱和密碼。您輸入的憑證必須符合存在於相關聯 RDS 資料庫中資料庫使用者的憑證。RDS Proxy 使用這些憑證來代表應用程式驗證和建立與資料庫的連線。

   如果不相符，您可以更新秘密以符合資料庫密碼。在您更新秘密之前，嘗試使用該秘密透過代理連線會失敗，但使用其他有效秘密的連線仍然可運作。
**注意**  
對於 RDS for SQL Server，RDS Proxy 需要在 Secrets Manager 中設定區分大小寫的秘密，無論資料庫執行個體定序設定為何。如果您的應用程式允許具有不同大小寫的使用者名稱，例如 "Admin" 和 "admin"，您必須為每個使用者名稱建立個別秘密。RDS Proxy 不支援用戶端和代理之間的不區分大小寫使用者名稱身分驗證。  
如需有關 SQL Server 中定序的詳細資訊，請參閱 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) 文件。

1. 對於**資料庫**，請選取秘密將會存取的 Amazon RDS 資料庫。

1. 填入秘密的其他設定，然後選擇**儲存**。如需完整指示，請參閱《AWS Secrets Manager 使用者指南》**中的[建立 AWS Secrets Manager 秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

### AWS CLI
<a name="rds-proxy-secrets-create-cli"></a>

當您透過 建立代理時 AWS CLI，您可以指定對應秘密的 Amazon Resource Name (ARNs)。您可以針對代理可以存取的所有資料庫使用者帳戶執行此操作。在 中 AWS 管理主控台，您可以依秘密的描述性名稱來選擇秘密。
+ 若要建立 Secrets Manager 秘密以搭配 RDS Proxy 使用，請使用 [create-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/create-secret.html) 命令：

  ```
  aws secretsmanager create-secret \
    --name "secret_name" \
    --description "secret_description" \
    --region region_name \
    --secret-string '{"username":"db_user","password":"db_user_password"}'
  ```
+ 您也可以建立自訂金鑰來加密 Secrets Manager 秘密。以下命令會建立範例金鑰。

  ```
  aws kms create-key --description "test-key" --policy '{
    "Id":"kms-policy",
    "Version": "2012-10-17",		 	 	 
    "Statement":
      [
        {
          "Sid":"Enable IAM User Permissions",
          "Effect":"Allow",
          "Principal":{"AWS":"arn:aws:iam::account_id:root"},
          "Action":"kms:*","Resource":"*"
        },
        {
          "Sid":"Allow access for Key Administrators",
          "Effect":"Allow",
          "Principal":
            {
              "AWS":
                ["$USER_ARN","arn:aws:iam:account_id::role/Admin"]
            },
          "Action":
            [
              "kms:Create*",
              "kms:Describe*",
              "kms:Enable*",
              "kms:List*",
              "kms:Put*",
              "kms:Update*",
              "kms:Revoke*",
              "kms:Disable*",
              "kms:Get*",
              "kms:Delete*",
              "kms:TagResource",
              "kms:UntagResource",
              "kms:ScheduleKeyDeletion",
              "kms:CancelKeyDeletion"
            ],
          "Resource":"*"
        },
        {
          "Sid":"Allow use of the key",
          "Effect":"Allow",
          "Principal":{"AWS":"$ROLE_ARN"},
          "Action":["kms:Decrypt","kms:DescribeKey"],
          "Resource":"*"
        }
      ]
  }'
  ```

 例如，下列命令會為兩個資料庫使用者建立 Secrets Manager 秘密：

```
aws secretsmanager create-secret \
  --name secret_name_1 --description "db admin user" \
  --secret-string '{"username":"admin","password":"choose_your_own_password"}'

aws secretsmanager create-secret \
  --name secret_name_2 --description "application user" \
  --secret-string '{"username":"app-user","password":"choose_your_own_password"}'
```

若要建立以自訂 AWS KMS 金鑰加密的秘密，請使用下列命令：

```
aws secretsmanager create-secret \
  --name secret_name_1 --description "db admin user" \
  --secret-string '{"username":"admin","password":"choose_your_own_password"}' \
  --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id

aws secretsmanager create-secret \
  --name secret_name_2 --description "application user" \
  --secret-string '{"username":"app-user","password":"choose_your_own_password"}' \
  --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id
```

若要查看您 AWS 帳戶擁有的秘密，請使用 [list-secrets](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/list-secrets.html) 命令：

```
aws secretsmanager list-secrets
```

當您使用 CLI 建立代理時，您會將一個或多個秘密的 Amazon Resource Names (ARN) 傳遞給 `--auth` 參數。下列範例顯示如何僅使用 AWS 帳戶擁有的每個秘密名稱和 ARN 來準備報告。此範例使用第 2 AWS CLI 版中可用的 `--output table` 參數。如果您使用的是第 1 AWS CLI 版，請`--output text`改用 。

```
aws secretsmanager list-secrets --query '*[].[Name,ARN]' --output table
```

若要確認秘密包含正確格式的正確憑證，請使用 [get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html) 命令。將 `your_secret_name` 取代為秘密的簡短名稱或 ARN。

```
aws secretsmanager get-secret-value --secret-id your_secret_name
```

輸出包含具有類似下列項目的 JSON 編碼值的行：

```
...
"SecretString": "{\"username\":\"your_username\",\"password\":\"your_password\"}",
...
```

# 設定 RDS Proxy 的 IAM 身分驗證
<a name="rds-proxy-iam-setup"></a>

若要在 Amazon RDS 中設定 RDS Proxy 的 AWS Identity and Access Management (IAM) 身分驗證，請建立並設定授予必要許可的 IAM 政策。

本主題提供設定 RDS Proxy IAM 身分驗證的步驟，包括建立必要的 IAM 政策並將其連接至 IAM 角色。

**提示**  
只有在您想要建立自己的 IAM 角色時，才需要此程序。否則，RDS 可以在設定代理時自動建立必要的角色，因此您可以略過這些步驟。

## 先決條件
<a name="rds-proxy-iam-setup-prereqs"></a>

設定 RDS Proxy 的 IAM 身分驗證之前，請確定您有下列項目：
+ **AWS Secrets Manager** – 至少有一個存放的秘密，其中包含資料庫憑證。如需如何建立秘密的指示，請參閱 [設定 RDS Proxy 的資料庫登入資料](rds-proxy-secrets-arns.md)。

  如果您使用end-to-end 身分驗證，則不需要這麼做。
+ **IAM 許可** – 具有在 AWS Secrets Manager中建立及管理 IAM 政策、角色和秘密之許可的 IAM 角色或使用者。

## 建立end-to-end IAM 身分驗證的 IAM 政策
<a name="rds-proxy-iam-setup-e2e-steps"></a>

使用end-to-end IAM 身分驗證時，RDS Proxy 會使用 IAM 身分驗證連線至資料庫，而不是從 Secrets Manager 擷取憑證。這需要為要與代理搭配使用的資料庫帳戶設定具有`rds-db:connect`許可的 IAM 角色。

若要使用 IAM 向資料庫驗證 RDS Proxy，請使用授予必要資料庫連線許可的政策來建立 IAM 角色。

### 主控台
<a name="rds-proxy-iam-e2e-console"></a>

**使用代理建立end-to-end IAM 身分驗證的角色**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 建立角色的許可政策。如需一般步驟，請參閱[建立 IAM 政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

   將此政策貼到 JSON 編輯器，並進行以下變更：。
   + 替換為您自己的帳戶 ID。
   + `us-east-2` 以代理必須所在的 取代 。
   + 將資料庫資源 IDs和使用者名稱替換成您要使用的資料庫資源 ID 和使用者名稱。RDS 執行個體和 之間的資源 ID 格式不同Aurora clusters。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "rds-db:connect",
               "Resource": [
                   "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_1",
                   "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_2"
               ]
           }
       ]
   }
   ```

1. 建立角色並將許可政策連接至其中。如需一般步驟，請參閱[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

   對於**信任的實體類型**，選擇 **AWS 服務**。在**使用案例**底下，選取 **RDS**，並為使用案例選擇 **RDS - 將角色新增至資料庫**。

1. 對於**許可政策**，選擇您建立的政策。

1. 對於**選取受信任的實體**，輸入角色的下列信任政策：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": "rds.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

### AWS CLI
<a name="rds-proxy-iam-e2e-cli"></a>

若要使用 建立角色 AWS CLI，請傳送下列請求：

```
aws iam create-role \
  --role-name my_e2e_iam_role_name \

  --assume-role-policy-document '{"Version":"2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},"Action":"sts:AssumeRole"}]}'
```

接著，將政策連接至該角色：

```
aws iam put-role-policy \
  --role-name my_e2e_iam_role_name \
  --policy-name e2e_iam_db_connect_policy \
  --policy-document '{

    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rds-db:connect",
            "Resource": [
                "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_1",
                "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_2"
            ]
        }
    ]
}'
```

設定end-to-end IAM 身分驗證的 IAM 角色和許可後，您現在可以建立將 `DefaultAuthScheme` 設為 的代理`IAM_AUTH`。此代理會使用 IAM 直接驗證資料庫，而不需要 Secrets Manager 秘密。如需說明，請參閱[為 Amazon RDS 建立代理](rds-proxy-creating.md)。

使用end-to-end IAM 身分驗證時，請確定您的資料庫使用者已設定為 IAM 身分驗證，如中所述[使用 IAM 身分驗證建立資料庫帳戶](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

## 建立 Secrets Manager 存取的 IAM 政策
<a name="rds-proxy-iam-setup-steps"></a>

若要允許 RDS Proxy 從 Secrets Manager 擷取資料庫憑證，請使用可授予必要許可的政策建立 IAM 角色。

## 主控台
<a name="rds-proxy-iam-console"></a>

**建立可存取私密的角色以與代理搭配使用**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 建立角色的許可政策。如需一般步驟，請參閱[建立 IAM 政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

   將此政策貼到 JSON 編輯器，並進行以下變更：。
   + 替換為您自己的帳戶 ID。
   + 將 `us-east-2` 替代為代理所在的區域。
   + 將秘密名稱替代為您建立的秘密名稱。如需詳細資訊，請參閱[在 IAM 政策陳述式中指定 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/cmks-in-iam-policies.html)。
   + 將 KMS 金鑰 ID 替代為您用來加密 Secrets Manager 秘密的金鑰 ID，可以是預設金鑰或您自己的金鑰。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "secretsmanager:GetSecretValue",
               "Resource": [
                   "arn:aws:secretsmanager:us-east-2:111122223333:secret:secret_name_1",
                   "arn:aws:secretsmanager:us-east-2:111122223333:secret:secret_name_2"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "kms:Decrypt",
               "Resource": "arn:aws:kms:us-east-2:111122223333:key/key_id",
               "Condition": {
                   "StringEquals": {
                       "kms:ViaService": "secretsmanager.us-east-2.amazonaws.com"
                   }
               }
           }
       ]
   }
   ```

------

1. 建立角色並將許可政策連接至其中。如需一般步驟，請參閱[建立角色以將許可委派給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

   對於**信任的實體類型**，選擇 **AWS 服務**。在**使用案例**底下，選取 **RDS**，並為使用案例選擇 **RDS - 將角色新增至資料庫**。

1. 對於**許可政策**，選擇您建立的政策。

1. 對於**選取受信任的實體**，輸入角色的下列信任政策：

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": "rds.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

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

若要使用 建立角色 AWS CLI，請傳送下列請求：

```
aws iam create-role \
  --role-name my_role_name \
  --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},"Action":"sts:AssumeRole"}]}'
```

接著，將政策連接至該角色：

```
aws iam put-role-policy \
  --role-name my_role_name \
  --policy-name secret_reader_policy \
  --policy-document '{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_1",
                "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_2"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:us-east-2:account_id:key/key_id",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "secretsmanager.us-east-2.amazonaws.com"
                }
            }
        }
    ]
}'
```

設定 IAM 角色和許可後，您現在可以建立代理並將其與此角色建立關聯。這可讓代理從 安全地擷取資料庫憑證， AWS Secrets Manager 並為您的應用程式啟用 IAM 身分驗證。如需說明，請參閱[為 Amazon RDS 建立代理](rds-proxy-creating.md)。

# 為 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 管理主控台 ，並在 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)：// 開啟 Amazon RDS 主控台。

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

1. 選擇**Create Proxy (建立代理)**。

1. 針對您的代理使用以下設定。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy-creating.html)

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 Proxy 的網路先決條件](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`許可。

# 檢視代理
<a name="rds-proxy-viewing"></a>

 建立一或多個 RDS 代理後，您可以在 AWS 管理主控台、AWS CLI 或 RDS API 中進行檢視和管理。您可以檢閱其組態詳細資訊、監控效能，並判斷哪些代理需要修改或刪除。

若要讓資料庫應用程式透過代理路由流量，您必須在連線字串中指定代理端點。

## 主控台
<a name="rds-proxy-viewing.console"></a>

**在主控台檢視代理**

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

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

1. 選取代理名稱以檢視其詳細資訊。

1. 在詳細資訊頁面上，**目標群組**區段會顯示代理程式如何連結至特定 RDS 資料庫執行個體。您可以導覽至預設目標群組頁面，以深入了解此關聯，包括在建立代理期間定義的組態設定。這些設定包括最大連線百分比、連線借用逾時、引擎系列，以及工作階段鎖定篩選條件。

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

 若要使用 CLI 檢視代理，請使用 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) 命令。根據預設，要求會傳回您AWS帳戶擁有的所有代理。若要查看單一代理的詳細資料，請使用 `--db-proxy-name` 參數指定其名稱。

```
aws rds describe-db-proxies [--db-proxy-name proxy_name]
```

 若要檢視與代理相關聯的其他資訊，請使用下列命令。

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

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

 使用下列命令序列查看與代理關聯的事物的詳細資訊：

1.  若要取得代理清單，請執行 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html)。

1.  若要顯示連線參數 (例如代理可以使用的連線百分比上限)，請執行 [describe-db-proxy-target-groups](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-target-groups.html) `--db-proxy-name`。使用代理的名稱做為參數值。

1.  若要查看與所傳回目標群組相關聯的 RDS 資料庫執行個體的詳細資訊，請執行 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html)。

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

 若要使用 RDS API 檢視代理，請使用 [DescribeDBProxies](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxies.html) 操作。它會傳回 [DBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBProxy.html) 資料類型的值。

 若要查看代理的連線設定詳細資訊，請將來自此傳回值的代理識別符與 [DescribeDBProxyTargetGroups](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyTargetGroups.html) 操作搭配使用。它會傳回 [DBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBProxyTargetGroup.html) 資料類型的值。

 若要查看與代理相關聯的 RDS 執行個體或 Aurora 資料庫叢集，請使用 [DescribeDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyTargets.html) 操作。它會傳回 [DBProxyTarget](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBProxyTarget.html) 資料類型的值。

# 透過 RDS Proxy 連線至資料庫
<a name="rds-proxy-connecting"></a>

透過代理或藉由連線到資料庫來連線到 RDS 資料庫執行個體，其方式通常是相同的。如需詳細資訊，請參閱[代理端點概觀](rds-proxy-endpoints.md#rds-proxy-endpoints-overview)。

**Topics**
+ [使用資料庫登入資料連線至資料庫](#rds-proxy-connecting-native)
+ [使用 IAM 身分驗證連線至資料庫](#rds-proxy-connecting-iam)
+ [連線至 Microsoft SQL Server 的考量事項](#rds-proxy-connecting-sqlserver)
+ [連線至 PostgreSQL 的考量事項](#rds-proxy-connecting-postgresql)

## 使用資料庫登入資料連線至資料庫
<a name="rds-proxy-connecting-native"></a>

 使用下列步驟，使用資料庫登入資料連線至代理：

1.  尋找代理端點。在 中 AWS 管理主控台，您可以在對應代理的詳細資訊頁面上找到端點。透過 AWS CLI，您可以使用 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) 命令。下列範例會顯示作法。

   ```
   # Add --output text to get output as a simple tab-separated list.
   $ aws rds describe-db-proxies --query '*[*].{DBProxyName:DBProxyName,Endpoint:Endpoint}'
   [
       [
           {
               "Endpoint": "the-proxy.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy"
           },
           {
               "Endpoint": "the-proxy-other-secret.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy-other-secret"
           },
           {
               "Endpoint": "the-proxy-rds-secret.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy-rds-secret"
           },
           {
               "Endpoint": "the-proxy-t3.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy-t3"
           }
       ]
   ]
   ```

1.  在用戶端應用程式的連線字串中指定端點做為主機參數。例如，指定代理端點做為 `mysql -h` 選項或 `psql -h` 選項的值。

1.  請提供和平常一樣的資料庫使用者名稱和密碼。

## 使用 IAM 身分驗證連線至資料庫
<a name="rds-proxy-connecting-iam"></a>

 當您搭配 RDS Proxy 使用 IAM 身分驗證時，有兩個在用戶端和代理之間進行身分驗證的選項：
+ 設定資料庫使用者以使用一般使用者名稱和密碼進行身分驗證。RDS Proxy 會從 Secrets Manager 擷取使用者名稱和密碼登入資料。從 RDS Proxy 連至底層資料庫的連線不會透過 IAM。
+ 您也可以使用end-to-end IAM 身分驗證，使用 IAM 透過代理連線到資料庫，而不需要資料庫登入資料。

 若要使用 IAM 身分驗證連線到 RDS Proxy，請使用相同的一般連線程序，搭配 RDS DB 執行個體進行 IAM 身分驗證。如需使用 IAM 的一般資訊，請參閱 [Amazon RDS 的安全性](UsingWithRDS.md)。如果您使用的是end-to-end IAM 身分驗證，請提供 IAM 身分驗證外掛程式給您的資料庫使用者。請參閱 [使用 IAM 身分驗證建立資料庫帳戶](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

 RDS Proxy 的 IAM 使用方式的主要差異包含下列項目：
+ 使用標準 IAM 身分驗證，資料庫使用者在資料庫中具有一般登入資料。您設定包含這些使用者名稱和密碼的 Secrets Manager 私密，然後授權 RDS Proxy 擷取來自 Secrets Manager 的登入資料。IAM 身分驗證會套用到您用戶端程式與代理之間的連線。接著，代理會使用從 Secrets Manager 中擷取的使用者名稱和密碼登入資料，向資料庫進行身分驗證。
+ 透過end-to-end IAM 身分驗證，您不需要為資料庫登入資料設定 Secrets Manager 秘密。IAM 身分驗證適用於用戶端與代理之間的連線，以及代理與資料庫的連線。
+ 您會指定代理端點，而非執行個體、叢集或讀取器端點。如需代理端點的詳細資訊，請參閱[使用 IAM 身分驗證連接至資料庫執行個體](UsingWithRDS.IAMDBAuth.Connecting.md)。
+ 使用 IAM 身分驗證連接至 Proxy 時，請務必使用 Transport Layer Security (TLS)/Secure Sockets Layer (SSL)。

您可以透過修改 IAM 政策，授與特定使用者對代理的存取權。範例如下。

```
"Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"
```

**提示**  
設定 RDS Proxy 連線的 IAM 身分驗證時，請遵循下列重要準則以避免連線問題：  
在維護相同資料庫使用者或`rds_iam`角色的一般密碼身分驗證時，請勿授予角色。
請記住，當用戶端使用 IAM 身分驗證連線至 RDS Proxy 時，RDS Proxy 一律會透過 Secrets Manager 使用密碼身分驗證連線至資料庫。
如果您經常發生連線終止和重新連線，請從使用者或角色移除任何現有的`rds_iam`授予，並僅使用密碼身分驗證。
確保您的密碼政策符合 SCRAM-SHA-256 安全字元要求。
混合相同資料庫使用者的 IAM 和密碼身分驗證方法可能會導致連線不穩定。

## 連線至 Microsoft SQL Server 的考量事項
<a name="rds-proxy-connecting-sqlserver"></a>

如需使用 IAM 身分驗證連線到代理，請不要使用密碼欄位。相反地，您可以在權杖欄位中為每種類型的資料庫驅動程式提供適當的權杖屬性。例如，針對 JDBC 使用 `accessToken` 屬性，或針對 ODBC 使用 `sql_copt_ss_access_token` 屬性。或者，針對 .NET SqlClient 驅動程式使用 `AccessToken` 屬性。您無法使用 IAM 身分驗證，搭配不支援權杖屬性的用戶端。

在某些情況下，代理無法共用資料庫連線，而是將用戶端應用程式到代理的連線鎖定為專用的資料庫連線。如需這些條件的詳細資訊，請參閱 [避免鎖定 RDS Proxy](rds-proxy-pinning.md)。

## 連線至 PostgreSQL 的考量事項
<a name="rds-proxy-connecting-postgresql"></a>

如果您建立新的 PostgreSQL 資料庫使用者以連線至 RDS Proxy，請確定您授予使用者對於資料庫的 `CONNECT` 權限。如果沒有此權限，使用者就無法建立連線。如需詳細資訊，請參閱[使用 RDS Proxy 時，將資料庫使用者新增至 PostgreSQL 資料庫](rds-proxy-new-db-user.md#rds-proxy-new-db-user-pg)。

當用戶端開始 PostgreSQL 資料庫的連線時，它會傳送啟動訊息。此訊息包含包含參數名稱和值字串的組合。如需詳細資訊，請參閱 PostgreSQL 文件的 [PostgreSQL 訊息格式](https://www.postgresql.org/docs/current/protocol-message-formats.html)中的 `StartupMessage`。

透過 RDS 代理連線時，啟動訊息可包含下列目前辨識的參數：
+  `user` 
+  `database`

 啟動訊息也可包含下列其他執行時間參數：
+ `[application\$1name](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-APPLICATION-NAME) `
+ `[client\$1encoding](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-CLIENT-ENCODING) `
+ `[DateStyle](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-DATESTYLE) `
+ `[TimeZone](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-TIMEZONE) `
+  `[extra\$1float\$1digits](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-EXTRA-FLOAT-DIGITS) `
+  `[ search\$1path ](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-SEARCH-PATH)` 

 如需 PostgreSQL 傳訊的詳細資訊，請參閱 PostgreSQL 文件中的[前端/後端通訊協定](https://www.postgresql.org/docs/current/protocol.html)。

 針對 PostgreSQL，如果您使用的是 JDBC，建議採取下列做法以避免鎖定：
+ 將 JDBC 連線參數 `assumeMinServerVersion` 至少設為 `9.0` 以避免鎖定。這樣可防止在執行 `SET extra_float_digits = 3` 時，JDBC 驅動程式在連線啟動期間執行額外的往返。
+ 將 JDBC 連線參數 `ApplicationName` 設為 `any/your-application-name` 以避免鎖定。這麼做可防止在執行 `SET application_name = "PostgreSQL JDBC Driver"` 時，JDBC 驅動程式在連線啟動期間執行額外的往返。請注意，JDBC 參數為 `ApplicationName`，但 PostgreSQL `StartupMessage` 參數為 `application_name`。

如需詳細資訊，請參閱[避免鎖定 RDS Proxy](rds-proxy-pinning.md)。如需如何使用 JDBC 連線的詳細資訊，請參閱 PostgreSQL 文件中的[連線至資料庫](https://jdbc.postgresql.org/documentation/setup/)。

# 管理 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)。

# 使用 Amazon RDS Proxy 端點
<a name="rds-proxy-endpoints"></a>

RDS Proxy 端點提供彈性且有效率的方式來管理資料庫連線，進而改善可擴展性、可用性和安全性。使用代理端點，您可以：
+ **簡化監控和疑難排解** – 使用多個端點來獨立追蹤和管理不同應用程式的連線。

**Topics**
+ [代理端點概觀](#rds-proxy-endpoints-overview)
+ [代理端點的限制](#rds-proxy-endpoints-limits)
+ [多可用區域資料庫叢集的代理端點](#rds-proxy-endpoints-overview-maz)
+ [跨 VPC 存取 RDS 資料庫](#rds-proxy-cross-vpc)
+ [建立代理端點](rds-proxy-endpoints.CreatingEndpoint.md)
+ [檢視代理端點](rds-proxy-endpoints.DescribingEndpoint.md)
+ [修改代理端點](rds-proxy-endpoints.ModifyingEndpoint.md)
+ [刪除代理端點](rds-proxy-endpoints.DeletingEndpoint.md)

## 代理端點概觀
<a name="rds-proxy-endpoints-overview"></a>

使用 RDS Proxy 端點涉及與 RDS 執行個體端點相同的程序類型。如果您不熟悉 RDS 端點，請在[連線至執行 MySQL 資料庫引擎的資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)和[連線至執行 PostgreSQL 資料庫引擎的資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToPostgreSQLInstance.html)中查閱詳細資訊。

當您建立代理端點時，您可以將其與和代理的 VPC 不同的虛擬私有雲端 (VPC) 建立關聯。這可讓您從另一個 VPC 連線至代理，例如組織內不同應用程式所使用的 VPC。

如需與代理端點關聯的限制相關資訊，請參閱[代理端點的限制](#rds-proxy-endpoints-limits)。

RDS Proxy 日誌中會在每個項目加上相關聯代理端點的名稱作為字首。此名稱可以是您針對使用者定義端點所指定的名稱，也可以是代理的預設讀取/寫入端點的特殊名稱 `default`。

每個代理端點都有自己的 CloudWatch 指標集。監控所有代理端點、特定端點或代理的所有讀取/寫入或唯讀端點的指標。如需詳細資訊，請參閱[使用 Amazon CloudWatch 監控 RDS Proxy 指標使用 CloudWatch 監控 RDS Proxy](rds-proxy.monitoring.md)。

代理端點會使用與相關聯代理相同的身分驗證機制。RDS Proxy 會自動設定使用者定義端點的許可和授權，且與相關聯代理的屬性一致。

## 代理端點的限制
<a name="rds-proxy-endpoints-limits"></a>

RDS Proxy 端點有下列限制：
+  無法修改 RDS Proxy 預設端點。
+  代理的使用者定義端點數目上限為 20。因此，代理最多可以有 21 個端點：預設端點，以及您建立的 20 個端點。
+  當您將其他端點與代理建立關聯時，RDS Proxy 會自動確定叢集中要用於每個端點的資料庫執行個體。
+  對於 IPv6 或雙堆疊端點網路類型，您的 VPC 和子網路必須設定為支援選取的網路類型。

當您建立代理時，RDS 會自動建立 VPC 端點，以在應用程式和資料庫之間進行安全通訊。VPC 端點是可見的，可以從 Amazon VPC 主控台存取。

新增代理端點會佈建 AWS PrivateLink 界面端點。如果您將一或多個端點新增至代理，會產生額外費用。如需詳細資訊，請參閱 [RDS Proxy 定價](https://aws.amazon.com/rds/proxy/pricing/)。

## 多可用區域資料庫叢集的代理端點
<a name="rds-proxy-endpoints-overview-maz"></a>

依預設，您將 RDS Proxy 與多可用區域資料庫叢集搭配使用時連線的端點具有讀取/寫入功能。因此，此端點會將所有請求傳送至叢集的寫入器執行個體。所有這些連線都會計入寫入器執行個體的 `max_connections` 值。如果您的 Proxy 與多可用區域資料庫叢集相關聯，您可以為該 Proxy 建立額外的讀取/寫入或唯讀端點。

您可以將唯讀端點與您的代理搭配使用，進行唯讀查詢。執行此操作的方式與您將讀取器端點用於多可用區域資料庫叢集的方式相同。這樣做有助於您利用多可用區域資料庫叢集的讀取可擴展性，而此叢集具有一個或多個讀取器資料庫執行個體。您可以使用唯讀端點，並視需將更多讀取器資料庫執行個體新增至多可用區域資料庫叢集，來執行更多同時查詢並建立更多同時連線。這些讀取器端點有助於改善查詢密集型應用程式的讀取可擴展性。如果叢集中的讀取器資料庫執行個體變得無法使用，讀取器端點也有助於改善連線的可用性。

### 多可用區域資料庫叢集的讀取器端點
<a name="rds-proxy-endpoints-reader-stub"></a>

 使用 RDS Proxy，您可以建立和使用讀取器端點。不過，這些端點僅適用於與多可用區域資料庫叢集相關聯的 Proxy。如果您使用 RDS CLI 或 API，您可能會看到具有值 `TargetRole` 的 `READ_ONLY` 屬性。您可以將代理的目標從 RDS 資料庫執行個體變更為多可用區域資料庫叢集，來利用此類代理。

 當您將 RDS Proxy 與多可用區域資料庫叢集搭配使用時，您可以建立並連線至稱為*讀取器端點*的唯讀端點。

#### 讀取器端點如何協助應用程式變得可用
<a name="rds-proxy-endpoints-reader-hapa"></a>

 在某些情況下，叢集中的讀取器執行個體可能無法使用。如果發生此情況，使用資料庫 Proxy 讀取器端點的連線可以比使用多可用區域資料庫叢集讀取器端點的連線更快復原。RDS Proxy 只會將連線路由傳送至叢集中可用的讀取器執行個體。當執行個體變得無法使用時，DNS 快取不會有延遲。

 如果連線為多路復用，RDS Proxy 會將後續查詢導向至不同的讀取器執行個體，而不會中斷您的應用程式。如果讀取器執行個體處於無法使用狀態，則會關閉該執行個體端點的所有用戶端連線。

 如果連線鎖定，則連線的下一個查詢會傳回錯誤。不過，您的應用程式可以立即重新連線至相同代理端點。RDS Proxy 會將連線路由至不同但為 `available` 狀態的讀取器資料庫執行個體。手動重新連線時，RDS Proxy 不會檢查新舊讀取器執行個體之間的複寫延遲。

 如果多可用區域資料庫叢集沒有任何可用的讀取器執行個體，RDS Proxy 會在其可用時嘗試連線至讀取器端點。如果連線借用逾時期間內沒有讀取器執行個體變得可用，則連線嘗試會失敗。如果讀取器執行個體變得可用，則連線嘗試會成功。

#### 讀取器端點如何協助實現查詢可擴展性
<a name="rds-proxy-endpoints-reader-scalability"></a>

 Proxy 的讀取器端點透過以下方式協助實現多可用區域資料庫叢集查詢可擴展性：
+  在實際情況下，RDS Proxy 針對使用特定讀取器端點連線的所有查詢問題，使用相同的讀取器資料庫執行個體。如此一來，相同資料表上的一組相關查詢可以利用特定資料庫執行個體上的快取、計劃最佳化等。
+  如果讀取器資料庫執行個體變得無法使用，則對應用程式的影響取決於工作階段是多路復用還是鎖定。如果工作階段是多路復用，RDS Proxy 會將任何後續查詢路由至不同的讀取器資料庫執行個體，而無需執行任何動作。如果工作階段已鎖定，您的應用程式會收到錯誤，並且必須重新連線。您可以立即重新連線至讀取器端點，並且 RDS Proxy 會將連線路由至可用的讀取器資料庫執行個體。如需代理工作階段的多工處理和鎖定的詳細資訊，請參閱[RDS Proxy 概念概觀](rds-proxy.howitworks.md#rds-proxy-overview)。

## 跨 VPC 存取 RDS 資料庫
<a name="rds-proxy-cross-vpc"></a>

 依預設，Aurora 技術堆疊的元件全都在同一個 Amazon VPC 中。例如，假設在 Amazon EC2 執行個體上執行的應用程式連線至 Amazon RDS 資料庫執行個體。在此情況下，應用程式伺服器和資料庫必須都位於同一個 VPC 內。

 使用 RDS Proxy，您可以從另一個 VPC 的資源 (例如 EC2 執行個體)，設定對一個 VPC 中 Amazon RDS 資料庫執行個體的存取。例如，您的組織可能有多個存取相同資料庫資源的應用程式。每個應用程式都可能在其自己的 VPC 中。

 若要啟用跨 VPC 存取，您可以為代理建立新的端點。Proxy 本身駐留在與 Amazon RDS 資料庫執行個體相同的 VPC 中。然而，跨 VPC 端點駐留在其他 VPC 中，以及 EC2 執行個體等其他資源。跨 VPC 端點與 EC2 和其他資源相同的 VPC 子網路和安全群組關聯。這些關聯可讓您從因 VPC 限制而無法存取資料庫的應用程式連線至端點。

 下列步驟說明如何透過 RDS Proxy 來建立和存取跨 VPC 端點：

1.  建立兩個 VPC，或選擇兩個已用於 和 RDS 工作的 VPC。每個 VPC 都應有其自己的關聯網路資源，例如，網際網路閘道、路由表、子網路和安全群組。如果您只有一個 VPC，可以參閱[Amazon RDS 入門](CHAP_GettingStarted.md)，了解設定另一個 VPC 以成功使用 RDS 的步驟。您還可以在 Amazon EC2 主控台中查看您現有的 VPC，了解要連線在一起的資源類型。

1.  建立與您要連線的 Amazon RDS 資料庫執行個體相關聯的資料庫 Proxy。請遵循 [為 Amazon RDS 建立代理](rds-proxy-creating.md) 中的程序。

1.  於 RDS 主控台代理的**詳細資訊**頁面上，在 **Proxy endpoints** (代理端點) 區段中，選擇 **Create endpoint** (建立端點)。請遵循 [建立代理端點](rds-proxy-endpoints.CreatingEndpoint.md) 中的程序。

1.  選擇要讓跨 VPC 端點讀取/寫入還是唯讀。

1.  不是接受與 Amazon RDS 資料庫執行個體相同 VPC 的預設值，而是選擇不同的 VPC。此 VPC 必須與代理所在的 VPC 位於相同的 AWS 區域。

1.  現在，不是接受與 Amazon RDS 資料庫執行個體相同 VPC 的子網路和安全群組預設值，而是選擇新的選項。根據您選擇的 VPC 中的子網路和安全群組進行這些設定。

1. 您不需要變更 Secrets Manager 機密的任何設定。相同的登入資料適用於代理的所有端點，無論每個端點所在的 VPC 為何。同樣地，使用 IAM 身分驗證時，即使端點位於不同的 VPCs 中，您的 IAM 組態和許可也會在所有代理端點中一致運作。每個端點不需要額外的 IAM 組態。

1.  等待新端點為**可用**狀態。

1.  記下完整的端點名稱。這是以 `Region_name.rds.amazonaws.com` 結尾的值，作為資料庫應用程式連線字串的一部分提供。

1.  從與端點相同的 VPC 中的資源存取新端點。測試此程序的簡單方法是，在此 VPC 中建立一個新的 EC2 執行個體。然後，使用連線字串中的端點值，登入 EC2 執行個體並執行 `mysql` 或 `psql` 命令來進行連線。

# 建立代理端點
<a name="rds-proxy-endpoints.CreatingEndpoint"></a>

若要建立代理端點，請按照以下指示：

## 主控台
<a name="rds-proxy-endpoints.CreatingEndpoint.CON"></a>

**若要建立代理伺服器端點**

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

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

1.  按一下您要為其建立新端點的代理名稱。

    該代理的詳細資訊頁面即會出現。

1.  在 **Proxy endpoints** (代理端點) 區段中，選擇 **Create proxy endpoint** (建立代理端點)。

    **Create proxy endpoint** (建立代理端點) 視窗即會出現。

1.  對於 **Proxy endpoint name** (代理端點名稱)，輸入您選擇的描述性名稱。

1.  對於 **Target role** (目標角色) 下，選擇要讓端點讀取/寫入還是唯讀。

    使用讀取/寫入端點的連線可以執行任何類型的操作，例如資料定義語言 (DDL) 陳述式、資料處理語言 (DML) 陳述式和查詢。這些端點一律連線至 RDS 資料庫叢集的主要執行個體。當您在應用程式中僅使用單一端點時，您可以使用讀取/寫入端點來進行一般資料庫操作。您還可以將讀取/寫入端點用於管理操作、線上交易處理 (OLTP) 應用程式，以及解壓縮轉換-載入 (ETL) 任務。

    使用唯讀端點的連線只能執行查詢。RDS Proxy 可以針對端點的每個連線使用其中一個讀取器執行個體。如此一來，查詢密集型應用程式可以利用多可用區域資料庫叢集的叢集功能。這些唯讀連線不會對叢集的主要執行個體施加任何額外負荷。如此一來，您的報告和分析查詢不會減慢 OLTP 應用程式的寫入操作。

1.  對於**虛擬私有雲端 (VPC)**，請選擇預設值，從通常用來存取代理或其相關聯資料庫的相同 EC2 執行個體或其他資源來存取端點。若要設定此代理的跨 VPC 存取，請選擇預設值以外的 VPC。如需跨 VPC 存取的詳細資訊，請參閱[跨 VPC 存取 RDS 資料庫](rds-proxy-endpoints.md#rds-proxy-cross-vpc)。

1.  對於**端點網路類型**，選擇代理端點的 IP 版本。可用選項為：
   + **IPv4** – 代理端點僅使用 IPv4 位址 (預設值)。
   + **IPv6** – 代理端點僅使用 IPv6 位址。
   + **雙堆疊** – 代理端點支援 IPv4 和 IPv6 位址。

   若要使用 IPv6 或雙堆疊，您的 VPC 和子網路必須設定為支援選取的網路類型。

1.  對於**子網路**，RDS Proxy 預設會填入與關聯代理相同的子網路。若要限制對端點的存取，以便只有部分 VPC 地址範圍可以連線至其中，請移除一個或多個子網路。

1.  若為 **VPC Security groups** (VPC 安全群組)，您可以選擇現有的安全群組，或建立新的安全群組。依據預設，RDS Proxy 會填入與相關聯代理相同的安全群組或群組。如果代理的傳入和傳出規則適用於此端點，則保留預設選項。

    如果您選擇建立新的安全群組，請在此頁面上指定安全群組的名稱。然後稍後從 EC2 主控台編輯安全群組設定。

1.  選擇 **Create proxy endpoint** (建立代理端點)。

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

 若要建立代理端點，請使用 AWS CLI [create-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-proxy-endpoint.html) 命令。

 包含下列必要參數：
+  `--db-proxy-name value` 
+  `--db-proxy-endpoint-name value` 
+  `--vpc-subnet-ids list_of_ids`. 以空格分隔子網路 ID。您沒有指定 VPC 本身的 ID。

 您還可以包含下列選用參數：
+  `--target-role { READ_WRITE | READ_ONLY }`此參數預設為 `READ_WRITE`。當代理與僅包含寫入器資料庫執行個體的多可用區域資料庫叢集相關聯時，您無法指定 `READ_ONLY`。如需有關預期使用唯讀端點搭配 多可用區域資料庫叢集的詳細資訊，請參閱 [多可用區域資料庫叢集的讀取器端點](rds-proxy-endpoints.md#rds-proxy-endpoints-reader-stub)。
+  `--vpc-security-group-ids value`. 以空格分隔安全群組 ID。如果省略此參數，RDS Proxy 會使用預設的 VPC 安全群組。RDS Proxy 會根據您為 `--vpc-subnet-ids` 參數指定的子網路 ID 來決定 VPC。
+  `--endpoint-network-type { IPV4 | IPV6 | DUAL }`。此參數指定代理端點的 IP 版本。預設值為 `IPV4`。若要使用 `IPV6` 或 `DUAL`，您的 VPC 和子網路必須設定為支援選取的網路類型。

**Example**  
 下列範例會建立名稱為 `my-endpoint` 的代理端點   
對於 Linux、macOS 或 Unix：  

```
aws rds create-db-proxy-endpoint \
  --db-proxy-name my-proxy \
  --db-proxy-endpoint-name my-endpoint \
  --vpc-subnet-ids subnet_id subnet_id subnet_id ... \
  --target-role READ_ONLY \
  --vpc-security-group-ids security_group_id \
  --endpoint-network-type DUAL
```
在 Windows 中：  

```
aws rds create-db-proxy-endpoint ^
  --db-proxy-name my-proxy ^
  --db-proxy-endpoint-name my-endpoint ^
  --vpc-subnet-ids subnet_id_1 subnet_id_2 subnet_id_3 ... ^
  --target-role READ_ONLY ^
  --vpc-security-group-ids security_group_id ^
  --endpoint-network-type DUAL
```

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

 若要建立代理端點，請使用 RDS API [CreateDBProxyEndpoint](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBProxyEndpoint.html) 動作。

# 檢視代理端點
<a name="rds-proxy-endpoints.DescribingEndpoint"></a>

若要檢視現有的代理端點，請遵循下列指示：

## 主控台
<a name="rds-proxy-endpoints.DescribingEndpoint.CON"></a>

**若要檢視代理端點的詳細資訊**

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

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

1.  在清單中，選擇您要檢視其端點的代理。按一下代理名稱，以檢視其詳細資訊頁面。

1.  在 **Proxy endpoints** (代理端點) 區段中，選擇您要檢視的端點。按一下其名稱，以檢視詳細資訊頁面。

1.  檢查您感興趣的參數值。您可以檢查如下所示屬性：
   +  端點是讀取/寫入還是唯讀。
   +  您在資料庫連線字串中使用的端點地址。
   +  與端點關聯的 VPC、子網路和安全群組。

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

 若要檢視一或多個代理端點，請使用 AWS CLI [describe-db-proxy-endpoints](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-endpoints.html) 命令。

 您可以包含下列任一選用參數：
+  `--db-proxy-endpoint-name` 
+  `--db-proxy-name` 

 以下範例描述 `my-endpoint` 代理端點。

**Example**  
針對 Linux、macOS 或 Unix：  

```
aws rds describe-db-proxy-endpoints \
  --db-proxy-endpoint-name my-endpoint
```
針對 Windows：  

```
aws rds describe-db-proxy-endpoints ^
  --db-proxy-endpoint-name my-endpoint
```

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

 若要描述一個或多個代理端點，請使用 RDS API [DescribeDBProxyEndpoints](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyEndpoints.html) 操作。

# 修改代理端點
<a name="rds-proxy-endpoints.ModifyingEndpoint"></a>

若要修改代理端點，請遵循下列指示：

## 主控台
<a name="rds-proxy-endpoints.ModifyingEndpoint.CON"></a>

**修改一個或多個代理端點**

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

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

1. 在清單中，選擇您要修改其端點的代理。按一下代理名稱，以檢視其詳細資訊頁面。

1.  在 **Proxy endpoints** (代理端點) 區段中，選擇您要修改的端點。您可以在清單中選取或按一下其名稱，以檢視詳細資訊頁面。

1.  在代理詳細資訊頁面的 **Proxy endpoints** (代理端點) 區段中，選擇 **Edit** (編輯)。或者在代理端點詳細資訊頁面上，針對**動作**，選擇**編輯**。

1.  變更您要修改的參數值。

1.  選擇**儲存變更**。

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

 若要修改代理端點，請使用 AWS CLI [modify-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-endpoint.html) 命令搭配下列必要參數：
+  `--db-proxy-endpoint-name` 

 使用下列一個或多個參數來指定對端點屬性的變更：
+  `--new-db-proxy-endpoint-name` 
+  `--vpc-security-group-ids`. 以空格分隔安全群組 ID。

 下列範例會將 `my-endpoint` 代理端點重新命名為 `new-endpoint-name`。

**Example**  
針對 Linux、macOS 或 Unix：  

```
aws rds modify-db-proxy-endpoint \
  --db-proxy-endpoint-name my-endpoint \
  --new-db-proxy-endpoint-name new-endpoint-name
```
針對 Windows：  

```
aws rds modify-db-proxy-endpoint ^
  --db-proxy-endpoint-name my-endpoint ^
  --new-db-proxy-endpoint-name new-endpoint-name
```

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

 若要修改代理端點，請使用 RDS API [ModifyDBProxyEndpoint](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyEndpoint.html) 操作。

# 刪除代理端點
<a name="rds-proxy-endpoints.DeletingEndpoint"></a>

 若要刪除代理的端點，請遵循下列指示：

**注意**  
 您無法刪除 RDS Proxy 自動為每個代理建立的預設代理端點。  
 當您刪除代理時，RDS Proxy 會自動刪除所有關聯的端點。

## 主控台
<a name="rds-proxy-endpoints.DeleteEndpoint.console"></a>

**若要使用 AWS 管理主控台 來刪除代理端點**

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

1.  在清單中，選擇您要刪除其端點的代理。按一下代理名稱，以檢視其詳細資訊頁面。

1.  在 **Proxy endpoints** (代理端點) 區段中，選擇您要刪除的端點。您可以在清單中選取一個或多個端點，或者按一下單一端點的名稱，以檢視詳細資訊頁面。

1.  在代理詳細資訊頁面的 **Proxy endpoints** (代理端點) 區段中，選擇 **Delete** (刪除)。或者在代理端點詳細資訊頁面上，針對**動作**，選擇**刪除**。

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

 若要刪除代理端點，請執行 [delete-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-proxy-endpoint.html) 命令，其中包含下列必要參數：
+  `--db-proxy-endpoint-name` 

 下列命令會刪除名稱為 `my-endpoint` 的代理端點。

針對 Linux、macOS 或 Unix：

```
aws rds delete-db-proxy-endpoint \
  --db-proxy-endpoint-name my-endpoint
```

針對 Windows：

```
aws rds delete-db-proxy-endpoint ^
  --db-proxy-endpoint-name my-endpoint
```

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

 若要使用 RDS API 刪除代理端點，請執行 [DeleteDBProxyEndpoint](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteDBProxyEndpoint.html) 操作。指定代理端點 `DBProxyEndpointName` 參數的名稱。

# 使用 Amazon CloudWatch 監控 RDS Proxy 指標
<a name="rds-proxy.monitoring"></a>

 您可以使用 Amazon CloudWatch 來監控 RDS Proxy。CloudWatch 會收集並處理來自代理的原始資料，進而將這些資料轉換為便於讀取且幾近即時的指標。若要在 CloudWatch 主控台中尋找這些指標，請選擇**Metrics (指標)**，然後選擇 **RDS**，並選擇 **Per-Proxy Metrics (每代理指標)**。如需詳細資訊，請參閱《Amazon CloudWatch 使用者指南》的[使用 Amazon CloudWatch 指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html)。

**注意**  
 RDS 會針對與代理關聯的每個基礎 Amazon EC2 執行個體發佈這些指標。單一代理可能由一個以上的 EC2 執行個體服務。使用 CloudWatch 統計資料彙總所有關聯執行個體之間的代理值。  
 其中一些指標可能會在 Proxy 第一次成功連線之後才顯示。

 在 RDS Proxy 日誌中，每個項目均會以關聯的代理端點名稱作為前綴。此名稱可以是您針對使用者定義端點所指定的名稱，也可以是執行讀取/寫入請求的代理預設端點的特殊名稱 `default`。

 所有 RDS Proxy 指標都在群組 `proxy` 中。

 每個代理端點都有其自己的 CloudWatch 指標。您可以獨立監控每個代理端點的用量。如需代理端點的詳細資訊，請參閱[使用 Amazon RDS Proxy 端點](rds-proxy-endpoints.md).

 您可以使用下列其中一個維度集來彙總每個指標的值。例如，藉由使用 `ProxyName` 維度集，您可以分析特定代理的所有流量。透過使用其他維度集，您可以用不同的方式來分割指標。您可以根據每個代理的不同端點或目標資料庫，或者每個資料庫的讀取/寫入和唯讀流量來分割指標。
+   維度集 1：`ProxyName`
+   維度集 2：`ProxyName`、`EndpointName`
+   維度集 3：`ProxyName`、`TargetGroup`、`Target`
+   維度集 4：`ProxyName`、`TargetGroup`、`TargetRole`


|  指標  |  描述  |  有效期間  |  CloudWatch 維度集  | 
| --- | --- | --- | --- | 
|  `AvailabilityPercentage`   |   目標群組在維度所指出的角色中可供使用的時間百分比。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |  1 分鐘  |  [Dimension set 4](#proxy-dimension-set-4)  | 
| ClientConnections  |   目前的用戶端連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |   1 分鐘   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsClosed  |   已關閉的用戶端連線數。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsInSetup |  目前開啟的用戶端連線數量，但尚未完成設定。此指標每分鐘報告一次。此指標最有用的統計資料是「總和」。  |  1 分鐘  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `ClientConnectionsNoTLS`   |  不具有 Transport Layer Security (TLS) 的目前用戶端連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 Sum。 |  1 分鐘 |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `ClientConnectionsReceived`   |   接收到的用戶端連線要求數。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsSetupFailedAuth  |   因身分驗證或 TLS 設定錯誤而失敗的用戶端連線嘗試次數。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsSetupSucceeded  |   使用任何具有或不具 TLS 的身分驗證機制成功建立的用戶端連線數。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsTLS  |  具有 TLS 的目前用戶端連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 Sum。 | 1 分鐘 |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| DatabaseConnectionRequests  |   建立資料庫連線的要求數目。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `DatabaseConnectionRequestsWithTLS`   |  要透過 TLS 建立資料庫連線的要求數目。此指標最實用的統計資料是 Sum。 |  1 分鐘或以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnections  |   目前的資料庫連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |   1 分鐘   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `DatabaseConnectionsBorrowLatency`   |  代理為了取得資料庫連線而受到監控所花費的時間 (以毫秒為單位)。此指標最實用的統計資料是 Sum。 |  1 分鐘或以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| DatabaseConnectionsCurrentlyBorrowed  |   目前借用狀態中的資料庫連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |   1 分鐘   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsCurrentlyInTransaction  |   交易中的目前資料庫連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |   1 分鐘   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsCurrentlySessionPinned  |   由於變更工作階段狀態之用戶端要求中的操作而遭到鎖定的目前資料庫連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |   1 分鐘   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsSetupFailed  |   失敗的資料庫連線要求數目。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsSetupSucceeded  |   使用或不使用 TLS 成功建立的資料庫連線數。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `DatabaseConnectionsWithTLS`   |  具有 TLS 的目前資料庫連線數。此指標每分鐘報告一次。此指標最實用的統計資料是 Sum。 |  1 分鐘  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| MaxDatabaseConnectionsAllowed  |   允許的資料庫連線數上限。此指標每分鐘報告一次。此指標最實用的統計資料是 `Sum`。  |   1 分鐘   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `QueryDatabaseResponseLatency`   |  資料庫回應查詢已花費的時間 (以毫秒為單位)。此指標最實用的統計資料是 Average。 |  1 分鐘或以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| QueryRequests  |   收到的查詢數。包含多個陳述式的查詢會計算為一個查詢。此指標最實用的統計資料是 `Sum`。  |   1 分鐘或以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryRequestsNoTLS  |  從非 TLS 連線收到的查詢數。包含多個陳述式的查詢會計算為一個查詢。此指標最實用的統計資料是 Sum。 |  1 分鐘或以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `QueryRequestsTLS`   |  從 TLS 連線收到的查詢數。包含多個陳述式的查詢會計算為一個查詢。此指標最實用的統計資料是 Sum。 |  1 分鐘或以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryResponseLatency  |  取得查詢請求與代理回應請求之間的時間 (以毫秒為單位)。此指標最實用的統計資料是 Average。 |  1 分鐘或以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 

 您可以在 AWS 管理主控台 中的 CloudWatch 下方找到 RDS Proxy 活動的記錄。每個代理在**日誌群組**頁面中都有一筆記錄。

**重要**  
 這些日誌檔是供人類使用，用於故障診斷，而非程式設計存取。日誌檔的格式和內容可能會變更。  
 尤其是，較舊的日誌不包含指示每個請求端點的任何前綴。在較新的日誌中，每個項目均會以關聯的代理端點名稱作為前綴。此名稱可以是您針對使用者定義端點所指定的名稱，也可以是請求的 `default` 特殊名稱 (使用代理的預設端點)。

# 使用 RDS Proxy 事件
<a name="rds-proxy.events"></a>

*事件*指示某個環境的變更，例如 AWS 環境或軟體即服務 (SaaS) 合作夥伴的服務或應用程式。也可以是您自己的自訂應用程式或服務。例如，建立或修改 RDS Proxy 時，Amazon RDS 會產生一個事件。Amazon RDS 會近乎即時地將事件傳遞至 Amazon EventBridge。以下列出可訂閱的 Amazon RDS Proxy 事件清單以及 RDS Proxy 事件範例。

如需使用事件的詳細資訊，請參閱下列內容：
+ 如需使用 AWS 管理主控台、AWS CLI 或 RDS API 來檢視事件的說明，請參閱 [檢視 Amazon RDS 事件](USER_ListEvents.md)。
+ 若要了解如何設定 Amazon RDS 將事件傳送到 EventBridge，請參閱 [建立由 Amazon RDS 事件觸發的規則](rds-cloud-watch-events.md)。

## RDS Proxy 事件
<a name="rds-proxy.events.list"></a>

下表顯示 RDS Proxy 為來源類型時的事件類別和事件清單。


|  類別  | RDS 事件 ID |  訊息  |  備註  | 
| --- | --- | --- | --- | 
| 組態變更 | RDS-EVENT-0204 |  RDS 已修改資料庫代理 *name*。  | 無 | 
| 組態變更 | RDS-EVENT-0207 |  RDS 已修改資料庫代理 *name* 的端點。  | 無 | 
| 組態變更 | RDS-EVENT-0213 |  RDS 偵測到新增了資料庫執行個體，並自動將其新增到資料庫代理 *name* 的目標群組。  | 無 | 
|  組態變更  | RDS-EVENT-0214 |  RDS 偵測到刪除了資料庫執行個體 *name*，並自動將其從資料庫代理 *name* 的目標群組 *name* 中移除。  | 無 | 
|  組態變更  | RDS-EVENT-0215 |  RDS 偵測到刪除了資料庫叢集 *name*，並自動將其從資料庫代理 *name* 的目標群組 *name* 中移除。  | 無 | 
|  建立  | RDS-EVENT-0203 |  RDS 已建立資料庫代理 *name*。  | 無 | 
|  建立  | RDS-EVENT-0206 |  RDS 已建立資料庫代理 *name* 的端點 *name*。  | 無 | 
| 刪除 | RDS-EVENT-0205 |  RDS 已刪除資料庫代理 *name*。  | 無 | 
|  刪除  | RDS-EVENT-0208 |  RDS 已刪除資料庫代理 *name* 的端點 *name*。  | 無 | 
|  失敗  | RDS-EVENT-0243 |  RDS 無法佈建代理 *name* 的容量，因為您的子網路中沒有足夠的可用 IP 地址：*name*。若要修正此問題，請確定您的子網路具有最低數量的未使用 IP 地址，如 RDS Proxy 文件所建議。  |  若要確定執行個體類別的建議數量，請參閱 [規劃 IP 地址容量](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)。  | 
|  失敗 | RDS-EVENT-0275 |  RDS 對部分連往資料庫代理*名稱*的連線進行限流。從用戶端到代理的同時連線要求數目已超過限制。  | 無 | 

以下是 JSON 格式的 RDS Proxy 事件範例。事件顯示 RDS 修改了 `my-endpoint` RDS Proxy 的 `my-rds-proxy` 端點。事件 ID 是 RDS-EVENT-0207。

```
{
  "version": "0",
  "id": "68f6e973-1a0c-d37b-f2f2-94a7f62ffd4e",
  "detail-type": "RDS DB Proxy Event",
  "source": "aws.rds",
  "account": "123456789012",
  "time": "2018-09-27T22:36:43Z",
  "region": "us-east-1",
  "resources": [
     "arn:aws:rds:us-east-1:123456789012:db-proxy:my-rds-proxy"
  ],
  "detail": {
    "EventCategories": [
      "configuration change"
    ],
    "SourceType": "DB_PROXY",
    "SourceArn": "arn:aws:rds:us-east-1:123456789012:db-proxy:my-rds-proxy",
    "Date": "2018-09-27T22:36:43.292Z",
    "Message": "RDS modified endpoint my-endpoint of DB Proxy my-rds-proxy.",
    "SourceIdentifier": "my-endpoint",
    "EventID": "RDS-EVENT-0207"
  }
}
```

# RDS Proxy 的故障診斷
<a name="rds-proxy.troubleshooting"></a>

 您可在下列內容中找到某些常見 RDS Proxy 問題的故障診斷想法，以及 RDS Proxy 的 CloudWatch 日誌的相關資訊。

 在 RDS Proxy 日誌中，每個項目均會以關聯的代理端點名稱作為前綴。此名稱可以是您針對使用者定義端點所指定的名稱。也可以是執行讀取/寫入請求之代理預設端點的特殊名稱 `default`。如需代理端點的詳細資訊，請參閱[使用 Amazon RDS Proxy 端點](rds-proxy-endpoints.md).

**Topics**
+ [驗證代理的連線能力](#rds-proxy-verifying)
+ [常見問題與解決方案](#rds-proxy-diagnosis)
+ [針對 RDS for MySQL 的 RDS Proxy 問題進行疑難排解](#rds-proxy-MySQL-troubleshooting)
+ [針對 RDS for PostgreSQL 的 RDS Proxy 問題進行疑難排解](#rds-proxy-PostgreSQL-troubleshooting)

## 驗證代理的連線能力
<a name="rds-proxy-verifying"></a>

 您可以使用下列命令來驗證連線中的所有元件 (例如代理、資料庫和運算執行個體) 可以彼此通訊。

 使用 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) 命令檢查代理本身。也請使用 [describe-db-proxy-target-groups](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-target-groups.html) 命令檢查相關聯的目標群組。檢查目標的詳細資訊是否符合您打算與 Proxy 建立關聯的 RDS 資料庫執行個體。使用如下命令。

```
aws rds describe-db-proxies --db-proxy-name $DB_PROXY_NAME
aws rds describe-db-proxy-target-groups --db-proxy-name $DB_PROXY_NAME
```

 若要確認代理可連線至基礎資料庫，請使用 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html) 命令檢查目標群組中指定的目標。使用如下命令。

```
aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME
```

 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html) 命令的輸出包含 `TargetHealth` 欄位。您可以檢查 `State` 內的 `Reason`、`Description` 和 `TargetHealth` 欄位，以檢查代理是否能與基礎資料庫執行個體進行通訊。
+  `State` 的 `AVAILABLE` 值表示代理可連線至資料庫執行個體。
+  `State` 的 `UNAVAILABLE` 值表示暫時或永久的連線問題。在這種情況下，請檢查 `Reason` 和 `Description` 欄位。例如，如果 `Reason` 具有 `PENDING_PROXY_CAPACITY` 的值，請在代理完成其擴展操作後嘗試再次連線。如果 `Reason` 具有 `UNREACHABLE`、`CONNECTION_FAILED` 或 `AUTH_FAILURE` 的值，請使用來自 `Description` 欄位的解說，協助您診斷此問題。
+  `State` 欄位在變更為 `REGISTERING` 或 `AVAILABLE` 前，可能短暫具有 `UNAVAILABLE` 的值。

 如果下列 Netcat 命令 (`nc`) 成功，您可以從 EC2 執行個體或登入的其他系統存取代理端點。如果您與代理和關聯的資料庫不在同一 VPC 中，則此命令會回報失敗。您可能可以直接登入資料庫，而不需要在同一個 VPC 中。然而除非您位於同一個 VPC 中，否則無法登入代理。

```
nc -zx MySQL_proxy_endpoint 3306

nc -zx PostgreSQL_proxy_endpoint 5432
```

 您可以使用下列命令確定您的 EC2 執行個體具有需要的屬性。特別是，EC2 執行個體的 VPC 必須與 Proxy 連線的 的 VPC 相同。

```
aws ec2 describe-instances --instance-ids your_ec2_instance_id
```

 檢查用於代理的 Secrets Manager 秘密。

```
aws secretsmanager list-secrets
aws secretsmanager get-secret-value --secret-id your_secret_id
```

 請確定 `get-secret-value` 所顯示的 `SecretString` 欄位已編碼為包含 `username` 和 `password` 欄位的 JSON 字串。下列範例顯示 `SecretString` 欄位的格式。

```
{
  "ARN": "some_arn",
  "Name": "some_name",
  "VersionId": "some_version_id",
  "SecretString": '{"username":"some_username","password":"some_password"}',
  "VersionStages": [ "some_stage" ],
  "CreatedDate": some_timestamp
}
```

疑難排解 IAM 身分驗證問題時，請確認下列事項：
+ 資料庫已啟用 IAM 身分驗證。
+ 代理已設定正確的身分驗證機制。
+ 提供給代理的 IAM 角色中的 IAM 政策會將必要的`rds-db:connect`許可授予適當的資料庫及其使用者名稱。
+ 對於end-to-end IAM 身分驗證，存在符合 IAM 使用者或角色名稱的資料庫使用者。
+ 連線已啟用 SSL/TLS。

## 常見問題與解決方案
<a name="rds-proxy-diagnosis"></a>

本節說明使用 RDS Proxy 時的一些常見問題和潛在解決方案。

執行 `aws rds describe-db-proxy-targets` CLI 命令之後，如果 `TargetHealth` 描述說明 `Proxy does not have any registered credentials`，請驗證下列事項：
+ 有已註冊的憑證，供使用者存取代理。
+ 用來存取代理所使用之 Secrets Manager 秘密的 IAM 角色是有效的。

建立或連線至資料庫代理時，您可能會遇到下列 RDS 事件。


| 類別 | RDS 事件 ID | 說明 | 
| --- | --- | --- | 
|  失敗  | RDS-EVENT-0243 | RDS 無法佈建代理的容量，因為子網路中沒有足夠的可用 IP 地址。若要修正此問題，請確認您的子網路具有最低數目的未使用 IP 地址。若要確定執行個體類別的建議數量，請參閱 [規劃 IP 地址容量](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)。 | 
|  失敗  | RDS-EVENT-0275 |  RDS 對部分連往資料庫代理*名稱*的連線進行限流。從用戶端到代理的同時連線要求數目已超過限制。  | 

 建立新代理或連線至代理時，可能會遇到下列問題。


|  錯誤  |  原因或因應措施  | 
| --- | --- | 
|   `403: The security token included in the request is invalid`   |  選取現有的 IAM 角色，而不是選擇建立新的 IAM 角色。 | 

## 針對 RDS for MySQL 的 RDS Proxy 問題進行疑難排解
<a name="rds-proxy-MySQL-troubleshooting"></a>

 連線到 MySQL 代理時可能會遇到下列問題。


|  錯誤  |  原因或因應措施  | 
| --- | --- | 
|  ERROR 1040 (HY000): Connections rate limit exceeded (limit\$1value)  |  從用戶端到代理的連線要求速率已超過限制。 | 
|  ERROR 1040 (HY000): IAM authentication rate limit exceeded  |  從用戶端到代理器的 IAM 身分驗證同時請求數目已超過限制。 | 
|  ERROR 1040 (HY000): Number simultaneous connections exceeded (limit\$1value)  |  從用戶端到代理的同時連線要求數目超過限制。 | 
|   `ERROR 1045 (28000): Access denied for user 'DB_USER'@'%' (using password: YES)`   |  代理使用的 Secrets Manager 私密不符合現有資料庫使用者的使用者名稱和密碼。更新 Secrets Manager 私密中的登入資料，或確認資料庫使用者存在，且具有與私密中相同的密碼。 | 
|  ERROR 1105 (HY000): Unknown error  |  發生未知的錯誤。 | 
|  ERROR 1231 (42000): Variable ''character\$1set\$1client'' can't be set to the value of value  |   為 `character_set_client` 參數設定的值無效。例如，值 `ucs2` 是無效的，因為它可能會讓 MySQL 伺服器當機。  | 
|  ERROR 3159 (HY000): This RDS Proxy requires TLS connections.  |   您已在代理中啟用**需要 Transport Layer Security**設定，但您的連線已在 MySQL 用戶端中包含參數 `ssl-mode=DISABLED`。執行下列任何一項： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  ERROR 2026 (HY000): SSL connection error: Internal Server Error  |   TLS 與代理的交握失敗。一些可能的原因包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  ERROR 9501 (HY000): Timed-out waiting to acquire database connection  |   代理等候取得資料庫連線逾時。一些可能的原因包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 

## 針對 RDS for PostgreSQL 的 RDS Proxy 問題進行疑難排解
<a name="rds-proxy-PostgreSQL-troubleshooting"></a>

 連線到 PostgreSQL 代理時可能會遇到下列問題。


|  錯誤  |  原因  |  解決方案  | 
| --- | --- | --- | 
|   `ERROR 28000: IAM authentication is allowed only with SSL connections.`   |   使用者嘗試使用 PostgreSQL 用戶端中的 `sslmode=disable` 設定，透過 IAM 身分驗證連線至資料庫。  |   使用者需要使用 PostgreSQL 用戶端中 `sslmode=require` 的最小設定連接到資料庫。如需詳細資訊，請參閱 [PostgreSQL SSL 支援](https://www.postgresql.org/docs/current/libpq-ssl.html)文件。  | 
|  `ERROR 28000: This RDS proxy has no credentials for the role role_name. Check the credentials for this role and try again.`   |   這個角色沒有 Secrets Manager 秘密   |   新增此角色的 Secrets Manager 秘密。如需詳細資訊，請參閱[設定 RDS Proxy 的 IAM 身分驗證](rds-proxy-iam-setup.md)。  | 
|  `ERROR 28000: RDS supports only IAM, MD5, or SCRAM authentication.`   |   用來連線到代理的資料庫用戶端正在使用代理目前不支援的身分驗證機制。  |   如果您未使用 IAM 身分驗證，請使用 MD5 或 SCRAM 密碼身分驗證。  | 
|  `ERROR 28000: A user name is missing from the connection startup packet. Provide a user name for this connection.`   |   嘗試建立連線時，用來連線至 Proxy 的資料庫用戶端並未傳送使用者名稱。  |   使用您選擇的 PostgreSQL 用戶端設定與代理連線時，請務必定義使用者名稱。  | 
|  `ERROR 28000: IAM is allowed only with SSL connections.`   |   用戶端嘗試使用 IAM 驗證進行連線，但未啟用 SSL。  |   在用戶端中啟用 SSL。  | 
|  `ERROR 28000: This RDS Proxy requires TLS connections.`   |   使用者啟用**需要 Transport Layer Security**選項，但嘗試使用 PostgreSQL 用戶端中的 `sslmode=disable` 連線。  |   若要修正此錯誤，請執行下列其中一項操作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR 28P01: IAM authentication failed for user user_name. Check the IAM token for this user and try again.`   |   此錯誤可能由下列原因造成： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   若要修正此錯誤，請執行下列動作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR 28P01: The password that was provided for the role role_name is wrong.`   |   此角色的密碼與 Secrets Manager 密碼不符。  |   在 Secrets Manager 檢查此角色的密碼，以查看密碼是否與 PostgreSQL 用戶端中使用的密碼相同。  | 
|  `ERROR 28P01: The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.`   |   用於 IAM 驗證的 IAM 符記發生問題。  |   產生一個新的身分驗證符記，並在新的連線中加以使用。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy supports only version 3.0 of the PostgreSQL messaging protocol.`   |   用於連線到代理的 PostgreSQL 用戶端使用的通訊協定早於 3.0。  |   使用支援 3.0 訊息通訊協定的較新 PostgreSQL 用戶端。如果您使用的是 PostgreSQL `psql` CLI，請使用大於或等於 7.4 的版本。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support streaming replication mode.`   |   用來連線至 Proxy 的 PostgreSQL 用戶端正在嘗試使用串流複寫模式，而 RDS Proxy 目前不支援這種模式。  |   關閉用於連線的 PostgreSQL 用戶端中的串流複寫模式。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support the option option_name.`   |   透過啟動訊息，用來連線至 Proxy 的 PostgreSQL 用戶端正在要求 RDS Proxy 目前不支援的選項。  |   在用於連線的 PostgreSQL 用戶端中，關閉上述訊息中顯示為不支援的選項。  | 
|  `ERROR 53300: The IAM authentication failed because of too many competing requests.`   |   從用戶端到代理器的 IAM 身分驗證同時請求數目已超過限制。  |   降低使用 PostgreSQL 用戶端的 IAM 驗證建立連線的速率。  | 
|  `ERROR 53300: The maximum number of client connections to the proxy exceeded number_value.`   |   從用戶端到代理的同時連線要求數目超過限制。  |   減少從 PostgreSQL 用戶端到此 RDS Proxy 的作用中連線數目。  | 
|  `ERROR 53300: Rate of connection to proxy exceeded number_value.`   |   從用戶端到代理的連線要求速率已超過限制。  |   降低從 PostgreSQL 用戶端建立連線的速率。  | 
|  `ERROR XX000: Unknown error.`   |   發生未知的錯誤。  |   請聯絡 AWS Support 以調查問題。  | 
|  `ERROR 08000: Timed-out waiting to acquire database connection.`   |   代理逾時等待在 `ConnectionBorrowTimeout` 設定指定的持續時間內取得資料庫連線。一些可能的原因包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   可能的解決方案如下： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR XX000: Request returned an error: database_error.`   |   從 Proxy 建立的資料庫連線傳回錯誤。  |   解決方案取決於特定的資料庫錯誤。其中一個範例為 `Request returned an error: database "your-database-name" does not exist`。這表示指定的資料庫名稱不存在於資料庫伺服器上。或者，它表示用作資料庫名稱的使用者名稱 (如果未指定資料庫名稱) 不存在於伺服器上。  | 
|  `ERROR 53300: The IAM authentication failed because of too many competing requests.`  |  從用戶端到代理器的 IAM 身分驗證同時請求數目已超過限制。  |  降低使用 PostgreSQL 用戶端的 IAM 驗證建立連線的速率。  | 
|  `ERROR 28000: Enable IAM authentication for the client connection to the proxy and try again.`  |  RDS Proxy 無法連線至資料庫，因為用戶端連線至代理未啟用 IAM 身分驗證。當代理的`DefaultAuthScheme`參數設為`IAM_AUTH`具有註冊使用者的 ，但用戶端使用密碼身分驗證而非 IAM 身分驗證時，就會發生這種情況。  |  啟用用戶端連線至代理的 IAM 身分驗證，然後再試一次。  | 
|  `ERROR 28000: Configure IAM authentication as the DefaultAuthScheme in your proxy and try again.`  |  RDS Proxy 無法連線至資料庫，因為 `DefaultAuthScheme`未設定為 `IAM_AUTH`。代理的 `DefaultAuthScheme` 參數設定為 `NONE`，但用戶端嘗試使用 IAM 身分驗證。  |  `IAM_AUTH` 為您的代理將 `DefaultAuthScheme`設定為 ，然後再試一次。  | 

### 針對已刪除的 `postgres` 資料庫進行疑難排解
<a name="rds-proxy-PostgreSQL-troubleshooting.postgresDBDelete"></a>

如果您錯誤地從執行個體刪除 `postgres` 資料庫，則需要還原資料庫以還原執行個體的連線。在您的資料庫執行個體內執行下列命令：

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

# 將 RDS Proxy 與 AWS CloudFormation 搭配使用
<a name="rds-proxy-cfn"></a>

 您可以將 RDS Proxy 與 AWS CloudFormation 搭配使用。這可協助您建立相關資源的群組。這類群組可以包含可連線至新建立之 Amazon RDS 資料庫執行個體的 Proxy。CloudFormation 中的 RDS Proxy 支援包含兩個新的註冊類型：`DBProxy` 和 `DBProxyTargetGroup`。

 下列清單會顯示 RDS Proxy 的範例 CloudFormation 範本。

```
Resources:
 DBProxy:
   Type: AWS::RDS::DBProxy
   Properties:
     DBProxyName: CanaryProxy
     EngineFamily: MYSQL
     RoleArn:
      Fn::ImportValue: SecretReaderRoleArn
     Auth:
       - {AuthScheme: SECRETS, SecretArn: !ImportValue ProxySecret, IAMAuth: DISABLED}
     VpcSubnetIds:
       Fn::Split: [",", "Fn::ImportValue": SubnetIds]

 ProxyTargetGroup: 
   Type: AWS::RDS::DBProxyTargetGroup
   Properties:
     DBProxyName: CanaryProxy
     TargetGroupName: default
     DBInstanceIdentifiers: 
       - Fn::ImportValue: DBInstanceName
   DependsOn: DBProxy
```

 如需詳細了解此範例中的資源，請參閱 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html) 和 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html)。

 如需有關您可以使用 CloudFormation 建立的資源的詳細資訊，請參閱 [RDS 資源類型參考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_RDS.html)。