

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

Amazon RDS Proxy を使用すると、アプリケーションでデータベース接続をプールおよび共有して、アプリケーションのスケーリング能力を向上させることができます。RDS Proxy は、アプリケーション接続を維持しながらスタンバイ DB インスタンスに自動的に接続することで、データベースの障害に対するアプリケーションの耐障害性を高めます。RDS Proxy を使用すると、プロキシに接続するクライアントに AWS Identity and Access Management (IAM) 認証を適用でき、プロキシは IAM データベース認証または AWS Secrets Manager に保存されている認証情報を使用してデータベースに接続できます。

![\[アプリケーションが RDS Proxy に接続する方法の概要\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Proxy-Overview.png)


 RDS Proxy を使用すると、データベーストラフィックの予測不可能なサージを処理できます。そうでない場合、このようなサージは、接続のオーバーサブスクリプションや新しい接続の急速な作成による問題の原因となることがあります。RDS Proxy は、データベース接続プールを確立し、このプール内の接続を再利用します。この方法により、毎回新しいデータベース接続を開くことによるメモリと CPU のオーバーヘッドを回避することができます。オーバーサブスクリプションからデータベースを保護するために、データベース接続の作成数を制御できます。

 RDS Proxy は、接続プールからアプリケーション接続をすぐに提供できない場合に、これらの接続の処理順序を決めたり、スロットリングを行ったりします。レイテンシーは増加する場合がありますが、データベースの障害や過負荷が突然発生することはなく、アプリケーションは継続してスケーリングされます。接続リクエスト数が指定した制限を超えると、RDS Proxy はアプリケーション接続を拒否 (負荷を削除) します。同時に、使用可能な容量で RDS が対応できる負荷に対して、予測可能なパフォーマンスを維持します。

![\[アプリケーションが RDS Proxy に接続する方法と、関連する接続のタイプの詳細ビュー。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Proxy-detail.png)


 認証情報を処理するオーバーヘッドを減らし、新しい接続ごとに安全な接続を確立できます。RDS Proxy は、この作業の一部をデータベースに代わって処理できます。

 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 リージョン によって異なります。RDS Proxy に関する Amazon RDS のバージョンとリージョンの可用性の詳細については、「[Amazon RDS Proxy でサポートされているリージョンと DB エンジン](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSProxy.md)」を参照してください。

## RDS Proxy のクォータと制限事項
<a name="rds-proxy.limitations"></a>

 RDS Proxy には以下のクォータと制限が適用されます。
+  各 AWS アカウント ID は 20 個のプロキシに制限されています。アプリケーションがさらに多くのプロキシを必要とする場合、AWS マネジメントコンソール 内の **Service Quotas** ページから引き上げをリクエストします。**Service Quotas** ページで、**Amazon Relational Database Service (Amazon RDS)** を選択し、**Proxies** を見つけてクォータの引き上げをリクエストします。AWS は、クォータを自動的に引き上げたり、サポート によるリクエストのレビューを保留したりできます。
+ 各プロキシには最大 200 個の Secrets Manager シークレットを関連付けることができるため、シークレットを使用するときに接続を最大 200 個の異なるユーザーアカウントに制限できます。
+  各プロキシにはデフォルトのエンドポイントがあり、プロキシの設定済みサブネットから選択された 2 つのアベイラビリティーゾーンにのみプロビジョニングされます。複数の AZ にサブネットが設定されている場合、そのうちの 2 つが選択されます。
+  プロキシごとに最大 20 のその他のプロキシエンドポイントを追加できます。これらの追加のエンドポイントは、作成時に指定されたすべてのアベイラビリティーゾーンにプロビジョニングされます。これらのエンドポイントを作成、表示、変更、および削除できます。
+ レプリケーション設定の RDS DB インスタンスの場合、リードレプリカではなく、ライター DB インスタンスにのみプロキシを関連付けることができます。
+ RDS Proxy は、データベースと同じ仮想プライベートクラウド (VPC) 内に存在する必要があります。プロキシにはパブリックにアクセスできませんが、データベースにはパブリックにアクセスできます。例えば、ローカルホストでデータベースをプロトタイプ化する場合、プロキシへの接続を許可するために必要なネットワーク要件を設定しない限り、プロキシに接続することはできません。これは、ローカルホストがプロキシの VPC の外側にあるためです。
+  `dedicated` に設定されたテナンシーを含む VPC では、RDS Proxy を使用できません。
+  `Enforce Mode` が有効になっている暗号化コントロールを持つ VPC では RDS Proxy を使用できません。
+ IPv6 エンドポイントネットワークタイプの場合は、IPv6 のみをサポートするように VPC とサブネットを設定します。IPv4 と IPv6 の両方のターゲット接続ネットワークタイプで、デュアルスタックモードをサポートするように VPC とサブネットを設定します。
+ IAM 認証が有効になっている RDS DB インスタンスで RDS Proxy を使用する場合、プロキシは、IAM 認証または Secrets Manager に保存されている認証情報を使用してデータベースに接続できます。プロキシに接続するクライアントは、IAM 認証情報を使用して認証する必要があります。設定手順の詳細については、「[RDS Proxy のデータベース認証情報の設定](rds-proxy-secrets-arns.md)」および「[RDS Proxy の IAM 認証の設定](rds-proxy-iam-setup.md)」を参照してください。
+  SSL ホスト名の検証を使用するときは、カスタム DNS で RDS Proxy を使用することができません。
+  各プロキシは、1 つのターゲット DB インスタンスに関連付けることができます。ただし、同じ DB インスタンスに複数のプロキシを関連付けることができます。
+ ステートメントのテキストサイズが 16 KB を超える場合、プロキシはセッションを現在の接続に固定します。
+ 特定のリージョンには、プロキシを作成する際に考慮すべきアベイラビリティーゾーン (AZ) の制限があります。米国東部 (バージニア北部) リージョンは、`use1-az3` アベイラビリティーゾーンで RDS Proxy サポートしていません。米国西部 (北カリフォルニア) リージョンは、`usw1-az2` アベイラビリティーゾーンで RDS プロキシをサポートしていません。プロキシの作成時にサブネットを選択するときは、上記のアベイラビリティーゾーンのサブネットを選択しないようにしてください。
+ 現在、RDS プロキシはグローバル条件コンテキストキーをサポートしていません。

  グローバル条件コンテキストキーの詳細については、「IAM ユーザーガイド**」の「[AWS グローバル条件コンテキストキー](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)」を参照してください。
+ RDS Custom for SQL Server で RDS Proxy を使用することはできません。
+ データベースパラメータグループの変更をプロキシに反映するには、変更をすぐに適用することを選択した場合でも、インスタンスの再起動が必要です。クラスターレベルのパラメータには、クラスター全体の再起動が必要です。
+ プロキシターゲットを登録すると、プロキシによって `rdsproxyadmin` DB ユーザーが自動的に作成されます。これは、プロキシ機能に不可欠な保護されたユーザーです。`rdsproxyadmin` ユーザーの改ざんは、いかなる権限においても、避けてください。`rdsproxyadmin` ユーザーやそのアクセス許可を削除または変更すると、アプリケーションへのプロキシが完全に利用できなくなる可能性があります。

以下のセクションに各 DB エンジンに関するその他の制限事項については、以下のセクションを参照してください。
+ [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 には、以下の追加制限が適用されます。
+  現在、すべてのプロキシはポート 3306 で MariaDB をリッスンします。プロキシは引き続き、データベース設定で指定したポートを使用してデータベースに接続します。
+ RDS Proxy は、Amazon EC2 インスタンスのセルフマネージド MariaDB データベースでは使用できません。
+ DB パラメータグループが `1` に設定された `read_only` パラメータを含む RDS for MariaDB DB インスタンスでは、RDS Proxy を使用できません。
+ 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 プロキシがデータベース接続を多重化する場合に発生する可能性があります。詳細については、「[RDS Proxy の概念](rds-proxy.howitworks.md#rds-proxy-overview)」を参照してください。
+ RDS Proxy は現在、MariaDB で `ClientPasswordAuthType` の `caching_sha2_password` オプションをサポートしていません。

**重要**  
 MariaDB データベースに関連付けられているプロキシの場合、初期化クエリで設定パラメータ `sql_auto_is_null` を `true` または 0 以外の値に設定しないでください。その場合、アプリケーションの動作が正常でなくなる場合があります。

### RDS for Microsoft SQL Server の追加の制限事項
<a name="rds-proxy.limitations-ms"></a>

 Microsoft SQL Server データベースを使用した RDS Proxy には、以下の追加制限が適用されます。
+ プロキシ用に作成する必要がある Secrets Manager シークレットの数は、DB インスタンスが使用する照合順序によって異なります。例えば、DB インスタンスが大文字と小文字を区別する照合順序を使用しているとします。アプリケーションが「Admin」と「admin」の両方を受け入れる場合、プロキシには 2 つの別々のシークレットが必要です。SQL Server Agent の詳細については、[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 プロキシは初期化クエリを実行しません。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 DB インスタンスをサポートしていません。**
+ RDS Proxy は、メジャーバージョンの **SQL Server 2014 で実行される RDS for SQL Server DB インスタンスをサポートしていません。
+ RDS Proxy は、1 つの TLS レコードで複数のレスポンスメッセージを処理できないクライアントアプリケーションをサポートしていません。
+ RDS Proxy は、RDS for SQL Server のエンドツーエンドの IAM 認証をサポートしていません。

### 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 リードレプリカの詳細については、[MySQL バグレポート](https://bugs.mysql.com/bug.php?id=116860&thanks=4)を参照してください。
+ 現在、すべてのプロキシはポート 3306 で MySQL をリッスンします。プロキシは引き続き、データベース設定で指定したポートを使用してデータベースに接続します。
+  RDS Proxy は、EC2 インスタンスのセルフマネージド MySQL データベースでは使用できません。
+  DB パラメータグループが `1` に設定された `read_only` パラメータを含む RDS for MySQL DB インスタンスでは、RDS Proxy を使用できません。
+ RDS Proxy は MySQL の圧縮モードをサポートしていません。例えば、`mysql` コマンドの `--compress` オプションや `-C` オプションで使用される圧縮はサポートされていません。
+ RDS プロキシが同じデータベース接続を再利用して別のクエリを実行すると、`GET DIAGNOSTIC` コマンドを処理するデータベース接続が不正確な情報を返すことがあります。これは、RDS プロキシがデータベース接続を多重化する場合に発生する可能性があります。
+ `SET LOCAL` など、一部の SQL ステートメントと関数は、ピニングを起こさずに接続状態を変更できます。固定の最新の動作については、「[RDS Proxy の固定の回避](rds-proxy-pinning.md)」を参照してください。
+ マルチステートメントクエリでの `ROW_COUNT()` 関数の使用はサポートされていません。
+ RDS Proxy は、1 つの TLS レコードで複数のレスポンスメッセージを処理できないクライアントアプリケーションをサポートしていません。
+ RDS Proxy は MySQL デュアルパスワードをサポートしていません。
+ セッション状態変数を設定するように RDS DB パラメータグループの `init_connect` パラメータを設定すると、RDS Proxy が期待どおりに動作しない場合があります。代わりに、プロキシを使用してデータベースに接続する際に、セッション初期化ステートメントを実行するように、プロキシの初期化クエリを設定します。

**重要**  
 MySQL データベースに関連付けられているプロキシの場合、初期化クエリで設定パラメータ `sql_auto_is_null` を `true` または 0 以外の値に設定しないでください。その場合、アプリケーションの動作が正常でなくなる場合があります。

### RDS for PostgreSQL の追加の制限事項
<a name="rds-proxy.limitations-pg"></a>

 RDS for PostgreSQL データベースを使用した RDS Proxy には、以下の追加制限が適用されます。
+ RDS Proxy は PostgreSQL のセッション固定フィルターをサポートしていません。
+  現在、すべてのプロキシはポート 5432 で PostgreSQL をリッスンします。
+ PostgreSQL の場合、RDS Proxy は現在、`CancelRequest` を発行してクライアントからのクエリのキャンセルをサポートしていません。これは例えば、インタラクティブな psql セッションで長時間実行されるクエリを、Ctrl\$1C を使用してキャンセルする場合に相当します。
+  PostgreSQL 関数 [lastval](https://www.postgresql.org/docs/current/functions-sequence.html) の結果は必ずしも正確ではありません。回避策としては、[INSERT](https://www.postgresql.org/docs/current/sql-insert.html) ステートメントを `RETURNING` 句と共に使用します。
+ RDS Proxy は現在、ストリーミングレプリケーションモードをサポートしていません。
+ RDS for PostgreSQL 16 では、`scram_iterations` 値の変更は、プロキシとデータベース間の認証プロセスにのみ影響します。具体的には、`ClientPasswordAuthType` を `scram-sha-256` に設定した場合、`scram_iterations` 値に加えられたカスタマイズは、クライアントとプロキシ間のパスワード認証に影響しません。代わりに、クライアントとプロキシ間のパスワード認証の反復値は 4096 に固定されます。
+ RDS Proxy が機能するには、デフォルトの `postgres` データベースが RDS for PostgreSQL インスタンスに存在する必要があります。アプリケーションが異なるデータベースを使用している場合でも、このデータベースを削除しないでください。
+ `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 を使用することで最大の利点を得られる DB インスタンス、クラスター、およびアプリケーションを判別できます。そのためには、以下の要因を考慮します。
+  「接続が多すぎます」エラーが頻繁に発生する DB インスタンスは、プロキシと関連付けることをお勧めします。これは多くの場合、`ConnectionAttempts` CloudWatch メトリクスの値が高いことが特徴です。プロキシを使用すると、アプリケーションは多数のクライアント接続を開くことができます。一方、プロキシは DB インスタンスへの長続きする接続の数をより少なく管理します。
+  より小さい AWS インスタンスクラス (T2 や T3 など) を使用する DB インスタンスの場合、プロキシを使用すると、メモリ不足状態を回避できます。また、接続を確立するための CPU オーバーヘッドを削減することもできます。メモリ不足状態は、多数の接続を処理するときに発生する場合があります。
+  Amazon CloudWatch の特定のメトリクスをモニタリングして、DB インスタンスが特定のタイプの制限に近づいているかどうかを判断できます。これらの制限は、接続数や接続管理関連のメモリに適用されます。また、特定の CloudWatch メトリクスをモニタリングすることで、DB インスタンスが、多数の存続期間の短い接続を処理しているかどうかも判断できます。このような接続を開いたり閉じたりすると、データベースにパフォーマンスのオーバーヘッドが生じる可能性があります。モニタリングするメトリクスの詳細については、「[Amazon CloudWatch を使用した RDS Proxy メトリクスのモニタリングCloudWatch を使用した RDS Proxy のモニタリング](rds-proxy.monitoring.md)」を参照してください。
+  AWS Lambda 関数も、プロキシの使用に適しています。これらの関数で頻繁に行う短いデータベース接続は、RDS Proxy の接続プールを使用することで利点を得られます。Lambda アプリケーションコードでデータベース認証情報を管理する代わりに、Lambda 機能に設定済みの IAM 認証を利用できます。
+  通常、多数のデータベース接続を開いたり閉じたりし、また、接続プーリング機構が組み込まれていないアプリケーションは、プロキシの使用に適しています。
+  長期にわたって多数の接続を開いたままにするアプリケーションは、通常、プロキシの使用に適しています。SaaS (サービスとしてのソフトウェア) や e コマースなどの業界のアプリケーションは、接続を開いたままにしておくことで、データベースリクエストのレイテンシーを最小化できる場合があります。RDS Proxy を使用すると、アプリケーションは、DB インスタンスに直接接続する場合よりも多くの接続を開いたままにできます。
+  IAM 認証や Secrets Manager は設定が複雑であるという理由で、すべての DB インスタンスには導入されていない場合があります。プロキシは、特定のアプリケーションのクライアント接続に対して認証ポリシーを適用できます。Lambda アプリケーションコードでデータベース認証情報を管理する代わりに、Lambda 機能に設定済みの IAM 認証を利用できます。
+  RDS Proxy は、データベース障害に対してアプリケーションの回復力と透過性を高めるのに役立ちます。RDS Proxy はドメインネームシステム (DNS) キャッシュをバイパスすることで、Amazon RDS マルチ AZ DB インスタンス のフェイルオーバー時間を最大 66% 短縮できます。また、RDS Proxy は、アプリケーション接続を維持したまま、新しいデータベースインスタンスにトラフィックを自動的にルーティングします。これにより、アプリケーションに対して透明性の高いフェイルオーバーを行うことができます。

# RDS Proxy の概念と用語
<a name="rds-proxy.howitworks"></a>

 RDS Proxy を使用すると、Amazon RDS DB インスタンス の接続管理をシンプルにできます。

 RDS Proxy は、クライアントアプリケーションとデータベースとの間のネットワークトラフィックを処理します。これを行うアクティブな方法として、まず、データベースプロトコルを確認します。次に、その動作をアプリケーションからの SQL オペレーションとデータベースからの結果セットに基づいて調整します。

 RDS Proxy により、データベースの接続管理から発生するメモリと CPU のオーバーヘッドが減ります。アプリケーション接続を同時に開く数が多いほど、データベースに必要なメモリと CPU リソースが少なくなります。また、アプリケーションの接続を閉じてから長いアイドル状態の後でアプリケーションを再度開くためのロジックは不要です。同様に、データベース問題の発生時に接続を再確立するために必要なアプリケーションロジックも減ります。

 RDS Proxy のインフラストラクチャは可用性が高く、複数のアベイラビリティーゾーン (AZ) にデプロイできます。RDS Proxy の計算、メモリ、およびストレージは、RDS DB インスタンスから独立しています。この分離によって、データベースサーバーのオーバーヘッドが減り、そのリソースをデータベースワークロードの処理に集中させることができます。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 コンソールの [**プロキシ**] ページに表示されます。

各プロキシは、単一の RDS DB インスタンスへの接続を処理します。プロキシは、RDS のマルチ AZ DB インスタンスまたはクラスター で、現在のライターインスタンスを自動的に判別します。

 プロキシで開いたままにしてデータベースアプリケーションで使用できるようにした接続は、*接続プール*を形成します。

 デフォルトでは、RDS Proxy はセッション内の各トランザクションの後で接続を再利用できます。このトランザクションレベルの再利用は、*多重化*と呼ばれます。RDS Proxy が接続を接続プールから一時的に削除して再利用する場合、そのオペレーションは、接続の*借用*と呼ばれます。この再利用が安全であれば、RDS Proxy はその接続を接続プールに返します。

 場合によっては、RDS Proxy は、現在のセッションの外でデータベース接続を再利用しても安全であると判断できません。このような場合、セッションが終了するまで、セッションは同じ接続で維持されます。このフォールバック動作は、*固定*と呼ばれます。

プロキシにはデフォルトのエンドポイントがあります。Amazon RDS DB インスタンスを使用する場合は、このエンドポイントに接続します。インスタンス に直接接続する読み取り/書き込みエンドポイントに接続する代わりに、この操作を行います。RDS DB クラスターの場合、追加の読み取り/書き込みエンドポイントと読み取り専用エンドポイントを作成することもできます。詳細については、「[プロキシエンドポイントの概要](rds-proxy-endpoints.md#rds-proxy-endpoints-overview)」を参照してください。

 例えば、接続プールを使用しなくても、読み取り/書き込み接続に、引き続きクラスターエンドポイントを使用できます。負荷分散された読み取り専用接続に、引き続きリーダーエンドポイントを使用できます。クラスター内の特定の DB インスタンスの診断やトラブルシューティングに、引き続きインスタンスエンドポイントを使用できます。他の AWS のサービス (AWS Lambda など) を使用して RDS データベースに接続している場合、プロキシエンドポイントを使用するには、接続設定を変更します。例えば、RDS Proxy 機能を利用してプロキシエンドポイントを通じてデータベースにアクセスすることを Lambda 関数に許可するように指定します。

 プロキシごとにターゲットグループがあります。この*ターゲットグループ*は、プロキシが接続できる RDS DB インスタンスを指します。プロキシに関連付けられた RDS DB インスタンスは、そのプロキシの*ターゲット*と呼ばれます。コンソールでプロキシを作成すると、RDS Proxy によって自動的に、対応するターゲットグループも作成され、関連するターゲットが登録されます。

 *エンジンファミリー*は、同じ DB プロトコルを使用する関連データベースエンジンのセットです。作成するプロキシごとにエンジンファミリーを選択します。

## 接続プーリング
<a name="rds-proxy-connection-pooling"></a>

各プロキシは、関連付けられた RDS データベース のライターインスタンスとリーダーインスタンスに対して個別に接続プーリングを実行します。*接続プーリング*は、接続の開閉や、多数の接続を同時に開いたままにすることに伴うオーバーヘッドを削減するための最適化方法です。このオーバーヘッドには、新しい各接続を処理するために必要なメモリも含まれます。また、各接続を閉じて新しい接続を開くため、CPU のオーバーヘッドを伴います。例えば、TLS/SSL (Transport Layer Security/Secure Sockets Layer) のハンドシェイク、認証、ネゴシエーション機能などがあります。接続プーリングは、アプリケーションロジックを簡素化します。同時に開いている接続の数を最小限に抑えるためのアプリケーションコードを記述する必要はありません。

 各プロキシは、接続の多重化も実行します。これは接続の再利用とも呼ばれます。*多重化*により、RDS Proxy は 1 つの基となるデータベース接続を使用して 1 つのトランザクションのすべてのオペレーションを実行します。RDS は、次のトランザクションに別の接続を使用できます。プロキシへの接続は同時に多数を開くことができます。プロキシから DB インスタンスやクラスターへの接続の数はより少なく保持されます。これにより、データベースサーバーでの接続に伴うメモリオーバーヘッドがさらに最小化されます。「接続が多すぎます」エラーが発生する可能性も減ります。

## RDS Proxy のセキュリティ
<a name="rds-proxy-security"></a>

 RDS Proxy は、TLS/SSL や AWS Identity and Access Management (IAM) などの既存の RDS セキュリティメカニズムを使用します。これらのセキュリティ機能の概要については、「[Amazon RDS でのセキュリティ](UsingWithRDS.md)」を参照してください。また、RDS が認証、認可、その他のセキュリティ領域でどのように機能するかについても、よく理解する必要があります。

 RDS Proxy は、クライアントアプリケーションおよび基となるデータベースの間に別のセキュリティ層を追加します。例えば、基になる DB インスタンスが古いバージョンの TLS をサポートしている場合でも、TLS 1.3 を使用してプロキシに接続できます。プロキシがデータベースユーザーとパスワードによる認証方法を使用してデータベースに接続する場合でも、IAM ロールを使用してプロキシに接続できます。この方法により、DB インスタンス自体の高額な移行作業を必要とせずに、データベースアプリケーションに強力な認証要件を適用できます。

RDS Proxy では、次の認証方法を使用できます。
+ **データベースの認証情報**
+ **標準 IAM 認証**
+ **エンドツーエンド IAM 認証**

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

RDS Proxy には、IAM 認証の 2 つの方法があります。
+ **標準 IAM 認証**: プロキシが Secrets Manager に保存されている認証情報を使用してデータベースに接続している間、プロキシへの接続に IAM 認証を適用します。これにより、データベースでパスワードによるネイティブ認証方法が使用されている場合でも、データベースへのアクセスに IAM 認証を適用できます。プロキシは Secrets Manager からデータベース認証情報を取得し、アプリケーションに代わってデータベースへの認証を処理します。
+ **エンドツーエンド IAM 認証**: アプリケーションからプロキシ経由でデータベースに直接接続するための IAM 認証を適用します。エンドツーエンド IAM 認証は、セキュリティ設定を簡素化し、Secrets Manager でのデータベース認証情報管理を回避します。この追加のセキュリティレイヤーは、クライアントアプリケーションからデータベースへの IAM ベースのアクセスコントロールを適用します。

標準 IAM 認証を使用するには、認証に Secrets Manager シークレットを使用するようにプロキシを設定し、クライアント接続の IAM 認証を有効にします。アプリケーションは IAM を使用してプロキシを認証し、プロキシは Secrets Manager から取得した認証情報を使用してデータベースを認証します。

エンドツーエンドの IAM 認証を使用するには、プロキシを作成または変更時にデフォルトの認証スキームを設定するときに、IAM 認証を使用するようにプロキシを設定します。

エンドツーエンド IAM 認証では、プロキシに関連付けられた IAM ロールを更新して、`rds-db:connect` アクセス許可を付与する必要があります。エンドツーエンドの 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` コマンドを実行するときに、`conninfo` 文字列の一部として `sslmode=require` を指定します。

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` でクライアントを使用する場合は、CA を指す `--ssl-ca` を `.pem` 形式で指定します。`.pem` ファイルを使用するには、[Amazon Trust Services](https://www.amazontrust.com/repository/) からすべてのルート CA PEM をダウンロードし、1 つの `.pem` ファイルに配置します。

 RDS Proxy は、ドメインとそのサブドメインの両方に適用されるワイルドカード証明書を使用します。`mysql` クライアントを使用して SSL モード `VERIFY_IDENTITY` で接続する場合、現時点では、MySQL 8.0 互換の `mysql` コマンドを使用する必要があります。

## フェイルオーバー
<a name="rds-proxy-failover"></a>

 *フェイルオーバー*は、元のデータベースインスタンスが使用できなくなったときに、別のインスタンスに置き換える高可用性機能です。フェイルオーバーは、データベースインスタンスの問題が原因で発生することがあります。また、通常のメンテナンス手順の一環として、データベースのアップグレード時などに発生することもあります。フェイルオーバーは、マルチ AZ 設定の RDS DB インスタンスに適用されます。

 プロキシを介して接続すると、データベースのフェイルオーバーに対してアプリケーションの耐障害性が高くなります。元の DB インスタンスが使用できなくなると、RDS Proxy はアイドル状態のアプリケーション接続を切断せずにスタンバイデータベースに接続します。これにより、フェイルオーバープロセスが高速化および簡素化されます。これは、通常の再起動やデータベース問題に伴う停止よりも、アプリケーションの停止が短くなります。

 RDS Proxy を使用していない場合は、フェイルオーバーによって短時間の停止が発生します。停止中は、フェイルオーバー中のデータベースに対して書き込み操作を実行できません。既存のデータベース接続はすべて中断されるため、アプリケーションで接続を再度開く必要があります。利用できなくなった DB インスタンスの代わりに読み取り専用 DB インスタンスが昇格すると、新しい接続および書き込みオペレーションでデータベースが使用可能になります。

 DB フェイルオーバー中、RDS Proxy は引き続き同じ IP アドレスで接続を受け入れ、接続を自動的に新しいプライマリ DB インスタンスに転送します。RDS Proxy を介して接続しているクライアントは、以下の影響を受けません。
+  フェイルオーバー時のドメインネームシステム (DNS) 伝播の遅延。
+  ローカル DNS キャッシュ。
+  接続タイムアウト。
+  どの DB インスタンスが現在のライターであるかの不確実性。
+  接続を閉じずに使用不能になった以前のライターからのクエリ応答の待機。

 アプリケーション独自の接続プールがある場合は、RDS Proxy を経由することで、ほとんどの接続がフェイルオーバーやその他の中断時にも存続します。トランザクションや SQL ステートメントの途中の接続のみがキャンセルされます。RDS Proxy は、すぐに新しい接続を受け入れます。データベースライターが使用できない場合、RDS Proxy は着信リクエストをキューに入れます。

 アプリケーション独自の接続プールがない場合は、RDS Proxy を使用することで、接続速度が高速になり、開いたままの接続の数を増やすことができます。データベースからの頻繁な再接続に伴う高額なオーバーヘッドがオフロードされます。そのために、RDS Proxy 接続プールに保持されているデータベース接続を再利用します。このアプローチは、設定コストが大きい TLS 接続で特に重要です。

## トランザクション
<a name="rds-proxy-transactions"></a>

 1 つのトランザクション内のすべてのステートメントは、常に同じ基となるデータベース接続を使用します。このトランザクションが終了すると、この接続は別のセッションで使用可能になります。トランザクションを粒度の単位として使用すると、次のような結果になります。
+  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) のセットアップと管理を行い、関連するセキュリティオプションを設定します。セキュリティオプションは、各プロキシにアクセスできるユーザーと、各プロキシから DB インスタンスに接続する方法を制御します。

RDS プロキシを初めて使用する場合は、提示されている順序でページに従うことをお勧めします。

**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 DB インスタンスと RDS Proxy の間に、共通の仮想プライベートクラウド (VPC) が必要です。この VPC には、異なるアベイラビリティーゾーンにあるサブネットが 2 つ以上必要です。アカウントは、これらのサブネットを所有することも、他のアカウントと共有することもできます。VPC 共有の詳細については、[共有 VPC の操作](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)を参照してください。

IPv6 をサポートするには、追加のネットワーク設定が必要です。
+ **IPv6 エンドポイントネットワークタイプ** – VPC とサブネットは IPv6 をサポートするように設定する必要があります。これには、VPC とサブネットに IPv6 CIDR ブロックを割り当てることが含まれます。
+ **デュアルスタックエンドポイントネットワークタイプ** – VPC とサブネットは IPv4 と IPv6 の両方のアドレス指定をサポートしている必要があります。
+ **IPv6 ターゲット接続ネットワークタイプ** – プロキシからの IPv6 接続をサポートするには、データベースをデュアルスタックモードに設定する必要があります。

Amazon EC2、Lambda、Amazon ECS などのクライアントアプリケーションリソースは、プロキシと同じ VPC に置くことができます。または、プロキシとは別の VPC に置くこともできます。RDS DB インスタンス に正常に接続できた場合は、既に必要なネットワークリソースが存在します。

**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 アカウント が所有する VPC とサブネットを調べる AWS CLI コマンドを示しています。特に、CLI を使用してプロキシを作成するときは、サブネット ID をパラメータとして渡します。

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

次の Linux の例は、特定の RDS DB インスタンスに対応するサブネット ID を決定する AWS CLI コマンドを示しています。DB インスタンスの 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 は、登録されている DB インスタンスのサイズと数に基づき、必要に応じて自動的に容量を調整します。特定の操作には、登録されたデータベースのサイズの増加や内部 RDS Proxy メンテナンス操作など、プロキシ容量の追加が必要になる場合もあります。これらのオペレーション中、プロキシは追加の容量をプロビジョニングするため、より多くの IP アドレスを必要とする場合があります。これらの追加アドレスによって、ワークロードに影響を与えずにプロキシを拡張できます。サブネットに空き IP アドレスがない場合、プロキシのスケールアップはできません。そのため、クエリの待ち時間が長くなったり、クライアント接続が失敗したりする可能性があります。サブネットに十分な空きの IP アドレスがないと、RDS はイベント `RDS-EVENT-0243` を通じて通知します。このイベントのフィールドの詳細については、「[RDS Proxy イベントの使用RDS Proxy イベントの使用](rds-proxy.events.md)」を参照してください。

**注記**  
RDS Proxy は、VPC 内の各プロキシで 215 個を超える IP アドレスを使用しません。

DB インスタンスクラスのサイズに基づいて、サブネット内に次の最少数の空き IP アドレスをプロキシ用として予約します。


|  DB インスタンスクラス  |  IP アドレスの最小値  | 
| --- | --- | 
|  db.\$1.xlarge 以下   |  10  | 
|  db.\$1.2xlarge   |  15  | 
|  db.\$1.4xlarge   |  25  | 
|  db.\$1.8xlarge   |  45  | 
|  db.\$1.12xlarge   |  60  | 
|  db.\$1.16xlarge   |  75  | 
|  db.\$1.24xlarge   |  110  | 

これらの推奨 IP アドレス数は、デフォルトのエンドポイントのみを使用するプロキシの推定値です。エンドポイントまたはリードレプリカを追加したプロキシには、さらに多くの空き IP アドレスが必要になる場合があります。エンドポイントを追加するたびに、追加で 3 つの IP アドレスを予約することをお勧めします。各リードレプリカに、そのリードレプリカのサイズに基づき、表に指定された IP アドレスを追加で予約することをお勧めします。

# RDS Proxy のデータベース認証情報の設定
<a name="rds-proxy-secrets-arns"></a>

Amazon RDS の RDS Proxy は、AWS Secrets Manager を使用してデータベース認証情報を安全に保存および管理します。アプリケーションに認証情報を埋め込む代わりに、必要な認証の詳細を含む Secrets Manager シークレットにプロキシを関連付けます。RDS DB インスタンスで、プロキシの接続先のデータベースユーザーアカウントごとに個別の Secrets Manager シークレットを作成します。

または、エンドツーエンドの IAM 認証を使用するように RDS Proxy を設定することもできます。これにより、データベース認証情報を Secrets Manager に保存する必要がなくなります。RDS Proxy は、クライアントからプロキシへの接続とプロキシからデータベースへの接続の両方に IAM 認証を使用します。これにより、シークレットやパスワードの管理を必要としない、完全に統合された IAM ベースの認証ソリューションが提供されます。新しい IAM DB ユーザーを追加する方法の詳細については、「[IAM 認証を使用したデータベースアカウントの作成](UsingWithRDS.IAMDBAuth.DBAccounts.md)」を参照してください。

**Topics**
+ [

## RDS Proxy で使用するシークレットの作成
](#rds-proxy-secrets-create)

## RDS Proxy で使用するシークレットの作成
<a name="rds-proxy-secrets-create"></a>

プロキシを作成する前に、まずデータベース認証情報を保存するシークレットを少なくとも 1 つ作成する必要があります。

### コンソール
<a name="rds-proxy-secrets-create-console"></a>

**シークレットを作成する**

1. Secrets Manager のコンソール ([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 は DB インスタンスの照合設定に関係なく、Secrets Manager で大文字と小文字を区別するシークレットが必要です。アプリケーションで「Admin」や「admin」などの大文字と小文字が異なるユーザー名が許可されている場合は、それぞれに個別のシークレットを作成する必要があります。RDS Proxy は、クライアントとプロキシ間の大文字と小文字を区別しないユーザー名認証をサポートしていません。  
SQL Server Agent の詳細については、[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 ユーザーガイド*」の「[Create an AWS Secrets Manager secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)」を参照してください。

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

AWS CLI を通じてプロキシを作成する場合、対応するシークレットの Amazon リソースネーム (ARN) を指定します。プロキシがアクセスできるすべての DB ユーザーアカウントに対し、同じように操作します。AWS マネジメントコンソール では、シークレットをそのわかりやすい名前を使用して選択します。
+ RDS Proxy で使用する Secrets Manager シークレットを作成するには、[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":"*"
        }
      ]
  }'
  ```

 例えば、以下のコマンドは、2 つのデータベースユーザーの 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 を使用してプロキシを作成する場合、1 つ以上のシークレットの Amazon リソースネーム (ARN) を `--auth` パラメータに渡します。次の例は、AWS アカウントが所有する各シークレットの名前と ARN のみを含むレポートを準備する方法を示しています。この例では、`--output table` バージョン 2 で使用可能な AWS CLI パラメータを使用します。AWS CLI バージョン 1 を使用している場合は、代わりに `--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 ポリシーを作成して設定します。

このトピックでは、必要な IAM ポリシーの作成や IAM ロールへのアタッチなど、RDS Proxy の IAM 認証を設定する手順について説明します。

**ヒント**  
この手順は、独自の IAM ロールを作成する場合にのみ必要です。それ以外の場合は、プロキシの設定時に RDS が自動的に必要なロールを作成するため、これらのステップをスキップできます。

## 前提条件
<a name="rds-proxy-iam-setup-prereqs"></a>

RDS Proxy の IAM 認証を設定する前に、以下があることを確認してください。
+ **AWS Secrets Manager** – データベース認証情報を含む少なくとも 1 つの保存済みシークレット。シークレットの作成手順については、「[RDS Proxy のデータベース認証情報の設定](rds-proxy-secrets-arns.md)」を参照してください。

  これはエンドツーエンドの IAM 認証を使用している場合は必要ありません。
+ **IAM アクセス許可** – AWS Secrets Manager で IAM ポリシー、ロール、シークレットを作成および管理するためのアクセス許可を持つ IAM ロールまたはユーザー。

## エンドツーエンドの IAM 認証用の IAM ポリシーの作成
<a name="rds-proxy-iam-setup-e2e-steps"></a>

エンドツーエンドの IAM 認証を使用する場合、RDS Proxy は Secrets Manager から認証情報を取得するのではなく、IAM 認証を使用してデータベースに接続します。これには、プロキシで使用するデータベースアカウントの `rds-db:connect` アクセス許可を持つ IAM ロールを設定する必要があります。

IAM を使用して RDS Proxy をデータベースに対して認証するには、必要なデータベース接続許可を付与するポリシーを持つ IAM ロールを作成します。

### コンソール
<a name="rds-proxy-iam-e2e-console"></a>

**プロキシを使用してエンドツーエンドの IAM 認証用のロールを作成するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. ロールに対するアクセス許可ポリシーを作成します。一般的な手順については、「[IAM ポリシーを作成する (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)」を参照してください。

   このポリシーを JSON エディタに貼り付け、以下の変更を行います。
   + 自分のアカウント ID に置き換えます。
   + `us-east-2` をプロキシが存在する必要のある場所に置き換えます。
   + データベースリソース ID とユーザー名を、使用するものに置き換えます。リソース ID の形式は、RDS インスタンスと 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"
            ]
        }
    ]
}'
```

エンドツーエンドの IAM 認証用に設定された IAM ロールとアクセス許可を使用して、`DefaultAuthScheme` を `IAM_AUTH` に設定してプロキシを作成できるようになりました。このプロキシは、Secrets Manager シークレットを必要とせずに、IAM を使用してデータベースに直接認証します。手順については、「[Amazon RDS のプロキシの作成](rds-proxy-creating.md)」を参照してください。

エンドツーエンドの IAM 認証を使用する場合は、「[IAM 認証を使用したデータベースアカウントの作成](UsingWithRDS.IAMDBAuth.DBAccounts.md)」で説明されているように、データベースユーザーが IAM 認証用に設定されていることを確認します。

## 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 マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

1. ロールに対するアクセス許可ポリシーを作成します。一般的な手順については、「[IAM ポリシーを作成する (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)」を参照してください。

   このポリシーを JSON エディタに貼り付け、以下の変更を行います。
   + 自分のアカウント ID に置き換えます。
   + `us-east-2` をプロキシが存在するリージョンに置き換えます。
   + シークレット名を、作成したシークレット名に置き換えます。詳細については、「[Specifying KMS keys in IAM policy statements](https://docs.aws.amazon.com/kms/latest/developerguide/cmks-in-iam-policies.html)」を参照してください。
   + Secrets Manager シークレットの暗号化に使用した KMS キー 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 サーバー、RDS for MySQL、RDS for PostgreSQL DB の各インスタンスに関連付けることができます。

## コンソール
<a name="rds-proxy-creating.console"></a>

**プロキシを作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**プロキシ**] を選択します。

1. [**Create proxy (プロキシの作成)**] を選択します。

1. プロキシについて次の設定を行います。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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)」を使用して、ID を検索する方法の例を参照してください。

**注記**  
セキュリティグループは、プロキシの接続先のデータベースへのアクセスを許可する必要があります。同じセキュリティグループが、アプリケーションからプロキシへのイングレスと、プロキシからデータベースへのエグレスに使用されます。例えば、データベースとプロキシに同じセキュリティグループを使用するとします。この場合は必ず、そのセキュリティグループ内のリソースが同じセキュリティグループ内の他のリソースと通信できるように指定してください。  
共有 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 Proxy を作成するには、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 DB インスタンスを関連付けます。

**重要**  
デフォルトの認証スキームに **[IAM 認証]** を選択する場合。  
プロキシが正常に接続する前に、ターゲットデータベースインスタンスまたはクラスターで IAM データベース認証を有効にする必要があります。
**[IAM ロールを作成]** を選択した場合、**[IAM 認証用のデータベースアカウント]** が必要です。
既存の IAM ロールを選択した場合、コンソールはデータベース接続許可でロールを自動的に更新しません。ロールに必要な `rds-db:connect` アクセス許可があることを確認します。

# プロキシの表示
<a name="rds-proxy-viewing"></a>

 1 つ以上の RDS プロキシを作成したら、AWS マネジメントコンソール、AWS CLI、または RDS API でそれらを表示および管理できます。設定の詳細の確認、パフォーマンスのモニタリング、必要に応じて変更または削除するプロキシの決定が可能です。

データベースアプリケーションがプロキシを介してトラフィックをルーティングできるようにするには、接続文字列にプロキシエンドポイントを指定する必要があります。

## コンソール
<a name="rds-proxy-viewing.console"></a>

**コンソールでプロキシを表示するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**プロキシ**] を選択します。

1. プロキシ名を選択して詳細を表示します。

1. 詳細ページの **[ターゲットグループ]** セクションに、プロキシが特定の RDS DB インスタンスにどのようにリンクされているかが表示されます。デフォルトのターゲットグループページに移動すると、プロキシの作成時に定義された設定など、この関連付けの詳細を表示できます。この設定には、最大接続数の割合 (%)、接続借用タイムアウト、エンジンファミリー、セッション固定フィルタが含まれます。

## 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 DB インスタンスの詳細を表示するには、[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 DB クラスターを表示するには、[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 DB インスタンスに接続する方法は、一般に同じです。詳細については、「[プロキシエンドポイントの概要](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 認証を使用する場合、クライアントとプロキシ間の認証には 2 つのオプションがあります。
+ 通常のユーザー名とパスワードで認証するようにデータベースユーザーを設定します。RDS Proxy は、Secrets Manager からユーザー名とパスワードの認証情報を取得します。RDS Proxy から基礎となるデータベースへの接続は IAM を経由しません。
+ また、エンドツーエンドの IAM 認証を使用することもできます。これは、データベース認証情報を必要とせずに IAM を使用してプロキシを介してデータベースに接続します。

 IAM 認証を使用して RDS Proxy に接続するには、RDS DB インスタンスとの IAM 認証と同じ一般的な接続手順で行います。IAM の使用に関する一般情報については、「[Amazon RDS でのセキュリティ](UsingWithRDS.md)」を参照してください。エンドツーエンドの IAM 認証を使用している場合は、DB ユーザーに IAM 認証プラグインを提供します。「[IAM 認証を使用したデータベースアカウントの作成](UsingWithRDS.IAMDBAuth.DBAccounts.md)」を参照してください。

 RDS Proxy での IAM の使用方法の主な違いは以下のとおりです。
+ 標準の IAM 認証では、データベースユーザーはデータベース内で通常の認証情報を持ちます。これらのユーザー名とパスワードを含む Secrets Manager シークレットを設定し、RDS Proxy に Secrets Manager からの認証情報の取得を認可します。IAM 認証がクライアントプログラムとプロキシ間の接続に適用されます。その後、プロキシは、Secrets Manager から取得したユーザー名とパスワードの認証情報を使用して、データベースに対して認証します。
+ エンドツーエンドの IAM 認証では、データベース認証情報用に Secrets Manager シークレットを設定する必要はありません。IAM 認証は、クライアントからプロキシへの接続とプロキシからデータベースへの接続に適用されます。
+ インスタンス、クラスター、またはリーダーの各エンドポイントの代わりに、プロキシエンドポイントを指定します。プロキシエンドポイントの詳細については、「[IAM 認証を使用した DB インスタンスへの接続](UsingWithRDS.IAMDBAuth.Connecting.md)」を参照してください。
+ IAM 認証を使用してプロキシに接続する場合は、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>

RDS Proxy に接続するための新しい PostgreSQL データベースユーザーを作成する場合は、データベースに対するユーザー `CONNECT` 権限を付与してください。これがないと、ユーザーは接続を確立できません。詳細については、「[RDS Proxy を使用する場合に PostgreSQL データベースに新しいデータベースユーザーを追加する](rds-proxy-new-db-user.md#rds-proxy-new-db-user-pg)」を参照してください。

クライアントが PostgreSQL データベースへの接続をスタートする際は起動メッセージを送信します。このメッセージには、パラメータ名と値の文字列のペアが含まれています。詳細については、PostgreSQL ドキュメントの「[PostgreSQL Message Formats](https://www.postgresql.org/docs/current/protocol-message-formats.html)」で `StartupMessage` を参照してください。

RDS Proxy を介して接続する場合、起動メッセージには、現在認識されている以下のパラメータを含めることができます。
+  `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 ドキュメントの「[Frontend/Backend Protocol](https://www.postgresql.org/docs/current/protocol.html)」を参照してください。

 PostgreSQL では、JDBC を使用する場合、ピニングを回避するために以下の操作をお勧めします。
+ 固定を回避するために、JDBC 接続パラメータ `assumeMinServerVersion` を `9.0` 以上に設定します。これにより、JDBC ドライバーが `SET extra_float_digits = 3` を実行するとき、接続の始動時に余分なラウンドトリップを実行しなくなります。
+ 固定を回避するために、JDBC 接続パラメータ `ApplicationName` を `any/your-application-name` に設定します。これを行うと、JDBC ドライバーが `SET application_name = "PostgreSQL JDBC Driver"` を実行するとき、接続のスタートアップ中に余分なラウンドトリップを実行しなくなります。JDBC パラメータは `ApplicationName` ですが、PostgreSQL `StartupMessage` パラメータは `application_name` です。

詳細については、「[RDS Proxy の固定の回避](rds-proxy-pinning.md)」を参照してください。JDBC を使用した接続の詳細については、PostgreSQL ドキュメントの「[Connecting to the Database](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)
+ [

# RDS Proxy の標準 IAM 認証からエンドツーエンドの 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>

**重要**  
**クライアント認証タイプ**と **IAM 認証フィールド**の値は、このプロキシに関連付けられているすべての Secrets Manager シークレットに適用されます。シークレットごとに異なる値を指定するには、代わりに AWS CLI または API を使用してプロキシを変更します。

**プロキシの設定を変更するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、[**プロキシ**] を選択します。

1.  プロキシのリストで、設定を変更するプロキシを選択するか、その詳細ページに移動します。

1.  [**アクション**]、[**変更**] の順に選択します。

1.  変更するプロパティを入力または選択します。次を変更できます。
   +  **プロキシ識別子** - プロキシの名前を変更するには、新しい識別子を入力します。
   +  **アイドル状態のクライアント接続のタイムアウト** - アイドル状態のクライアント接続のタイムアウトの時間を入力します。
   +  **IAM ロール** - Secrets Manager からシークレットを取得するために使用する IAM ロールを変更します。
**注記**  
**[デフォルト認証スキーム]** を **[IAM 認証]** に設定した場合、新しい IAM ロールを作成することはできません。
   +  **Secrets Manager シークレット** - Secrets Manager シークレットを追加または削除します。これらのシークレットは、データベースのユーザー名とパスワードに対応します。
   +  **クライアント認証タイプ** – プロキシへのクライアント接続の認証タイプを変更します。
   +  **IAM 認証** - プロキシへの接続に IAM 認証をすることを要求または禁止します。
   +  **デフォルト認証スキーム** – プロキシへのクライアント接続とプロキシから基になるデータベースへの接続にプロキシが使用するデフォルトの認証スキームを変更します。
   +  **Transport Layer Security が必要** - Transport Layer Security (TLS) の要件を有効または無効にします。
   +  **VPC セキュリティグループ** - プロキシで使用する VPC セキュリティグループを追加または削除します。
   +  **拡張されたログ記録を有効にする** - 拡張ログ記録を有効または無効にします。

1.  [**変更**] を選択します。

変更する設定がリストにない場合は、以下の手順を使用して、プロキシのターゲットグループを更新します。プロキシに関連付けられている*ターゲットグループ*は、物理データベース接続に関連する設定を制御します。プロキシごとに `default` という名前の 1 つのターゲットグループが関連付けられています。このターゲットグループはプロキシと共に自動的に作成されます。デフォルトのターゲットグループの名前を変更することはできません。

 ターゲットグループは、プロキシの詳細ページからのみ変更できます。[**プロキシ**] ページのリストから変更することはできません。

**プロキシのターゲットグループの設定を変更するには**

1.  [**プロキシ**] ページから、プロキシの詳細ページに移動します。

1.  [**ターゲットグループ**] で、`default` リンクを選択します。現在、すべてのプロキシには `default` という名前のターゲットグループが 1 つ あります。

1.  [**デフォルト**] ターゲットグループの詳細ページで、[**変更**] を選択します。

1.  変更できるプロパティに対して新しい設定を選択します。
   +  **データベース** - 別の RDS DB インスタンスまたはクラスター を選択します。
   +  **接続プールの最大接続数** - プロキシで使用できる最大接続数の割合 (%) を調整できます。
   +  **セッション固定フィルター** - (オプション) セッション固定フィルタを選択します。これにより、クライアント接続間でデータベース接続を多重化するというデフォルトの安全対策が回避されます。現在、設定は PostgreSQL についてはサポートされていません。唯一の選択肢は `EXCLUDE_VARIABLE_SETS` です。

     この設定を有効にすると、ある接続のセッション変数が他の接続に影響を与える可能性があります。これにより、クエリが現在のトランザクション以外に設定されたセッション変数値に依存している場合、エラーや正確性の問題が発生する可能性があります。アプリケーションがクライアント接続間でデータベース接続を共有しても安全であることを確認した後に、このオプションの使用を検討してください。

     以下のパターンは安全だと考えられます。
     + 有効なセッション変数値に変更がない、つまりセッション変数に変更がない `SET` ステートメント。
     + セッション変数の値を変更し、同じトランザクションでステートメントを実行します。

     詳細については、「[RDS Proxy の固定の回避](rds-proxy-pinning.md)」を参照してください。
   +  **接続借用タイムアウト** - 接続借用タイムアウト間隔を調整します。この設定は、プロキシで最大数の接続が既に使用されている場合に適用されます。この設定により、プロキシがタイムアウトエラーを返す前に、接続が使用可能になるまで待つ時間が決まります。
   + **初期化クエリ**。(オプション) 初期化クエリを追加するか、現在のクエリを変更します。新しい各データベース接続を開くときに実行するプロキシ用の 1 つ以上の SQL ステートメントを指定できます。設定は通常、各接続の設定が同一であることを確認するために、`SET` ステートメントとともに使用されます。追加するクエリが有効であることを確認します。1 つの `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` という名前のターゲットグループが 1 つ あります。このターゲットグループを使用する場合、プロキシの名前とターゲットグループ名 (`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` コマンドでは、ターゲットグループを通じてプロキシが関連付けられている RDS DB インスタンス を変更します。現在、各プロキシが接続できる RDS DB インスタンスは 1 つです。ターゲットグループは、マルチ AZ 設定のすべての RDS DB インスタンスの接続の詳細を追跡します。

 次の例では、`cluster-56-2020-02-25-1399` という名前の Aurora MySQL クラスターに関連付けられているプロキシを初期に使用します。次に、このプロキシを変更して `provisioned-cluster` という名前の別のクラスターに接続できるようにします。

 RDS DB インスタンスを使用する場合は、`--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 を使用してプロキシを変更するには、[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` という名前のターゲットグループが 1 つ あります。このターゲットグループを使用する場合、プロキシの名前とターゲットグループ名 (`default`) を指定します。デフォルトのターゲットグループの名前を変更することはできません。

 `DeregisterDBProxyTargets` および `RegisterDBProxyTargets` では、ターゲットグループを通じてプロキシが関連付けられる RDS DB インスタンスを変更します。現在、各プロキシが接続できる RDS DB インスタンス は 1 つです。ターゲットグループは、マルチ AZ 設定の RDS DB インスタンス の接続の詳細を追跡します。

# RDS Proxy の使用時に新しいデータベースユーザーを追加する
<a name="rds-proxy-new-db-user"></a>

状況に応じて、プロキシに関連付けられている RDS DB インスタンス に新しいデータベースユーザーを追加できます。Secrets Manager シークレットで標準認証を使用しているか、エンドツーエンドの IAM 認証を使用しているかに応じて続行します。

標準の 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 シークレットに保存されている認証情報を更新します。

エンドツーエンドの IAM 認証を使用している場合は、データベースユーザーを作成し、IAM アクセス許可を設定する必要があります。これを行うには、次のステップを実行します。

1. 認証に使用する IAM ユーザーまたはロール名と一致する新しいデータベースユーザーをデータベースに作成します。

1. データベースユーザーがデータベースで IAM 認証プラグインを使用して設定されていることを確認します。「[IAM 認証を使用したデータベースアカウントの作成](UsingWithRDS.IAMDBAuth.DBAccounts.md)」を参照してください。

1. 「[エンドツーエンドの IAM 認証用の IAM ポリシーの作成](rds-proxy-iam-setup.md#rds-proxy-iam-setup-e2e-steps)」で説明されているように、IAM ユーザーまたはロールに `rds-db:connect` アクセス許可を付与するように IAM ポリシーを更新します。

1. デフォルトの認証スキームとして IAM 認証を使用するようにプロキシが設定されていることを確認します。

エンドツーエンドの IAM 認証では、クライアントからプロキシ、プロキシからデータベースへの認証に IAM 認証情報が使用されるため、Secrets Manager シークレットでデータベース認証情報を管理する必要はありません。

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

状況に応じて、プロキシに関連付けられている RDS DB インスタンス のデータベースユーザーのパスワードを変更できます。その場合は、対応する Secrets Manager シークレットを新しいパスワードで更新します。

エンドツーエンドの IAM 認証を使用している場合は、Secrets Manager シークレットのパスワードを更新する必要はありません。

# RDS Proxy の標準 IAM 認証からエンドツーエンドの IAM 認証への移行
<a name="rds-proxy-iam-migration"></a>

 現在 RDS Proxy の標準 IAM 認証を使用している場合、クライアントは IAM を使用してプロキシを認証し、プロキシはシークレットを使用してデータベースに接続するため、クライアントからプロキシへの接続とプロキシからデータベースへの接続の両方が IAM 認証を使用するエンドツーエンドの IAM 認証に移行できます。

**エンドツーエンド 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 を変更してエンドツーエンドの 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 MariaDB および RDS for MySQL の場合:

   ```
   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 MariaDB および RDS for MySQL の場合:

   ```
   # 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>

プロキシがクライアント接続を閉じるまでの間、接続がアイドル状態を継続できる時間を指定できます。デフォルトは 1,800 秒 (30 分) です。

クライアント接続が*アイドル状態*と見なされるのは、前のリクエストの完了後、新しいリクエストが指定時間内にアプリケーションから送信されない場合です。基となるデータベース接続は開いたままで、接続プールに返されるため、新しいクライアント接続で再利用できます。プロキシで古い接続を事前に削除する場合は、クライアント接続でのアイドル状態のタイムアウトを短くすることを検討してください。ワークロードが頻繁にプロキシとの接続を確立する場合には、接続コストを節約するために、クライアント接続でのアイドル状態のタイムアウトを長くすることを検討してください。

この設定は、RDS コンソール内の **[Idle client connection timeout]** (アイドルクライアントの接続タイムアウト) フィールドと、AWS CLI および API の `IdleClientTimeout` 設定で行います。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 Proxy コンソールの [**接続プールの最大接続数**] フィールド、または AWS CLI と API の `MaxConnectionsPercent` パラメータを使用します。

`MaxConnectionsPercent` 値はターゲットグループが使用する RDS DB インスタンス の `max_connections` 設定に対するパーセンテージで表されます。プロキシは、これらの接続のすべてを事前に作成するわけではありません。この設定では、ワークロードが必要とするときに、プロキシがこれらの接続を確立できます。

例えば、登録済みのデータベースターゲットの `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 は、接続に対するアクティビティが 5 分間なかった場合に、プール内のデータベース接続を*アイドル状態*とみなします。

`MaxIdleConnectionsPercent` 値は、RDS DB インスタンスターゲットグループの `max_connections` 設定のパーセンテージとして表されます。そのデフォルト値は `MaxConnectionsPercent` の 50% で、上限は `MaxConnectionsPercent` の値で指定します。例えば、`MaxConnectionsPercent` が 80 の場合、`MaxIdleConnectionsPercent` のデフォルト値は 40 です。`MaxConnectionsPercent` の値が指定されていない場合、RDS for SQL Server では `MaxIdleConnectionsPercent` は 5 であり、その他すべてのエンジンのデフォルト値は 50 です。

値を大きくすると、プロキシではアイドル状態のデータベース接続の大部分を開いたままにします。値を小さくすると、プロキシではアイドル状態のデータベース接続の大部分を閉じます。ワークロードが予測できない場合は、`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 Proxy コンソールの [**接続借用タイムアウト**] フィールド、または 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 への接続は、クライアント接続と呼ばれます。プロキシからデータベースへの接続はデータベース接続です。RDS Proxy を使用する場合、クライアント接続はプロキシで終了し、データベース接続は RDS Proxy 内で管理されます。

アプリケーション側の接続プーリングは、アプリケーションと RDS Proxy 間で繰り返し接続を確立する回数が減るというメリットを提供します。

アプリケーション側の接続プールを実装する前に、以下の設定について考慮してください。
+ クライアント接続の最大有効期間: RDS Proxy では、クライアント接続の最大有効期間は 24 時間です。この値は設定できません。クライアント接続が予期せず切断されないように、プールは最大接続時間を 24 時間未満に設定してください。
+ クライアント接続アイドルタイムアウト: RDS Proxy は、クライアント接続の最大アイドル時間を適用します。予期せぬ接続の切断を避けるため、RDS Proxy のクライアント接続アイドルタイムアウト設定よりも低い値のアイドル接続タイムアウトをプールに設定します。

アプリケーション側の接続プールに設定されるクライアント接続の最大数は、RDS Proxy の **max\$1connections** 設定に制限される必要はありません。

クライアント接続プールにより、クライアント接続の時間が長くなります。接続にピニングが発生した場合、クライアント接続をプールすると多重化の効率が低下する可能性があります。ピニングされているものの、アプリケーション側の接続プールでアイドル状態のクライアント接続は、引き続きデータベース接続を保持し、そのデータベース接続が他のクライアント接続で再利用されるのを防ぎます。プロキシログを確認して、接続にピニングが発生していないかチェックしてください。

**注記**  
RDS Proxy は、データベース接続が使用されなくなった 24 時間後にその接続を閉じます。プロキシは、アイドル状態の最大接続数の設定値に関係なく、このアクションを実行します。

# RDS Proxy の固定の回避
<a name="rds-proxy-pinning"></a>

 データベースリクエストが以前のリクエストの状態情報に依存しない場合、多重化の効率が高まります。その場合、RDS Proxy は、各トランザクションの終了時に接続を再利用できます。このような状態情報の例には、`SET` ステートメントや `SELECT` ステートメントで変更できるほとんどの可変や設定パラメータが含まれます。クライアント接続の SQL トランザクションでは、デフォルトで、基となるデータベース接続を多重化できます。

 プロキシへの接続は、*固定*と呼ばれる状態に入る場合があります。接続が固定されると、以降の各トランザクションは、セッションが終了するまで、同じ基になるデータベース接続を使用します。また、他のクライアント接続は、セッションが終了するまでそのデータベース接続を再利用できません。クライアント接続がドロップされると、セッションは終了します。

 RDS Proxy は、他のセッションに不適切なセッション状態の変化を検出すると、クライアント接続を特定の DB 接続に自動的に固定します。固定により、接続の再利用の有効性が低下します。すべての接続やほぼすべての接続で固定が発生する場合は、固定が発生する状態を減らすようにアプリケーションコードやワークロードを変更します。

例えば、アプリケーションによってセッションの変数や設定パラメータが変更されたとします。この場合、後続のステートメントは変更後の変数やパラメータが有効かどうかによって変わります。したがって、RDS Proxy はセッションの可変や構成設定の変更リクエストを処理する場合、そのセッションを DB 接続に固定します。これにより、セッション状態は、同じセッション内の後続のすべてのトランザクションで有効になります。

 一部のデータベースエンジンでは、設定可能なすべてのパラメータにこのルールが適用されるわけではありません。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
+ 使用

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 メトリクスの詳細については、「[Amazon CloudWatch を使用した RDS Proxy メトリクスのモニタリングCloudWatch を使用した RDS Proxy のモニタリング](rds-proxy.monitoring.md)」を参照してください。
+  `SET` ステートメントを使用して各クライアント接続を同等に初期化する場合、トランザクションレベルの多重化を維持したまま、この初期化を実行できます。この場合、初期セッション状態を設定するステートメントを、プロキシが使用する初期化クエリに移動します。このプロパティは、セミコロンで区切られた 1 つ以上の 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 で固定が発生する条件
<a name="rds-proxy-pinning.sqlserver"></a>

 RDS for SQL サーバーでは、次の操作でも固定が発生します。
+ 複数のアクティブな結果セット (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 プロキシは現在、すべてのトランザクションにわたって永続化される一時テーブルを作成するストアドプロシージャと互換性がありません。
+ MySQL (構文 /\$1\$1 ... \$1/) または MariaDB (構文 /\$1M\$1 ... \$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 プロキシは、トランザクションレベルのアドバイザリロック (特に `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 プロキシは現在、すべてのトランザクションにわたって永続化される一時テーブルを作成するストアドプロシージャと互換性がありません。
+ セッション状態の破棄。使用している接続プールライブラリで `DISCARD ALL` クエリをリセットクエリとして設定した場合、RDS Proxy は解放時にクライアント接続を固定します。これに伴って、`DISCARD ALL` コマンドがセッション状態の管理を妨げる場合があり、プロキシの多重化効率が低下し、予期しない結果につながる可能性があります。

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

 不要になったプロキシは削除できます。または、プロキシに関連付けられている DB インスタンスやクラスターがサービスから外された場合に、プロキシを削除できます。

## AWS マネジメントコンソール
<a name="rds-proxy-deleting.console"></a>

**プロキシを削除するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、[**プロキシ**] を選択します。

1.  リストから削除するプロキシを選択します。

1.  [**Delete Proxy (プロキシの削除)**] を選択します。

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

 DB プロキシを削除するには、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>

 DB プロキシを削除するには、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)
+ [

## マルチ AZ DB クラスターのプロキシエンドポイント
](#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 データベースエンジンを実行している DB インスタンスへの接続](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)」および「[PostgreSQL データベースエンジンを実行している DB インスタンスへの接続](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 プロキシのデフォルトエンドポイントは変更できません。
+  プロキシのユーザー定義エンドポイントの最大数は 20 です。したがって、プロキシには最大 21 個のエンドポイント (デフォルトのエンドポイントとユーザーが作成する 20) を持つことができます。
+  追加のエンドポイントをプロキシに関連付けると、RDS Proxy は、クラスター内のどの DB インスタンスをエンドポイントごとに使用するかを自動的に決定します。
+  IPv6 またはデュアルスタックのエンドポイントネットワークタイプの場合、VPC とサブネットは選択したネットワークタイプをサポートするように設定する必要があります。

プロキシを作成すると、RDS はアプリケーションとデータベース間の安全な通信のために VPC エンドポイントを自動的に作成します。VPC エンドポイントが表示され、Amazon VPC コンソールからアクセスできます。

新しいプロキシエンドポイントを追加すると、AWS PrivateLink インターフェイスエンドポイントがプロビジョニングされます。プロキシに 1 つ以上のエンドポイントを追加すると、追加料金が発生します。詳細については、「[RDS の料金](https://aws.amazon.com/rds/proxy/pricing/)」を参照してください。

## マルチ AZ DB クラスターのプロキシエンドポイント
<a name="rds-proxy-endpoints-overview-maz"></a>

デフォルトでは、RDS Proxy を マルチ AZ DB クラスターで使用するときに接続するエンドポイントには読み取り/書き込み機能があります。そのため、このエンドポイントではすべてのリクエストをクラスターのライターインスタンスに送信します。これらの接続はすべて、ライターインスタンスの `max_connections` 値にカウントされます。プロキシが マルチ AZ DB クラスターに関連付けられている場合は、そのプロキシ用に追加の読み取り/書き込みエンドポイントまたは読み取り専用エンドポイントを作成できます。

プロキシで読み取り専用エンドポイントを使用すると、読み取り専用クエリを実行できます。これは、マルチ AZ DB クラスターにリーダーエンドポイントを使用するのと同じ方法です。そうすることで、1 つ以上のリーダー DB インスタンスを持つ マルチ AZ DB クラスターの読み取りスケーラビリティを活用するのに役立ちます。読み取り専用エンドポイントを使用し、必要に応じて マルチ AZ DB クラスターにリーダー DB インスタンスを追加することで、より多くの同時クエリを実行し、より多くの同時接続を確立できます。このリーダーエンドポイントは、クエリを多用するアプリケーションの読み取りスケーラビリティを向上させるのに役立ちます。また、リーダーエンドポイントは、クラスター内のリーダー DB インスタンスが使用できなくなった場合に接続の可用性を向上させるのに役立ちます。

### マルチ AZ DB クラスターのリーダーエンドポイント
<a name="rds-proxy-endpoints-reader-stub"></a>

 RDS Proxy では、リーダーエンドポイントを作成して使用できます。ただし、これらのエンドポイントは、マルチ AZ DBクラスターに関連付けられたプロキシに対してのみ機能します。RDS CLI または API を使用する場合、値が `TargetRole` で、`READ_ONLY` の属性が表示される場合があります。プロキシのターゲットを RDS DB インスタンスから マルチ AZ DB クラスターに変更することで、これらのプロキシを利用できます。

 RDS Proxy を マルチ AZ DB クラスターで使用する場合は、*リーダーエンドポイント*と呼ばれる読み取り専用エンドポイントを作成して接続できます。

#### リーダーエンドポイントがアプリケーションの可用性をどのように支援するか
<a name="rds-proxy-endpoints-reader-hapa"></a>

 場合によっては、クラスター内のリーダーインスタンスが使用できなくなることがあります。それが発生した場合、DB プロキシのリーダーエンドポイントを使用する接続は、マルチ AZ DB クラスターエンドポイントを使用する接続よりも迅速に回復できます。RDS Proxy は、クラスター内の利用可能なリーダーインスタンスのみに接続をルーティングします。インスタンスが使用できなくなると、DNS キャッシュによる遅延はありません。

 接続が多重化されている場合、RDS Proxy はアプリケーションを中断せずに、後続のクエリを別のリーダーインスタンスに転送します。リーダーインスタンスが使用できない状態になると、そのインスタンスエンドポイントへのすべてのクライアント接続は閉じられます。

 接続が固定されている場合、接続の次のクエリはエラーを返します。ただし、アプリケーションはすぐに同じプロキシエンドポイントに再接続できます。RDS Proxy は、`available` 状態の別のリーダー DB インスタンスに接続をルーティングします。手動で再接続する場合、RDS Proxy は古いリーダーインスタンスと新しいリーダーインスタンス間のレプリケーションラグをチェックしません。

 マルチ AZ DB クラスターに使用可能なリーダーインスタンスがない場合は、RDS Proxy はリーダーエンドポイントへの接続を試みます。接続借用タイムアウト期間内にリーダーインスタンスが使用可能いならなかった場合、接続試行は失敗します。リーダーインスタンスが利用可能になると、接続試行は成功します。

#### リーダーエンドポイントがクエリスケーラビリティにどのように役立つか
<a name="rds-proxy-endpoints-reader-scalability"></a>

 プロキシのリーダーエンドポイントは、次の方法でマルチ AZ DB クラスタークエリのスケーラビリティを支援します。
+  実用的な場合は、RDS Proxy は特定のリーダーエンドポイント接続を使用するすべてのクエリの問題に同じリーダー DB インスタンスを使用します。これにより、同じテーブルに対する一連の関連クエリが、特定の DB インスタンスでキャッシング、プランの最適化などを活用できます。
+  リーダー DB インスタンスが使用できなくなった場合、アプリケーションへの影響は、セッションが多重化されているか固定されているかによって異なります。セッションが多重化されている場合、RDS Proxy は、後続のクエリを、ユーザー側でアクションを実行せずに別のリーダー DB インスタンスにルーティングします。セッションが固定されている場合、アプリケーションはエラーを受け取り、再接続する必要があります。リーダーエンドポイントにすぐに再接続でき、RDS Proxy は、接続を利用可能なリーダー DB インスタンスにルーティングします。プロキシセッションの多重化および固定の詳細については、「[RDS Proxy の概念](rds-proxy.howitworks.md#rds-proxy-overview)」を参照してください。

## VPC 間の RDS データベースへのアクセス
<a name="rds-proxy-cross-vpc"></a>

 デフォルトでは、RDS テクノロジースタックのコンポーネントはすべて同じ Amazon VPC にあります。例えば、Amazon EC2 インスタンスで実行されているアプリケーションが Amazon RDS DB インスタンスに接続するとします。この場合、アプリケーションサーバーとデータベースは両方とも同じ VPC 内に存在する必要があります。

 RDS Proxy により、EC2 インスタンスなど、別の VPC のリソースから 1 つの VPC の Amazon RDS DB インスタンスへのアクセスを設定できます。例えば、組織に、同じデータベースリソースにアクセスする複数のアプリケーションがあるとします。各アプリケーションは独自の VPC 内にある場合があります。

 クロス VPC アクセスを有効にするには、プロキシの新しいエンドポイントを作成します。プロキシ自体は、 Amazon RDS DB インスタンスと同じ VPC に存在します。ただし、クロス VPC エンドポイントは、EC2 インスタンスなどの他のリソースとともに、他の VPC に存在します。クロス VPC エンドポイントは、EC2 および他のリソースと同じ VPC のサブネットおよびセキュリティグループに関連付けられます。このような関連付けにより、VPC の制限によりデータベースにアクセスできないアプリケーションからエンドポイントに接続できます。

 次のステップでは、RDS Proxy を使用して VPC 間エンドポイントを作成してアクセスする方法について説明します。

1.  2 つの VPC を作成するか、 RDS の作業に既に使用している 2 つの VPC を選択します。各 VPC には、インターネットゲートウェイ、ルートテーブル、サブネット、セキュリティグループなど、独自のネットワークリソースが関連付けられている必要があります。VPC が 1 つしかない場合は、[Amazon RDS のスタート方法](CHAP_GettingStarted.md) で別の VPC をセットアップして正常に RDS を使用できるようにするステップをご覧ください。Amazon EC2 コンソールで既存の VPC を調べて、相互に接続するリソースの種類を確認することもできます。

1.  接続する Amazon RDS DB インスタンスに関連付けられた DB プロキシを作成します。「[Amazon RDS のプロキシの作成](rds-proxy-creating.md)」 の手順に従います。

1.  RDS コンソールのプロキシの [**詳細**] ページの [**プロキシエンドポイント**] セクションで、[**エンドポイントの作成**] を選択します。「[プロキシエンドポイントの作成](rds-proxy-endpoints.CreatingEndpoint.md)」 の手順に従います。

1.  クロス VPC エンドポイントを読み取り/書き込み可能にするか、読み取り専用にするかを選択します。

1.  Amazon RDS DB インスタンスと同じ VPC のデフォルトを受け入れる代わりに、別の VPC を選択します。この VPC は、プロキシが存在する VPC と同じ AWS リージョンに存在する必要があります。

1.  これで、Amazon RDS DB インスタンスと同じ VPC からサブネットとセキュリティグループのデフォルトを受け入れるのではなく、新しい選択を行います。選択した VPC のサブネットとセキュリティグループに基づいて、これらを作成します。

1. Secrets Manager シークレットの設定を変更する必要はありません。各エンドポイントがどの VPC にあるかに関係なく、プロキシのすべてのエンドポイントで同じ認証情報が機能します。同様に、IAM 認証を使用する場合、エンドポイントが異なる VPC にある場合でも、IAM 設定とアクセス許可はすべてのプロキシエンドポイント間で一貫して機能します。エンドポイントごとに追加の IAM 設定は必要ありません。

1.  新しいエンドポイントが **Available** (利用可能) 状態に達するのを待ちます。

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 マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、[**プロキシ**] を選択します。

1.  新しいエンドポイントを作成するプロキシの名前をクリックします。

    そのプロキシの詳細ページが表示されます。

1.  [**プロキシエンドポイント**] セクションで、[**プロキシエンドポイントの作成**] を選択します。

    [**プロキシエンドポイントの作成**] ウィンドウが表示されます。

1.  [**プロキシエンドポイント名**] に、選択したわかりやすい名前を入力します。

1.  [**ターゲットロール**] で、エンドポイントを読み取り/書き込みにするか、読み取り専用にするかを選択します。

    読み取り/書き込みエンドポイントを使用する接続では、データ定義言語 (DDL) ステートメント、データ操作言語 (DML) ステートメント、クエリなど、あらゆる種類の操作を実行できます。これらのエンドポイントは、常に  RDS DB クラスターのプライマリインスタンスに接続します。アプリケーションでエンドポイントを 1 つだけ使用する場合は、読み取り/書き込みエンドポイントを一般的なデータベース操作に使用できます。読み取り/書き込みエンドポイントは、管理操作、オンライントランザクション処理 (OLTP) アプリケーション、および抽出変換ロード (ETL) ジョブにも使用できます。

    読み取り専用エンドポイントを使用する接続では、クエリのみを実行できます。RDS Proxy はエンドポイントへの接続ごとにリーダーインスタンスの 1 つを使用できます。そうすれば、クエリを多用するアプリケーションは、マルチ AZ DB クラスターのクラスタリング機能を利用できます。読み取り専用接続では、クラスターのプライマリインスタンスでオーバーヘッドが発生することはありません。このようにすると、レポートおよび分析クエリによって、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.  **Subnets** では、RDS Proxy がデフォルトで関連するプロキシと同じサブネットを入力します。VPC のアドレス範囲の一部のみがエンドポイントに接続できるように、エンドポイントへのアクセスを制限するには、1 つ以上のサブネットを削除します。

1.  [**VPC セキュリティグループ**] で、既存のセキュリティグループを選択することも、新しいセキュリティグループを作成することもできます。RDS Proxy は、デフォルトで、関連付けられたプロキシと同じセキュリティグループを入力します。プロキシのインバウンドルールとアウトバウンドルールがこのエンドポイントに適切な場合は、デフォルトの選択肢のままにしておきます。

    新しいセキュリティグループを作成することにした場合は、このページでセキュリティグループの名前を指定します。その後、EC2 コンソールからセキュリティグループ設定を編集します。

1.  [**プロキシエンドポイントの作成**] を選択します。

## 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`プロキシがライター DB インスタンスのみを含む マルチ AZ DB クラスターに関連付けられている場合、`READ_ONLY` を指定することはできません。マルチ AZ DB クラスターでの読み取り専用エンドポイントの使用目的の詳細については、「 [マルチ AZ DB クラスターのリーダーエンドポイント](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 マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、[**プロキシ**] を選択します。

1.  リストから、エンドポイントを表示するプロキシを選択します。プロキシ名をクリックして、詳細ページを表示します。

1.  で、**プロキシエンドポイント**セクションで、表示するエンドポイントを選択します。名前をクリックすると、詳細ページが表示されます。

1.  関心のある値を持つパラメータを調べます。次のようなプロパティを確認できます。
   +  エンドポイントが読み取り/書き込み可能か読み取り専用か。
   +  データベース接続文字列で使用するエンドポイントアドレス。
   +  エンドポイントに関連付けられた VPC、サブネットおよびセキュリティグループ。

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

 1 つ以上の DB プロキシエンドポイントを表示するには、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>

 1 つ以上のプロキシエンドポイントを記述するには、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 つまたは複数のプロキシエンドポイントを変更するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、[**プロキシ**] を選択します。

1. リストから、エンドポイントを変更するプロキシを選択します。プロキシ名をクリックして、詳細ページを表示します。

1.  [**プロキシエンドポイント**] セクションで、変更するエンドポイントを選択します。リストから選択するか、名前をクリックして詳細ページを表示できます。

1.  プロキシの詳細ページの [**プロキシエンドポイント**] セクションで、[**編集**] を選択します。または、プロキシエンドポイントの詳細ページの **[アクション]** で、**[編集]** を選択します。

1.  変更するパラメータの値を変更します。

1.  [**Save changes**] (変更の保存) をクリックします。

## 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` 

 次のパラメータの 1 つまたは複数を使用して、エンドポイントプロパティの変更を指定します。
+  `--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.  ナビゲーションペインで、[**プロキシ**] を選択します。

1.  リストから、エンドポイントを設定するプロキシを選択します。プロキシ名をクリックして、詳細ページを表示します。

1.  [**プロキシエンドポイント**] セクションで、削除するエンドポイントを選択します。リストから 1 つ以上のエンドポイントを選択するか、1 つのエンドポイントの名前をクリックして詳細ページを表示できます。

1.  プロキシの詳細ページの [**プロキシエンドポイント**] セクションで、[**削除**] を選択します。または、プロキシエンドポイントの詳細ページの **[アクション]** で、**[削除]** を選択します。

## 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 は、プロキシから raw データを収集し、リアルタイムに近い読み取り可能なメトリクスに加工します。これらのメトリクスを 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 インスタンスごとに発行します。1 つのプロキシは、複数の EC2 インスタンスによって処理される場合があります。CloudWatch の統計情報を使用して、すべての関連付けられたインスタンスにわたってプロキシの値を集計します。  
 これらのメトリクスの一部は、プロキシによる初期の接続が成功するまで表示されないことがあります。

 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`   |   ディメンションで示されたロールでターゲットグループが利用できた時間の割合。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `Sum` です。  |  1 分  |  [Dimension set 4](#proxy-dimension-set-4)  | 
| ClientConnections  |   現在のクライアント接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `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 分ごとにレポートされます。このメトリクスの最も有用な統計は Sum です。  |  1 分  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `ClientConnectionsNoTLS`   |  Transport Layer Security (TLS) を使用しない現在のクライアント接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は 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 を使用する現在のクライアント接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は 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  |   現在のデータベース接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `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  |   借用状態のデータベース接続の現在の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `Sum` です。  |   1 分   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsCurrentlyInTransaction  |   トランザクションでの現在のデータベース接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `Sum` です。  |   1 分   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsCurrentlySessionPinned  |   セッション状態を変更するクライアントリクエストのオペレーションのために現在固定されているデータベース接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `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 を使用する現在のデータベース接続の数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は Sum です。 |  1 分  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| MaxDatabaseConnectionsAllowed  |   許可されるデータベース接続の最大数。このメトリクスは 1 分ごとにレポートされます。このメトリクスの最も有用な統計は `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  |   受信したクエリの数。複数のステートメントを含むクエリは、1 つのクエリとしてカウントされます。このメトリクスの最も有用な統計は `Sum` です。  |   1 分以上   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryRequestsNoTLS  |  非 TLS 接続から受信したクエリの数。複数のステートメントを含むクエリは、1 つのクエリとしてカウントされます。このメトリクスの最も有用な統計は Sum です。 |  1 分以上  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `QueryRequestsTLS`   |  TLS 接続から受信したクエリの数。複数のステートメントを含むクエリは、1 つのクエリとしてカウントされます。このメトリクスの最も有用な統計は 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)  | 

 RDS Proxy アクティビティのログは、AWS マネジメントコンソール の CloudWatch にあります。各プロキシには、[**ロググループ**] ページにエントリがあります。

**重要**  
 これらのログは、トラブルシューティングを目的としたもので、プログラムによるアクセス用ではありません。ログの形式と内容は変更される可能性があります。  
 特に、古いログには、各リクエストのエンドポイントを示すプレフィックスは含まれていません。新しいログでは、各エントリの先頭に、関連付けられたプロキシエンドポイントの名前が付けられます。この名前は、ユーザー定義のエンドポイントに指定した名前、またはプロキシのデフォルトのエンドポイントを使用するリクエストの特別な名前 `default` にすることができます。

# RDS Proxy イベントの使用
<a name="rds-proxy.events"></a>

*イベント*とは、AWS 環境やサービスまたは Software as a Service (SaaS) パートナーからのアプリケーションなどの環境での変化を示します。あるいは、お客様独自のカスタムアプリケーションやサービスのいずれかの場合があります。例えば、RDS Proxy を作成または変更すると、Amazon RDS がイベントを生成します。Amazon RDS は、Amazon EventBridge に対してほぼリアルタイムでイベントを配信します。以下に、サブスクライブできる RDS Proxy イベントのリストと、RDS Proxy イベントの例を示します。

イベントの操作に関する詳細は、以下を参照してください。
+ を使用してイベントを表示する方法については、を参照してください。AWS マネジメントコンソール、AWS CLI、または RDS API については、[Amazon RDS イベントの表示](USER_ListEvents.md)を参照してください。
+ 構成方法については、こちらをご覧ください。Amazon RDSEventBridge にイベントを送信するには、「[Amazon RDS イベントでトリガーするルールの作成](rds-cloud-watch-events.md)」を参照してください。

## RDS Proxy イベント
<a name="rds-proxy.events.list"></a>

ソースタイプが RDS Proxy である場合の、イベントのカテゴリとその一覧を次の表に示します。


|  カテゴリ  | RDS イベント ID |  メッセージ  |  メモ  | 
| --- | --- | --- | --- | 
| 設定変更 | RDS-EVENT-0204 |  RDS が DB プロキシ *name* を変更しました。  | なし | 
| 設定変更 | RDS-EVENT-0207 |  RDS において、DB プロキシ *name* のエンドポイントが修正されました。  | なし | 
| 設定変更 | RDS-EVENT-0213 |  RDS が DB インスタンスの追加を検出し、そのインスタンスを DB プロキシ *name* のターゲットグループに自動的に追加しました。  | なし | 
|  設定変更  | RDS-EVENT-0214 |  RDS が DB インスタンス *name* の削除を検出し、そのインスタンスを DB プロキシ *name* のターゲットグループ *name* から自動的に削除しました。  | なし | 
|  設定変更  | RDS-EVENT-0215 |  RDS が DB クラスター *name* の削除を検出し、そのインスタンスを DB プロキシ *name* のターゲットグループ *name* から自動的に削除しました。  | なし | 
|  作成  | RDS-EVENT-0203 |  RDS は DB プロキシ *name* を作成しました。  | なし | 
|  作成  | RDS-EVENT-0206 |  RDS は DB プロキシ *name* のエンドポイント*name*を作成しました。  | なし | 
| 削除 | RDS-EVENT-0205 |  RDS は DB プロキシ *name* を削除しました。  | なし | 
|  削除  | RDS-EVENT-0208 |  RDS は DB プロキシ*name*のエンドポイント *name* を削除しました。  | なし | 
|  失敗  | RDS-EVENT-0243 |  サブネット *name* に十分な IP アドレスがないため、RDS はプロキシの容量をプロビジョニングできませんでした: *name*。この問題を解決するには、RDS プロキシのドキュメントで推奨されているように、サブネットの未使用の IP アドレスが最小限であることを確認してください。  |  インスタンスクラスの推奨数を決定するには、「[IP アドレス容量の計画](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)」を参照してください。  | 
|  失敗 | RDS-EVENT-0275 |  RDS は DB プロキシ*名*への一部の接続をスロットリングしました。クライアントからプロキシへの同時接続リクエストの数が制限を超えました。  | なし | 

以下は、JSON 形式の RDS Proxy イベントの例です。このイベントは、`my-rds-proxy` という名前の RDS Proxy の `my-endpoint` という名前のエンドポイントを、RDS が変更したことを示します。イベント 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) コマンドを使用して、関連するターゲットグループを確認します。ターゲットの詳細が、プロキシに関連付ける RDS DB インスタンス と一致していることを確認します。以下のようなコマンドを使用します。

```
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` を調べて、プロキシが基になる DB インスタンスと通信できるかどうかを確認できます。
+  `State` の値 `AVAILABLE` は、プロキシが DB インスタンスに接続できることを示します。
+  `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 は、プロキシが接続する先の の 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` フィールドが JSON 文字列としてエンコードされ、`username` フィールドと `password` フィールドが含まれていることを確認します。次の例は、`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` アクセス許可を付与します。
+ エンドツーエンド 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 ロールが有効であること。

DB プロキシの作成時や接続時に、次の RDS イベントが発生することがあります。


| カテゴリ | RDS イベント ID | 説明 | 
| --- | --- | --- | 
|  失敗  | RDS-EVENT-0243 | サブネットに十分な IP アドレスがないため、RDS はプロキシの容量をプロビジョニングできませんでした。この問題を解決するには、サブネットの未使用の IP アドレスが最小限であることを確認してください。インスタンスクラスの推奨数を決定するには、「[IP アドレス容量の計画](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)」を参照してください。 | 
|  失敗  | RDS-EVENT-0275 |  RDS は DB プロキシ*名*への一部の接続をスロットリングしました。クライアントからプロキシへの同時接続リクエストの数が制限を超えました。  | 

 新しいプロキシの作成時やプロキシへの接続時に、次の問題が発生することがあります。


|  エラー  |  原因または回避策  | 
| --- | --- | 
|   `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/ja_jp/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/ja_jp/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/ja_jp/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.`   |   プロキシへの接続に使用されているデータベースクライアントが、接続の確立を試みるときにユーザー名を送信していません。  |   選択した PostgreSQL クライアントを使用してプロキシへの接続を設定するときは、必ずユーザー名を定義してください。  | 
|  `ERROR 28000: IAM is allowed only with SSL connections.`   |   クライアントが IAM 認証を使用して接続しようとしましたが、SSL が有効になっていませんでした。  |   PostgreSQL クライアントで 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/ja_jp/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/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   このエラーを修正する方法は次のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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.`   |   プロキシへの接続に使用されている PostgreSQL クライアントが、ストリーミングレプリケーションモードを使用しようとしています。このモードは、現在 RDS Proxy でサポートされていません。  |   接続に使用されている PostgreSQL クライアントでストリーミングレプリケーションモードをオフにします。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support the option option_name.`   |   プロキシへの接続に使用されている 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 サポートに連絡して、問題の調査を依頼してください。  | 
|  `ERROR 08000: Timed-out waiting to acquire database connection.`   |   プロキシは、`ConnectionBorrowTimeout` 設定で指定された期間内に、データベース接続の取得を待機中にタイムアウトしました。次のような原因が考えられます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   以下の解決策が対象となります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR XX000: Request returned an error: database_error.`   |   プロキシから確立されたデータベース接続がエラーを返しました。  |   解決策は、具体的なデータベースエラーによって異なります。1 つの例は、`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.`  |  プロキシへのクライアント接続で IAM 認証が有効になっていないため、RDS Proxy はデータベースに接続できません。これは、プロキシの `DefaultAuthScheme` パラメータが登録済みユーザーで `IAM_AUTH` に設定されているが、クライアントが IAM 認証の代わりにパスワード認証を使用している場合に発生します。  |  プロキシへのクライアント接続の IAM 認証を有効にして、もう一度試してください。  | 
|  `ERROR 28000: Configure IAM authentication as the DefaultAuthScheme in your proxy and try again.`  |  `DefaultAuthScheme` が `IAM_AUTH` に設定されていないため、RDS Proxy はデータベースに接続できません。プロキシの `DefaultAuthScheme` パラメータは `NONE` に設定されていますが、クライアントは IAM 認証を使用しようとしています。  |  プロキシの `DefaultAuthScheme` を `IAM_AUTH` に設定して、もう一度試してください。  | 

### 削除された `postgres` データベースのトラブルシューティング
<a name="rds-proxy-PostgreSQL-troubleshooting.postgresDBDelete"></a>

`postgres` データベースを誤ってインスタンスから削除した場合は、データベースを復元してインスタンスへの接続を回復する必要があります。以下のコマンドを DB インスタンス内で実行します。

```
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 DB インスタンスに接続できるプロキシを含めることができます。RDS Proxy の CloudFormation でのサポートには、`DBProxy` および `DBProxyTargetGroup` の 2 つの新しいレジストリタイプが含まれます。

 以下のリストは、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)」を参照してください。