

# 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/)」を参照してください。