

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

Amazon RDS 프록시를 사용하면 애플리케이션이 데이터베이스 연결을 풀링하고 공유하도록 허용하여 확장 기능을 향상할 수 있습니다. RDS 프록시는 애플리케이션 연결을 유지하면서 예비 DB 인스턴스에 자동으로 연결하여 데이터베이스 장애에 대한 애플리케이션의 복원력을 높입니다. RDS 프록시를 사용하면 프록시에 연결하는 클라이언트에 대해 AWS Identity and Access Management(IAM) 인증을 적용할 수 있으며 프록시는 AWS Secrets Manager에 저장된 IAM 데이터베이스 인증 또는 자격 증명을 사용하여 데이터베이스에 연결할 수 있습니다.

![\[애플리케이션이 RDS 프록시에 연결하는 방법에 대한 개요\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Proxy-Overview.png)


 RDS 프록시를 사용하여 예기치 않은 데이터베이스 트래픽 급증을 처리할 수 있습니다. 급증을 처리하지 않으면 이러한 현상으로 인해 연결을 초과 구독하거나 새 연결이 빠른 속도로 생성되어 문제가 발생할 수 있습니다. RDS 프록시는 데이터베이스 연결 풀을 설정하고 이 풀에서 연결을 재사용합니다. 이 접근 방식은 매번 새 데이터베이스 연결을 여는 데서 오는 메모리 및 CPU 오버헤드 를 방지합니다. 과다 구독으로부터 데이터베이스를 보호하기 위해 생성되는 데이터베이스 연결 수를 제어할 수 있습니다.

 RDS 프록시는 연결 풀에서 즉시 제공할 수 없는 애플리케이션 연결을 대기열에 추가하거나 제한합니다. 대기 시간이 증가할 수 있지만 애플리케이션은 갑작스러운 데이터베이스 장애 또는 압도 없이 계속 확장될 수 있습니다. 연결 요청이 지정된 한도를 초과하는 경우 RDS Proxy는 애플리케이션 연결을 거부합니다(즉, 부하 감소). 동시에 RDS가 사용 가능한 용량으로 제공할 수 있는 부하에 대해 예측 가능한 성능을 유지합니다.

![\[애플리케이션이 RDS 프록시에 연결하는 방법과 관련된 유형의 연결을 자세히 보여 줍니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Proxy-detail.png)


 자격 증명을 처리하고 각 새 연결에 대한 보안 연결을 설정하는 데 필요한 오버헤드를 줄일 수 있습니다. RDS 프록시는 데이터베이스를 대신하여 해당 작업 중 일부를 처리할 수 있습니다.

 RDS 프록시는 지원하는 엔진 버전과 완전히 호환됩니다. 코드 변경 없이 대부분의 애플리케이션에 RDS 프록시를 활성화할 수 있습니다.

**Topics**
+ [리전 및 버전 사용 가능 여부](#rds-proxy.RegionVersionAvailability)
+ [RDS 프록시의 할당량 및 제한 사항](#rds-proxy.limitations)
+ [RDS Proxy 사용 대상 계획](rds-proxy-planning.md)
+ [RDS Proxy 개념 및 용어](rds-proxy.howitworks.md)
+ [RDS 프록시 시작하기](rds-proxy-setup.md)
+ [RDS 프록시 관리](rds-proxy-managing.md)
+ [Amazon RDS 프록시 엔드포인트 작업](rds-proxy-endpoints.md)
+ [Amazon CloudWatch를 사용한 RDS 프록시 지표 모니터링](rds-proxy.monitoring.md)
+ [RDS 프록시 이벤트 작업](rds-proxy.events.md)
+ [RDS 프록시 문제 해결](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 프록시를 지원하는 리전 및 DB 엔진](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSProxy.md) 섹션을 참조하십시오.

## RDS 프록시의 할당량 및 제한 사항
<a name="rds-proxy.limitations"></a>

 RDS Proxy에는 다음과 같은 제한 사항이 적용됩니다.
+  각 AWS 계정 ID는 프록시 20개로 제한됩니다. 애플리케이션에 더 많은 프록시가 필요한 경우 AWS Management Console의 **Service Quotas** 페이지에서 증량을 요청하세요. **Service Quotas** 페이지에서 **Amazon Relational Database Service(Amazon RDS)**를 선택하고 **프록시**를 찾아 할당량 증량을 요청합니다. AWS는 자동으로 할당량을 늘리거나 지원의 요청에 대한 검토를 보류할 수 있습니다.
+ 각 프록시에는 최대 200개의 연결된 Secrets Manager 보안 암호가 있을 수 있으므로, 보안 암호를 사용할 때 최대 200개의 사용자 계정으로 연결이 제한됩니다.
+  각 프록시에는 프록시의 구성된 서브넷에서 선택한 두 개의 가용 영역에만 프로비저닝되는 기본 엔드포인트가 있습니다. 두 개 이상의 AZ에 서브넷이 구성된 경우 두 개가 모두 선택됩니다.
+  각 프록시에 최대 20개의 추가 프록시 엔드포인트를 추가할 수 있습니다. 이러한 추가 엔드포인트는 생성 중에 지정된 모든 가용 영역에 프로비저닝됩니다. 이러한 엔드포인트를 생성, 조회, 수정 및 삭제할 수 있습니다.
+ 복제 구성의 RDS DB 인스턴스의 경우, 프록시는 읽기 전용 복제본이 아닌 라이터 DB 인스턴스에만 연결할 수 있습니다.
+ RDS Proxy는 데이터베이스와 동일한 Virtual Private Cloud(VPC)에 있어야 합니다. 데이터베이스에는 공개적으로 액세스할 수는 있지만 프록시에는 공개적으로 액세스할 수 없습니다. 예를 들어, 로컬 호스트에서 데이터베이스의 프로토타입을 생성하는 경우 프록시에 연결하는 데 필요한 네트워크 요구 사항을 설정하지 않는 한 프록시에 연결할 수 없습니다. 이는 로컬 호스트가 프록시의 VPC 외부에 있기 때문입니다.
+  테넌시가 `dedicated`로 설정된 VPC에서는 RDS 프록시를 사용할 수 없습니다.
+  `Enforce Mode`가 활성화된 암호화 컨트롤이 있는 VPC에서는 RDS 프록시를 사용할 수 없습니다.
+ IPv6 엔드포인트 네트워크 유형의 경우 IPv6만 지원하도록 VPC 및 서브넷을 구성합니다. IPv4 및 IPv6 대상 연결 네트워크 유형 모두에 대해 듀얼 스택 모드를 지원하도록 VPC와 서브넷을 구성합니다.
+ IAM 인증이 활성화된 RDS DB 인스턴스와 함께 RDS 프록시를 사용하는 경우, 프록시는 Secrets Manager에 저장된 IAM 인증 또는 자격 증명을 사용하여 데이터베이스에 연결할 수 있습니다. 프록시에 연결하는 클라이언트는 IAM 자격 증명을 사용하여 인증해야 합니다. 자세한 구성 지침은 [RDS 프록시용 데이터베이스 자격 증명 설정](rds-proxy-secrets-arns.md) 및 [RDS 프록시에 대한 IAM 인증 구성](rds-proxy-iam-setup.md) 섹션을 참조하세요.
+  SSL 호스트 이름 검증을 사용할 경우, 사용자 지정 DNS와 함께 RDS 프록시를 사용할 수 없습니다.
+  각 프록시는 단일 대상 DB 인스턴스 와 연결될 수 있습니다. 그러나 여러 프록시를 동일한 DB 인스턴스 와 연결할 수 있습니다.
+ 텍스트 크기가 16KB보다 큰 문을 사용하면 프록시가 세션을 현재 연결에 고정합니다.
+ 특정 리전에는 프록시를 만들 때 고려해야 하는 가용 영역(AZ) 제한이 있습니다. 미국 동부(버지니아 북부) 리전은 `use1-az3` 가용 영역에서 RDS 프록시를 지원하지 않습니다. 미국 서부(캘리포니아 북부) 리전은 `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 프록시를 사용할 수 없습니다.
+ 프록시에 데이터베이스 파라미터 그룹 수정을 반영하려면 변경 사항을 즉시 적용하기로 선택한 경우에도 인스턴스 재부팅이 필요합니다. 클러스터 수준 파라미터의 경우 클러스터 전체 재부팅이 필요합니다.
+ 프록시 대상을 등록하면 프록시가 `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 프록시에는 다음과 같은 추가 제한 사항이 적용됩니다.
+  현재 모든 프록시는 MariaDB에 대한 포트 3306에서 수신합니다. 프록시는 여전히 데이터베이스 설정에서 지정한 포트를 사용하여 데이터베이스에 연결됩니다.
+ Amazon EC2 인스턴스에서 실행되는 자체 관리형 MariaDB 데이터베이스에는 RDS 프록시를 사용할 수 없습니다.
+ DB 파라미터 그룹의 `read_only` 파라미터가 `1`로 설정된 RDS for MariaDB DB 인스턴스에는 RDS 프록시를 사용할 수 없습니다.
+ RDS 프록시는 MariaDB 압축 모드를 지원하지 않습니다. 예를 들어 `mysql` 명령의 `--compress` 또는 `-C` 옵션에서 사용하는 압축을 지원하지 않습니다.
+ 일부 SQL 문 및 함수는 고정을 야기하지 않고 연결 상태를 변경할 수 있습니다. 최신 고정 동작은 [RDS 프록시 고정 방지](rds-proxy-pinning.md) 섹션을 참조하십시오.
+ RDS 프록시는 MariaDB `auth_ed25519` 플러그인을 지원하지 않습니다.
+ RDS 프록시는 MariaDB 데이터베이스용 전송 계층 보안(TLS) 버전 1.3을 지원하지 않습니다.
+ RDS 프록시가 동일한 데이터베이스 연결을 재사용하여 다른 쿼리를 실행하면 `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>

 RDS for Microsoft SQL Server 데이터베이스를 사용하는 RDS 프록시에는 다음과 같은 추가 제한 사항이 적용됩니다.
+ 프록시에 대해 만들어야 하는 Secrets Manager 암호의 수는 DB 인스턴스에서 사용하는 콜레이션에 따라 달라집니다. 예를 들어 DB 인스턴스에서 대/소문자를 구분하는 콜레이션을 사용한다고 가정해 보겠습니다. 애플리케이션에서 'Admin'과 'admin'을 모두 허용하는 경우 프록시에는 두 개의 개별 암호가 필요합니다. SQL Server의 콜레이션에 대한 자세한 내용은 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) 설명서를 참조하세요.
+ RDS 프록시는 Active Directory를 사용하는 연결을 지원하지 않습니다.
+ 토큰 속성을 지원하지 않는 클라이언트에는 IAM 인증을 사용할 수 없습니다. 자세한 내용은 [Microsoft SQL Server에 연결할 때 고려할 사항](rds-proxy-connecting.md#rds-proxy-connecting-sqlserver) 섹션을 참조하세요.
+ `@@IDENTITY`, `@@ROWCOUNT` 및 `SCOPE_IDENTITY`의 결과가 항상 정확하지는 않습니다. 차선책은 동일한 세션 문에서 해당 값을 검색하여 올바른 정보를 반환하는지 확인하는 것입니다.
+ 연결이 여러 개의 활성 결과 집합(MARS)을 사용하는 경우 RDS 프록시는 초기화 쿼리를 실행하지 않습니다. 사용자 이름에 대한 자세한 정보는 [Microsoft SQL 설명서](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver16)를 참조하세요.
+ 현재 RDS 프록시는 메이저 버전 SQL Server 2022에서 실행되는 RDS for SQL Server DB 인스턴스를 지원하지 않습니다.**
+ RDS 프록시는 메이저 버전 SQL Server 2014에서 실행되는 RDS for SQL Server DB 인스턴스를 지원하지 않습니다.**
+ RDS 프록시는 하나의 TLS 레코드에서 여러 응답 메시지를 처리할 수 없는 클라이언트 애플리케이션을 지원하지 않습니다.
+ RDS 프록시는 RDS for SQL Server에 대한 엔드 투 엔드 IAM 인증을 지원하지 않습니다.

### RDS for MySQL 추가 제한 사항
<a name="rds-proxy.limitations-my"></a>

 RDS for MySQL 데이터베이스를 사용하는 RDS 프록시에는 다음과 같은 추가 제한 사항이 적용됩니다.
+ `caching_sha2_password` 인증에 대한 RDS Proxy 지원에는 보안(TLS) 연결이 필요합니다.
+ `caching_sha2_password`에 대한 RDS Proxy 지원에는 특정 go-sql 드라이버 버전과의 호환성 문제가 있는 것으로 알려져 있습니다.
+ MySQL 8.4 C 드라이버를 사용할 때 파라미터 수가 준비된 문에서 자리 표시자 수를 초과하는 경우 `mysql_stmt_bind_named_param` API가 잘못된 형식의 패킷을 형성할 수 있습니다. 이로 인해 잘못된 응답이 발생합니다. 자세한 내용은 [MySQL bug report](https://bugs.mysql.com/bug.php?id=116860&thanks=4)를 참조하세요.
+ 현재 모든 프록시는 MySQL에 대한 포트 3306에서 수신합니다. 프록시는 여전히 데이터베이스 설정에서 지정한 포트를 사용하여 데이터베이스에 연결됩니다.
+  EC2 인스턴스에서 실행되는 자체 관리형 MySQL 데이터베이스에는 RDS 프록시를 사용할 수 없습니다.
+  DB 파라미터 그룹의 `read_only` 파라미터가 `1`로 설정된 MySQL DB 인스턴스에는 RDS 프록시를 사용할 수 없습니다.
+ RDS 프록시는 MySQL 압축 모드를 지원하지 않습니다. 예를 들어 `mysql` 명령의 `--compress` 또는 `-C` 옵션에서 사용하는 압축을 지원하지 않습니다.
+ RDS 프록시가 동일한 데이터베이스 연결을 재사용하여 다른 쿼리를 실행하면 `GET DIAGNOSTIC` 명령을 처리하는 데이터베이스 연결에서 부정확한 정보가 반환될 수 있습니다. 이는 RDS 프록시가 데이터베이스 연결을 멀티플렉싱할 때 발생할 수 있습니다.
+ `SET LOCAL` 같은 일부 SQL 문 및 함수는 고정을 야기하지 않고 연결 상태를 변경할 수 있습니다. 최신 고정 동작은 [RDS 프록시 고정 방지](rds-proxy-pinning.md) 섹션을 참조하십시오.
+ 다중 문 쿼리에서는 `ROW_COUNT()` 함수를 사용할 수 없습니다.
+ RDS 프록시는 하나의 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 프록시에는 다음과 같은 추가 제한 사항이 적용됩니다.
+ RDS 프록시는 PostgreSQL에 대한 세션 고정 필터를 지원하지 않습니다.
+  현재 모든 프록시는 PostgreSQL에 대한 포트 5432에서 수신합니다.
+ PostgreSQL의 경우 RDS 프록시는 현재 `CancelRequest`를 실행하여 클라이언트에서 쿼리를 취소하는 것을 지원하지 않습니다. Ctrl\$1C를 사용하여 대화형 psql 세션에서 장기 실행 쿼리를 취소하는 경우를 예로 들 수 있습니다.
+  PostgreSQL 함수 [lastval](https://www.postgresql.org/docs/current/functions-sequence.html)의 결과가 항상 정확하지는 않습니다. 해결 방법으로 `RETURNING` 절과 함께 [INSERT](https://www.postgresql.org/docs/current/sql-insert.html) 문을 사용합니다.
+ RDS 프록시는 현재 스트리밍 복제 모드를 지원하지 않습니다.
+ RDS for PostgreSQL 16에서는 `scram_iterations` 값을 수정해도 프록시와 데이터베이스 간의 인증 프로세스에만 영향을 줍니다. 특히, `ClientPasswordAuthType`을 `scram-sha-256`으로 구성한 경우 `scram_iterations` 값을 사용자 지정해도 클라이언트-프록시 암호 인증에는 영향을 주지 않습니다. 대신 클라이언트-프록시 암호 인증의 반복 값은 4096으로 고정됩니다.
+ RDS 프록시가 작동하려면 RDS for PostgreSQL 인스턴스에 기본 `postgres` 데이터베이스가 있어야 합니다. 애플리케이션이 다른 데이터베이스를 사용하더라도이 데이터베이스를 삭제하지 마세요.
+ `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 인스턴스에 대한 장기 연결을 더 적게 관리합니다.
+  T2 또는 T3 같이 더 작은 규모의 AWS 인스턴스 클래스를 사용하는 DB 인스턴스의 경우 프록시를 사용하면 메모리 부족 상태를 방지할 수 있습니다. 또한 연결을 설정하는 데 필요한 CPU 오버헤드를 줄일 수 있습니다. 이러한 상태는 많은 수의 연결을 처리할 때 발생할 수 있습니다.
+  또한 특정 Amazon CloudWatch 지표를 모니터링하여 DB 인스턴스에서 특정 유형의 제한에 접근하는지 확인할 수 있습니다. 이러한 제한은 연결 수와 연결 관리와 관련된 메모리에 대한 것입니다. 또한 특정 CloudWatch 지표를 모니터링하여 DB 인스턴스에서 수명이 짧은 여러 연결을 처리하고 있는지 확인할 수 있습니다. 이러한 연결을 열고 닫으면 데이터베이스에 성능 오버헤드가 발생할 수 있습니다. 모니터링할 지표에 대한 자세한 내용은 [Amazon CloudWatch를 사용한 RDS 프록시 지표 모니터링CloudWatch를 사용하여 RDS 프록시 모니터링](rds-proxy.monitoring.md) 섹션을 참조하십시오.
+  AWS Lambda 함수도 프록시를 사용하기 위한 좋은 후보가 될 수 있습니다. 이러한 함수는 RDS Proxy가 제공하는 연결 풀링의 이점을 누릴 수 있는 단기 데이터베이스 연결을 자주 만듭니다. Lambda 애플리케이션 코드에서 데이터베이스 자격 증명을 관리하는 대신 Lambda 함수에 대해 이미 가지고 있는 IAM 인증을 활용할 수 있습니다.
+  일반적으로 많은 수의 데이터베이스 연결을 열고 닫으며 내장된 연결 풀링 메커니즘이 없는 애플리케이션이 프록시를 사용하기에 적합합니다.
+  오랜 기간 동안 많은 수의 연결을 열린 상태로 유지하는 애플리케이션은 일반적으로 프록시를 사용하는 것이 좋습니다. SaaS(Software as a Service) 또는 전자 상거래와 같은 업종의 애플리케이션은 연결을 열린 상태로 두고 데이터베이스 요청에 대한 지연 시간을 최소화하는 경우가 많습니다. RDS 프록시를 사용하면 애플리케이션은 DB 인스턴스에 직접 연결할 때보다 더 많은 연결을 열어 둘 수 있습니다.
+  모든 DB 인스턴스 에 대해 이러한 인증을 설정하기는 복잡하기 때문에 IAM 인증 Secrets Manager를 채택하지 않았을 수 있습니다. 프록시는 특정 애플리케이션에 대한 클라이언트 연결에 인증 정책을 적용할 수 있습니다. Lambda 애플리케이션 코드에서 데이터베이스 자격 증명을 관리하는 대신 Lambda 함수에 대해 이미 가지고 있는 IAM 인증을 활용할 수 있습니다.
+  RDS 프록시를 사용하면 데이터베이스 장애에 대해 애플리케이션 복원력이 높아지고 투명성이 높아집니다. RDS 프록시는 도메인 이름 시스템(DNS) 캐시를 우회하여 Aurora RDS 다중 AZ DB 인스턴스의 장애 조치 시간을 최대 66% 단축합니다. 또한 RDS 프록시는 애플리케이션 연결을 유지하면서 트래픽을 새 데이터베이스 인스턴스로 자동 라우팅합니다. 따라서 애플리케이션의 장애 조치 투명성이 높아집니다.

# RDS Proxy 개념 및 용어
<a name="rds-proxy.howitworks"></a>

 RDS 프록시를 사용하여 Amazon RDS DB 인스턴스에 대한 연결 관리를 간소화할 수 있습니다.

 RDS Proxy는 클라이언트 애플리케이션과 데이터베이스 사이의 네트워크 트래픽을 처리합니다. 데이터베이스 프로토콜을 이해하여 능동적으로 수행합니다. 그런 다음 애플리케이션의 SQL 작업과 데이터베이스의 결과 집합을 기반으로 동작을 조정합니다.

 RDS Proxy는 데이터베이스의 연결 관리를 위한 메모리 및 CPU 오버헤드를 줄입니다. 애플리케이션이 많은 연결을 동시에 열 때 데이터베이스에 필요한 메모리 및 CPU 리소스가 더 적습니다. 또한 오랫동안 유휴 상태를 유지하는 연결을 닫았다가 다시 여는 데 애플리케이션의 논리가 필요하지 않습니다. 마찬가지로, 데이터베이스 문제의 경우 연결을 다시 설정하는 데 더 적은 애플리케이션 논리가 필요합니다.

 RDS Proxy의 인프라는 고가용성이고 여러 가용 영역(AZ)에 배포됩니다. RDS 프록시의 계산, 메모리 및 스토리지는 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 Lambda 같은 다른 AWS 서비스를 사용하여 RDS 데이터베이스에 연결하는 경우 프록시 엔드포인트를 사용하도록 연결 설정을 변경합니다. 예를 들어 RDS Proxy 기능을 활용하면서 Lambda 함수가 데이터베이스에 액세스할 수 있도록 프록시 엔드포인트을 지정합니다.

 각 프록시는 대상 그룹을 포함합니다. 이 대상 그룹은 프록시가 연결할 수 있는 RDS DB 인스턴스를 구현합니다.** 프록시와 연결된 RDS DB 인스턴스를 해당 프록시의 대상이라고 합니다.** 편의를 위해 콘솔을 통해 프록시를 생성하면 RDS Proxy는 해당 대상 그룹을 생성하고 연결된 대상을 자동으로 등록합니다.

 *엔진 패밀리*는 동일한 DB 프로토콜을 사용하는 관련 데이터베이스 엔진 집합입니다. 생성하는 각 프록시에 대해 엔진 패밀리를 선택합니다.

## 연결 풀링
<a name="rds-proxy-connection-pooling"></a>

각 프록시는 연결된 RDS 데이터베이스의 라이터와 리더 인스턴스에 대한 연결 풀링을 개별적으로 수행합니다. *연결 풀링*은 연결을 열고 닫으며 많은 연결을 동시에 열린 상태로 유지하는 데 관련된 오버헤드를 줄이는 최적화 기능입니다. 이 오버헤드에는 각각의 새로운 연결을 처리하는 데 필요한 메모리가 포함됩니다. 또한 각 연결을 닫고 새 연결을 여는 데는 CPU 오버헤드가 수반됩니다. 예를 들어 Transport Layer Security/Secure Sockets Layer(TLS/SSL) 핸드셰이킹, 인증, 협상 기능 등이 포함됩니다. 연결 풀링은 애플리케이션 논리를 단순화합니다. 동시 연결 수를 최소화하기 위해 애플리케이션 코드를 작성할 필요가 없습니다.

 또한 각 프록시는 연결 재사용이라고도 하는 연결 멀티플렉싱을 수행합니다. *멀티플렉싱*을 사용하면 RDS 프록시가 하나의 기본 데이터베이스 연결을 사용하여 한 트랜잭션에 대한 모든 작업을 수행합니다. 그런 다음 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 프록시를 사용하여 다음과 같은 인증 방법을 사용할 수 있습니다.
+ **데이터베이스 자격 증명**
+ **표준 IAM 인증**
+ **엔드 투 엔드 IAM 인증**

### RDS 프록시에서 IAM 사용
<a name="rds-proxy-security.IAM"></a>

RDS 프록시는 두 가지 IAM 인증 방법을 제공합니다.
+ **표준 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 Management Console에서 프록시를 생성하거나 수정할 때 **전송 계층 보안 필요** 설정을 지정할 수 있습니다.

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이 최우선 선택 사항이지만 필수는 아닙니다.

**비활성화됨**  
 SSL이 허용되지 않습니다.

**필수**  
 SSL을 설정합니다.

**VERIFY\$1CA**  
 SSL을 설정하고 인증 기관(CA)을 확인합니다.

**VERIFY\$1IDENTITY**  
 SSL을 설정하고 CA 및 CA 호스트 이름을 확인합니다.

 `--ssl-mode`, `VERIFY_CA` 또는 `VERIFY_IDENTITY`과 함께 클라이언트를 사용하는 경우 `--ssl-ca` 형식의 CA를 가리키는 `.pem` 옵션을 지정합니다. 사용할 `.pem` 파일의 경우 [Amazon Trust Services](https://www.amazontrust.com/repository/)에서 모든 루트 CA PEM을 다운로드하고 하나의 `.pem` 파일에 배치하세요.

 RDS 프록시에서는 도메인과 하위 도메인 모두에 적용되는 와일드카드 인증서를 사용합니다. `mysql` 클라이언트를 사용하여 SSL 모드 `VERIFY_IDENTITY`로 연결하는 경우 현재는 MySQL 8.0 호환 `mysql` 명령을 사용해야 합니다.

## 장애 조치
<a name="rds-proxy-failover"></a>

 *장애 조치*는 원래 인스턴스를 사용할 수 없게 될 때 데이터베이스 인스턴스를 다른 인스턴스로 대체하는 고가용성 기능입니다. 장애 조치는 데이터베이스 인스턴스 문제로 인해 발생할 수 있습니다. 또한 데이터베이스 업그레이드를 수행하는 경우와 같이 일반적인 유지 관리 절차의 일부로 발생할 수 있습니다. 장애 조치는 다중 AZ 구성의 RDS DB 인스턴스에 적용됩니다.

 프록시를 통해 연결하면 애플리케이션이 데이터베이스 장애 조치를 보다 효율적으로 수행할 수 있습니다. 원래 DB 인스턴스를 사용할 수 없게 되면 RDS Proxy가 유휴 애플리케이션 연결을 끊지 않고 대기 데이터베이스에 연결합니다. 이렇게 하면 장애 조치 프로세스를 단축하고 간소화할 수 있습니다. 이는 일반적인 재부팅 또는 데이터베이스 문제보다 애플리케이션에 대한 운영 중단이 발생할 확률이 적습니다.

 RDS Proxy를 사용하지 않으면 장애 조치에 잠시 중단이 필요합니다. 중단 중에 장애 조치 시 데이터베이스에 대한 쓰기 작업을 수행할 수 없습니다. 모든 기존 데이터베이스 연결이 중단되며 애플리케이션이 해당 연결을 다시 열어야 합니다. 사용할 수 없는 인스턴스를 대체하여 읽기 전용 DB 인스턴스가 승격되면 새 연결 및 쓰기 작업에 데이터베이스를 사용할 수 있게 됩니다.

 DB 장애 조치 중에 RDS Proxy는 계속해서 동일한 IP 주소에서 연결을 수락하고 자동으로 연결을 새 기본 DB 인스턴스로 전달합니다. RDS Proxy를 통해 연결하는 클라이언트는 다음 사항에 영향을 받지 않습니다.
+  장애 조치 시 Domain Name System(DNS) 전파가 지연됩니다.
+  로컬 DNS 캐싱.
+  연결 시간 초과.
+  현재 라이터인 DB 인스턴스가 확실하지 않습니다.
+  연결을 닫지 않은 상태에서 사용할 수 없게 된 이전 라이터의 쿼리 응답을 기다립니다.

 자체 연결 풀을 유지 관리하는 애플리케이션의 경우 RDS Proxy를 통해 연결한다는 것은 장애 조치 또는 기타 중단 중에 대부분의 연결이 활성 상태를 유지함을 의미합니다. 트랜잭션 도중 또는 SQL 문의 중간에 있는 연결만 취소됩니다. RDS Proxy는 새 연결을 즉시 수락합니다. 데이터베이스 라이터를 사용할 수 없는 경우 RDS Proxy는 들어오는 요청을 대기열에 넣습니다.

 자체 연결 풀을 유지 관리하지 않는 애플리케이션의 경우 RDS Proxy는 더 빠른 연결 속도와 더 많은 열린 연결을 제공합니다. 그러므로 데이터베이스에서 자주 다시 연결하기 위한 비용이 많이 드는 오버헤드가 감소합니다. 이를 위해 RDS Proxy 연결 풀에서 유지 관리되는 데이터베이스 연결을 재사용합니다. 이 접근 방식은 설정 비용이 상당한 TLS 연결에 특히 중요합니다.

## 트랜잭션
<a name="rds-proxy-transactions"></a>

 단일 트랜잭션 내의 모든 명령문은 항상 동일한 기본 데이터베이스 연결을 사용합니다. 트랜잭션이 종료하면 다른 세션에서 연결을 사용할 수 있게 됩니다. 트랜잭션을 세분화 단위로 사용하면 다음과 같은 결과가 발생합니다.
+  RDS for MySQL `autocommit` 설정을 활성화하면 개별 문 종료 후 연결 재사용이 발생할 수 있습니다.
+  반대로, `autocommit` 설정을 비활성화하면 세션에서 실행하는 첫 번째 문이 새 트랜잭션을 시작합니다. 예를 들어,`SELECT`, `INSERT`, `UPDATE` 및 기타 데이터 조작 언어(DML) 문의 시퀀스를 입력한다고 가정합시다. 이 경우, `COMMIT`, `ROLLBACK`을 실행하거나 기타 방법으로 트랜잭션을 종료할 때까지 연결을 재사용할 수 없습니다.
+  DDL(데이터 정의 언어) 문을 입력하면 해당 문이 완료된 후 트랜잭션이 종료합니다.

 RDS Proxy는 데이터베이스 클라이언트 애플리케이션에서 사용하는 네트워크 프로토콜을 통해 트랜잭션이 종료하는 시점을 감지합니다. 트랜잭션 감지는 SQL 문의 텍스트에 나타나는 `COMMIT` 또는 `ROLLBACK` 같은 키워드에 의존하지 않습니다.

 경우에 따라 RDS Proxy에서 세션을 다른 연결로 이동하는 것이 비현실적인 데이터베이스 요청을 감지할 수 있습니다. 이러한 경우 세션의 나머지 부분에서 해당 연결에 대한 멀티플렉싱을 해제합니다. RDS Proxy가 세션에서 멀티플렉싱이 실용적이라는 것을 확신할 수 없는 경우에도 동일한 규칙이 적용됩니다. 이 작업을 *고정*이라고 합니다. 고정을 탐지하고 최소화하는 방법은 [RDS 프록시 고정 방지](rds-proxy-pinning.md) 섹션을 참조하십시오.

# RDS 프록시 시작하기
<a name="rds-proxy-setup"></a>

다음 페이지의 정보를 통해 관련 보안 옵션을 설정하고 [ Amazon RDS Proxy](rds-proxy.md)를 관리하고 설정하세요. 보안 옵션은 각 프록시에 액세스할 수 있는 사용자 및 각 프록시가 DB 인스턴스에 연결하는 방법을 제어합니다.

RDS 프록시를 처음 사용하는 경우 제시된 순서대로 페이지를 따라가는 것이 좋습니다.

**Topics**
+ [RDS 프록시에 대한 네트워크 사전 조건 설정](rds-proxy-network-prereqs.md)
+ [RDS 프록시용 데이터베이스 자격 증명 설정](rds-proxy-secrets-arns.md)
+ [RDS 프록시에 대한 IAM 인증 구성](rds-proxy-iam-setup.md)
+ [Amazon RDS용 프록시 만들기](rds-proxy-creating.md)
+ [프록시 보기](rds-proxy-viewing.md)
+ [RDS Proxy를 통해 데이터베이스에 연결](rds-proxy-connecting.md)

# RDS 프록시에 대한 네트워크 사전 조건 설정
<a name="rds-proxy-network-prereqs"></a>

 RDS 프록시를 사용하려면 RDS DB 인스턴스와 RDS 프록시 간에 공통의 Virtual Private Cloud(VPC)가 있어야 합니다. 이 VPC에는 서로 다른 가용 영역에 있는 최소 2개의 서브넷이 있어야 합니다. 계정은 이러한 서브넷을 소유하거나 다른 계정과 공유할 수 있습니다. VPC 공유에 대한 자세한 내용은 [공유 VPC 작업](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)을 참조하세요.

IPv6 지원의 경우 추가 네트워크 구성이 필요합니다.
+ **IPv6 엔드포인트 네트워크 유형** - IPv6를 지원하도록 VPC 및 서브넷을 구성해야 합니다. 여기에는 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 프록시는 등록된 DB 인스턴스의 크기 및 수를 기준으로 필요에 따라 용량을 자동으로 조정합니다. 등록된 데이터베이스 또는 내부 RDS 프록시 유지 관리 작업의 크기를 늘리는 것과 같은 특정 작업의 경우 프록시 용량을 늘려야 할 수 있습니다. 이러한 작업 중에 프록시에 추가 용량을 프로비저닝하기 위해 더 많은 IP 주소가 필요할 수 있습니다. 이러한 추가 주소를 사용하면 워크로드에 영향을 주지 않고 프록시를 확장할 수 있습니다. 서브넷에 사용 가능한 IP 주소가 부족하면 프록시가 스케일 업되지 않을 수 있습니다. 이로 인해 쿼리 지연 시간이 길어지거나 클라이언트 연결이 실패할 수 있습니다. RDS는 서브넷에 사용 가능한 IP 주소가 충분하지 않을 경우 `RDS-EVENT-0243` 이벤트를 통해 알려줍니다. 이 이벤트에 대한 자세한 내용은 [RDS 프록시 이벤트 작업RDS 프록시 이벤트 작업](rds-proxy.events.md) 섹션을 참조하세요.

**참고**  
RDS Proxy는 하나의 VPC 내에서 각 프록시에 대해 IP 주소를 215개보다 많이 소비하지 않습니다.

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 주소가 더 필요할 수 있습니다. 각 추가 엔드포인트에 대해 IP 주소를 세 개 더 예약하는 것이 좋습니다. 각 읽기 전용 복제본에 대해 해당 읽기 전용 복제본의 크기를 기준으로 테이블에 지정된 대로 추가 IP 주소를 예약하는 것이 좋습니다.

# RDS 프록시용 데이터베이스 자격 증명 설정
<a name="rds-proxy-secrets-arns"></a>

Amazon RDS의 RDS 프록시는 AWS Secrets Manager를 사용하여 데이터베이스 자격 증명을 안전하게 저장하고 관리합니다. 애플리케이션에 임베딩 자격 증명을 포함하는 대신 프록시를 필요한 인증 세부 정보가 포함된 Secrets Manager 보안 암호와 연결합니다. 프록시가 RDS DB 인스턴스에서 연결하는 각 데이터베이스 사용자 계정에 대해 별도의 Secrets Manager 암호를 만듭니다.

또는 엔드 투 엔드 IAM 인증을 사용하도록 RDS 프록시를 구성할 수 있으므로 Secrets Manager에 데이터베이스 자격 증명을 저장할 필요가 없습니다. RDS 프록시는 클라이언트-프록시 및 프록시-데이터베이스 연결 모두에 IAM 인증을 사용합니다. 이는 보안 암호 또는 암호 관리가 필요하지 않은 완전 통합 IAM 기반 인증 솔루션을 제공합니다. 새로운 IAM DB 사용자를 추가하는 것에 대한 자세한 내용은 [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md) 섹션을 참조하세요.

**Topics**
+ [RDS 프록시에 사용할 보안 암호 만들기](#rds-proxy-secrets-create)

## RDS 프록시에 사용할 보안 암호 만들기
<a name="rds-proxy-secrets-create"></a>

프록시를 만들기 전에 데이터베이스 자격 증명을 저장하는 보안 암호를 최소 하나 이상 만들어야 합니다.

### 콘솔
<a name="rds-proxy-secrets-create-console"></a>

**보안 암호 생성**

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)에서 Secrets Manager 콘솔을 엽니다.

1. **Store a new secret**(새 보안 암호 저장)을 선택합니다.

1. **Amazon RDS 데이터베이스에 대한 자격 증명**을 선택합니다.

1. 사용자 이름과 암호를 입력합니다. 입력한 자격 증명은 연결된 RDS 데이터베이스에 있는 데이터베이스 사용자의 자격 증명과 일치해야 합니다. RDS 프록시는 이러한 자격 증명을 사용하여 애플리케이션 대신 데이터베이스에 대한 연결을 인증하고 설정합니다.

   일치하지 않는 경우 데이터베이스 암호와 일치하도록 보안 암호를 업데이트할 수 있습니다. 보안 암호를 업데이트할 때까지는 해당 보안 암호를 사용하여 프록시를 통해 연결을 시도하는 작업이 실패할 것이지만, 다른 유효한 보안 암호를 사용하는 연결은 여전히 작동합니다.
**참고**  
RDS for SQL Server의 경우 RDS 프록시에는 DB 인스턴스 데이터 정렬 설정에 관계없이 Secrets Manager에 대/소문자를 구분하는 보안 암호가 필요합니다. 애플리케이션에서 관리자(‘Admin’ 및 ‘admin’)와 같이 대문자가 다른 사용자 이름을 허용하는 경우 각각에 대해 별도의 보안 암호를 만들어야 합니다. RDS 프록시는 클라이언트와 프록시 간에 대/소문자를 구분하지 않는 사용자 이름 인증을 지원하지 않습니다.  
SQL Server의 콜레이션에 대한 자세한 내용은 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) 설명서를 참조하세요.

1. **데이터베이스**에서 보안 암호가 액세스할 Amazon RDS 데이터베이스를 선택합니다.

1. 보안 암호의 다른 설정을 입력한 다음 **저장**을 선택합니다. 포괄적인 설명은 *AWS Secrets Manager 사용 설명서*에 나와 있는 [Creating 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 Management Console에서는 설명하는 이름으로 비밀을 선택합니다.
+ RDS 프록시와 함께 사용할 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":"*"
        }
      ]
  }'
  ```

 예를 들어, 다음 명령은 두 데이터베이스 사용자에 대한 Secrets Manager 보안 암호를 생성합니다.

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

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

사용자 지정 AWS KMS 키로 암호화된 이러한 보안 암호를 만들려면 다음 명령을 사용하세요.

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

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

AWS 계정에서 소유한 보안 암호를 보려면 [list-secrets](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/list-secrets.html) 명령을 사용합니다.

```
aws secretsmanager list-secrets
```

CLI를 사용하여 프록시를 생성할 경우 하나 이상의 보안 정보에 대한 Amazon 리소스 이름(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 프록시에 대한 IAM 인증 구성
<a name="rds-proxy-iam-setup"></a>

Amazon RDS에서 RDS 프록시에 대한 AWS Identity and Access Management(IAM) 인증을 설정하려면 필수 권한을 부여하는 IAM 정책을 만들고 구성합니다.

이 주제에서는 필요한 IAM 정책을 만들고 IAM 역할에 연결하는 등 RDS 프록시에 대한 IAM 인증을 구성하는 단계를 제공합니다.

**작은 정보**  
이 절차는 자체 IAM 역할을 만들려는 경우에만 필요합니다. 그렇지 않으면 프록시를 설정할 때 RDS가 필요한 역할을 자동으로 만들 수 있으므로 이러한 단계를 건너뛸 수 있습니다.

## 사전 조건
<a name="rds-proxy-iam-setup-prereqs"></a>

RDS 프록시에 대한 IAM 인증을 설정하기 전에 다음 사항이 포함되어 있는지 확인합니다.
+ **AWS Secrets Manager** - 데이터베이스 자격 증명이 포함된 하나 이상의 저장된 보안 암호입니다. 보안 암호를 만드는 설명은 [RDS 프록시용 데이터베이스 자격 증명 설정](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 프록시는 Secrets Manager에서 자격 증명을 검색하는 대신 IAM 인증을 사용하여 데이터베이스에 연결합니다. 이렇게 하려면 프록시에 사용할 데이터베이스 계정에 대한 `rds-db:connect` 권한으로 IAM 역할을 구성해야 합니다.

IAM을 사용하여 데이터베이스에 대한 RDS 프록시를 인증하려면 필요한 데이터베이스 연결 권한을 부여하는 정책을 사용하여 IAM 역할을 생성합니다.

### 콘솔
<a name="rds-proxy-iam-e2e-console"></a>

**프록시를 사용하여 엔드 투 엔드 IAM 인증을 위한 역할 생성**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 역할에 대한 권한 정책을 만듭니다. 일반적인 단계는 [IAM 정책 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)을 참조하시기 바랍니다.

   이 정책을 JSON 편집기에 붙여넣고 다음 변경 사항을 적용합니다.
   + 자신의 계정 ID를 대체합니다.
   + 프록시가 상주해야 하는 위치로 `us-east-2`를 대체합니다.
   + 데이터베이스 리소스 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 프록시가 Secrets Manager에서 데이터베이스 자격 증명을 검색하도록 허용하려면 필수 권한을 부여하는 정책을 사용하여 IAM 역할을 만듭니다.

## 콘솔
<a name="rds-proxy-iam-console"></a>

**프록시와 함께 사용할 보안 암호에 액세스하는 IAM 정책을 만들려면 다음과 같이 합니다.**

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 역할에 대한 권한 정책을 만듭니다. 일반적인 단계는 [IAM 정책 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)을 참조하시기 바랍니다.

   이 정책을 JSON 편집기에 붙여넣고 다음 변경 사항을 적용합니다.
   + 자신의 계정 ID를 대체합니다.
   + 프록시가 상주할 리전으로 `us-east-2`를 대체합니다.
   + 보안 암호 이름을 사용자가 만든 이름으로 대체합니다. 자세한 내용은 [Specifying KMS keys in IAM policy statements](https://docs.aws.amazon.com/kms/latest/developerguide/cmks-in-iam-policies.html)를 참조하시기 바랍니다.
   + KMS 키 ID를 기본 키 또는 자체 키인 Secrets Manager 보안 암호를 암호화하는 데 사용한 ID로 대체합니다.

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

****  

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

------

1. 역할을 만들고 역할에 권한 정책을 연결합니다. 일반적인 단계는 [AWS 서비스에 대한 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하시기 바랍니다.

   **신뢰할 수 있는 엔터티 유형**에서 **AWS 서비스**를 선택합니다. **사용 사례**에서 **RDS**를 선택하고 사용 사례에서 **RDS - 데이터베이스에 역할 추가**를 선택합니다.

1. **권한 정책**에서 사용자가 만든 정책을 선택합니다.

1. **신뢰할 수 있는 엔터티 선택**에서 역할에 대해 신뢰할 수 있는 정책을 다음과 같이 입력합니다.

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

****  

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

------

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

AWS CLI를 사용하여 역할을 만들려면 다음 요청을 보냅니다.

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

그런 다음 정책을 역할에 연결합니다.

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

IAM 역할 및 권한이 구성된 상태에서 이제 프록시를 만들고 이 역할과 연결할 수 있습니다. 이렇게 하면 프록시가 AWS Secrets Manager에서 데이터베이스 자격 증명을 안전하게 검색하고 애플리케이션에 대한 IAM 인증을 사용 설정할 수 있습니다. 지침은 [Amazon RDS용 프록시 만들기](rds-proxy-creating.md) 섹션을 참조하세요.

# Amazon RDS용 프록시 만들기
<a name="rds-proxy-creating"></a>

프록시를 RDS for MariaDB, RDS for Microsoft SQL Server, RDS for MySQL 또는 RDS for PostgreSQL DB 인스턴스와 연결할 수 있습니다.

## 콘솔
<a name="rds-proxy-creating.console"></a>

**프록시를 생성하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **Proxies(프록시)**를 선택합니다.

1. **Create proxy(프록시 생성)**를 선택합니다.

1. 프록시에 대한 다음 설정을 구성합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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**  
대상 LinuxmacOS, 또는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 프록시에 대한 네트워크 사전 조건 설정](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 프록시를 생성하려면 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>

 하나 이상의 RDS 프록시를 생성한 후 AWS Management Console, AWS CLI 또는 RDS API에서 해당 프록시를 보고 관리할 수 있습니다. 구성 세부 정보를 검토하고, 성능을 모니터링하고, 필요에 따라 수정하거나 삭제할 프록시를 결정할 수 있습니다.

데이터베이스 애플리케이션이 프록시를 통해 트래픽을 라우팅하도록 하려면 연결 문자열에 프록시 엔드포인트를 지정해야 합니다.

## 콘솔
<a name="rds-proxy-viewing.console"></a>

**콘솔에서 프록시를 확인하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. 탐색 창에서 **Proxies(프록시)**를 선택합니다.

1. 세부 정보를 볼 프록시 이름을 선택합니다.

1. 세부 정보 페이지의 **대상 그룹** 섹션에 프록시가 특정 RDS DB 인스턴스에 어떻게 연결되는지 표시됩니다. 기본 대상 그룹 페이지로 이동하여 프록시를 만드는 중에 정의된 구성 설정을 포함하여 이 연결을 더 자세히 볼 수 있습니다. 이러한 설정에는 최대 연결 비율, 연결 대여 시간 초과, 엔진 패밀리, 세션 고정 필터 등이 포함됩니다.

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

 CLI를 사용하여 프록시를 보려면 [describe-db-proxy](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 Management Console에서는 해당 프록시의 세부 정보 페이지에서 엔드포인트를 찾을 수 있습니다. 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 프록시에서 IAM 인증을 사용하는 경우, 클라이언트와 프록시 간의 인증을 위한 두 가지 옵션이 있습니다.
+ 일반 사용자 이름 및 암호로 인증하도록 데이터베이스 사용자를 설정합니다. RDS Proxy는 Secrets Manager에서 사용자 이름 및 암호 자격 증명을 검색합니다. RDS 프록시에서 기본 데이터베이스로의 연결은 IAM을 거치지 않습니다.
+ 또한 데이터베이스 자격 증명 없이 IAM을 사용하여 프록시를 통해 데이터베이스에 연결하는 엔드 투 엔드 IAM 인증을 사용할 수 있습니다.

 IAM 인증을 사용하여 RDS 프록시에 연결하려면 IAM 인증을 통해 RDS DB 인스턴스에 연결하는 것과 동일한 일반 연결 프로시저를 따르면 됩니다. 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 인증을 사용하여 프록시에 연결할 때는 전송 계층 보안(TLS)/보안 소켓 계층(SSL)을 사용해야 합니다.

IAM 정책을 수정하여 특정 사용자에게 프록시에 대한 액세스 권한을 부여할 수 있습니다. 예를 들면 다음과 같습니다.

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

**작은 정보**  
RDS 프록시 연결에 대한 IAM 인증을 구성할 때 연결 문제를 방지하려면 다음 중요 지침을 따르세요.  
동일한 데이터베이스 사용자 또는 `rds_iam` 역할에 대한 일반 암호 인증을 유지하면서 역할을 부여하지 마세요.
클라이언트가 IAM 인증을 사용하여 RDS 프록시에 연결하는 동안 RDS 프록시는 항상 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 프록시 고정 방지](rds-proxy-pinning.md)를 참조하세요.

## PostgreSQL을 사용하여 연결할 때 고려할 사항
<a name="rds-proxy-connecting-postgresql"></a>

RDS 프록시에 연결할 새 PostgreSQL 데이터베이스 사용자를 생성하는 경우 데이터베이스에 대해 사용자에게 `CONNECT` 권한을 부여해야 합니다. 이렇게 하지 않으면 사용자가 연결을 설정할 수 없습니다. 자세한 내용은 [RDS 프록시 사용 시 PostgreSQL 데이터베이스에 새 데이터베이스 사용자 추가](rds-proxy-new-db-user.md#rds-proxy-new-db-user-pg) 섹션을 참조하세요.

클라이언트가 PostgreSQL 데이터베이스에 대한 연결을 시작하면 시작 메시지가 전송됩니다. 이 메시지에는 파라미터 이름과 값 문자열의 쌍이 포함됩니다. 자세한 내용은 PostgreSQL 설명서에서 [PostgreSQL 메시지 형식](https://www.postgresql.org/docs/current/protocol-message-formats.html)의 `StartupMessage`를 참조하십시오.

RDS 프록시를 통해 연결할 때 시작 메시지에는 현재 인식되는 다음과 같은 파라미터가 포함될 수 있습니다.
+  `user` 
+  `database`

 시작 메시지에는 다음과 같은 추가 런타임 파라미터가 포함될 수도 있습니다.
+ `[application\$1name](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-APPLICATION-NAME) `
+ `[client\$1encoding](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-CLIENT-ENCODING) `
+ `[DateStyle](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-DATESTYLE) `
+ `[TimeZone](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-TIMEZONE) `
+  `[extra\$1float\$1digits](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-EXTRA-FLOAT-DIGITS) `
+  `[ search\$1path ](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-SEARCH-PATH)` 

 PostgreSQL 메시징에 대한 자세한 내용은 PostgreSQL 설명서의 [프런트 엔드/백엔드 프로토콜](https://www.postgresql.org/docs/current/protocol.html)을 참조하십시오.

 PostgreSQL의 경우 JDBC를 사용한다면 고정을 피하기 위해 다음을 사용하는 것이 좋습니다.
+ 고정을 방지하려면 JDBC 연결 파라미터 `assumeMinServerVersion`을 `9.0` 이상으로 설정합니다. 이렇게 하면 `SET extra_float_digits = 3`을 실행할 때 JDBC 드라이버가 연결 시작 중에 추가 왕복을 수행하지 못합니다.
+ 고정을 방지하려면 JDBC 연결 파라미터 `ApplicationName`을 `any/your-application-name`으로 설정합니다. 이렇게 하면 `SET application_name = "PostgreSQL JDBC Driver"`을 실행할 때 JDBC 드라이버가 연결 시작 중에 추가 왕복을 수행하지 못합니다. JDBC 파라미터는 `ApplicationName`이지만 PostgreSQL `StartupMessage` 파라미터는 `application_name`입니다.

자세한 내용은 [RDS 프록시 고정 방지](rds-proxy-pinning.md) 섹션을 참조하세요. JDBC를 사용한 연결에 대한 자세한 내용은 PostgreSQL 설명서의 [데이터베이스에 연결](https://jdbc.postgresql.org/documentation/setup/)을 참조하십시오.

# RDS 프록시 관리
<a name="rds-proxy-managing"></a>

 이 섹션에서는 RDS 프록시 작업 및 구성을 관리하는 방법에 대한 정보를 제공합니다. 이러한 절차는 애플리케이션이 데이터베이스 연결을 가장 효율적으로 사용하고 최대 연결 재사용을 달성하는 데 도움이 됩니다. 연결 재사용을 더 많이 활용할수록 CPU 및 메모리 오버헤드를 더 많이 절약할 수 있습니다. 이렇게 하면 애플리케이션의 대기 시간이 줄어들고 데이터베이스가 애플리케이션 요청을 처리하는 데 더 많은 리소스를 사용할 수 있습니다.

**Topics**
+ [RDS 프록시 수정](rds-proxy-modifying-proxy.md)
+ [RDS 프록시 사용 시 새 데이터베이스 사용자 추가](rds-proxy-new-db-user.md)
+ [RDS 프록시에 대한 표준 IAM 인증에서 엔드 투 엔드 IAM 인증으로 전환](rds-proxy-iam-migration.md)
+ [RDS 프록시 연결 고려 사항](rds-proxy-connections.md)
+ [RDS 프록시 고정 방지](rds-proxy-pinning.md)
+ [RDS 프록시 삭제](rds-proxy-deleting.md)

# RDS 프록시 수정
<a name="rds-proxy-modifying-proxy"></a>

 프록시를 생성한 후 프록시와 연결된 특정 설정을 변경할 수 있습니다. 프록시 자체, 연결된 대상 그룹 또는 둘 다 수정하면 됩니다. 각 프록시에는 연결된 대상 그룹이 있습니다.

## AWS Management Console
<a name="rds-proxy-modifying-proxy.console"></a>

**중요**  
**클라이언트 인증 유형** 및 **IAM 인증** 필드의 값은 이 프록시에 연결된 모든 Secrets Manager 보안 암호에 적용됩니다. 보안 암호마다 다른 값을 지정하려면 AWS CLI 또는 API를 대신 사용하여 프록시를 수정하세요.

**프록시에 대한 설정을 수정하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1.  탐색 창에서 **Proxies(프록시)**를 선택합니다.

1.  프록시 목록에서 설정을 수정하려는 프록시를 선택하거나 세부 정보 페이지로 이동합니다.

1.  **작업**에서 **수정**을 선택합니다.

1.  수정할 속성을 입력하거나 선택합니다. 다음을 수정할 수 있습니다.
   +  **프록시 식별자** – 새 식별자를 입력하여 프록시 이름을 변경합니다.
   +  **유휴 클라이언트 연결 시간 초과** - 유휴 클라이언트 연결 시간 초과의 기간을 입력합니다.
   +  **IAM 역할** – Secrets Manager에서 보안 암호를 검색하는 데 사용되는 IAM 역할을 변경합니다.
**참고**  
**기본 인증 체계**를 IAM 인증으로 설정한 경우 새 **IAM** 역할을 생성할 수 없습니다.
   +  **Secrets Manager 보안 암호** - Secrets Manager 보안 암호를 추가하거나 제거합니다. 이러한 비밀은 데이터베이스 사용자 이름 및 암호에 해당합니다.
   +  **클라이언트 인증 유형** - 프록시에 대한 클라이언트 연결의 인증 유형을 변경합니다.
   +  **IAM 인증** - 프록시 연결에 대해 IAM 인증을 요구하거나 허용하지 않습니다.
   +  **기본 인증 체계** - 프록시가 프록시에 대한 클라이언트 연결 및 프록시에서 기본 데이터베이스로의 연결에 사용하는 기본 인증 체계를 변경합니다.
   +  **전송 계층 보안 필요** - 전송 계층 보안(TLS) 요구 사항을 설정하거나 해제합니다.
   +  **VPC 보안 그룹** - 프록시가 사용할 VPC 보안 그룹을 추가하거나 제거합니다.
   +  **향상된 로깅 활성화** - 고급 로깅을 사용하거나 사용 중지하도록 설정합니다.

1.  **수정**을 선택합니다.

변경할 설정을 찾지 못한 경우 다음 절차에 따라 프록시의 대상 그룹을 업데이트합니다. 프록시와 연결된 *대상 그룹*은 물리적 데이터베이스 연결과 관련된 설정을 제어합니다. 각 프록시에는 `default`라는 하나의 연결된 대상 그룹이 있으며, 이 그룹은 프록시와 함께 자동으로 생성됩니다. 기본 대상 그룹의 이름은 바꿀 수 없습니다.

 대상 그룹은 프록시 세부 정보 페이지에서만 수정할 수 있으며 **Proxies(프록시)** 페이지의 목록에서는 수정할 수 없습니다.

**프록시 대상 그룹에 대한 설정을 수정하려면**

1.  [**프록시(Proxies)**] 페이지에서 프록시의 세부 정보 페이지로 이동합니다. 

1.  **대상 그룹**에서 `default` 링크를 선택합니다. 현재 모든 프록시에는 `default`라는 단일 대상 그룹이 있습니다.

1.  **기본** 대상 그룹에 대한 세부 정보 페이지에서 **수정**을 선택합니다.

1.  수정할 수 있는 속성의 새 설정을 선택합니다.
   +  **데이터베이스** - 다른 RDS DB 인스턴스 또는 클러스터를 선택합니다.
   +  **연결 풀 최대 연결** – 프록시에서 사용할 수 있는 최대 연결 비율을 조정합니다.
   +  **세션 고정 필터** - (선택 사항) 세션 고정 필터를 선택합니다. 이렇게 하면 클라이언트 연결 간 데이터베이스 연결을 멀티플렉싱하기 위한 기본 안전 조치를 우회할 수 있습니다. 현재 PostgreSQL에서는 설정이 지원되지 않습니다. `EXCLUDE_VARIABLE_SETS`만 선택할 수 있습니다.

     이 설정을 활성화하면 어떤 연결의 세션 변수가 다른 연결에 영향을 줄 수 있습니다. 쿼리가 현재 트랜잭션 외부에 설정된 세션 변수 값에 의존하는 경우 이로 인해 오류나 정확성 문제가 발생할 수 있습니다. 애플리케이션이 클라이언트 연결 간에 데이터베이스 연결을 공유해도 안전한지 확인한 후 이 옵션을 사용하는 것이 좋습니다.

     다음과 같은 패턴이 나타나면 안전한 상태로 간주될 수 있습니다.
     + 유효 세션 변수 값에 변경 사항이 없는 `SET` 명령문이 있습니다(즉 세션 변수에 변경 사항이 없는 경우).
     + 세션 변수 값을 변경하고 동일한 트랜잭션에서 명령문을 실행합니다.

     자세한 내용은 [RDS 프록시 고정 방지](rds-proxy-pinning.md) 섹션을 참조하세요.
   +  **연결 대여 시간 초과** - 연결 대여 시간 초과 간격을 조정합니다. 이 설정은 최대 연결 수가 프록시에 이미 사용되고 있는 경우에 적용됩니다. 이 설정은 시간 초과 오류를 반환하기 전에 프록시가 연결을 사용할 수 있을 때까지 기다리는 시간을 지정합니다.
   + **초기화 쿼리**. (선택 사항) 초기화 쿼리를 추가하거나 현재 쿼리를 수정합니다. 각 새 데이터베이스 접속을 열 때 실행할 프록시에 대한 하나 이상의 SQL 문을 지정할 수 있습니다. 이 설정은 일반적으로 각 접속에 동일한 설정이 있는지 확인하기 위해 `SET` 문과 함께 사용됩니다. 추가하는 쿼리가 유효한지 확인합니다. 단일 `SET` 문에 여러 변수를 포함하려면 쉼표 구분자를 사용합니다. 예:

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

     여러 문의 경우 세미콜론을 구분 기호로 사용합니다.

    대상 그룹 식별자, 데이터베이스 엔진과 같은 특정 속성은 변경할 수 없습니다.

1.  **Modify target group(대상 그룹 수정)**을 선택합니다.

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

 AWS CLI를 사용하여 프록시를 수정하려면 [modify-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy.html), [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html), [deregister-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/deregister-db-proxy-targets.html) 및 [register-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/register-db-proxy-targets.html) 명령을 사용합니다.

 `modify-db-proxy` 명령을 사용하여 다음과 같은 속성을 변경할 수 있습니다.
+  프록시에서 사용하는 Secrets Manager 보안 암호 집합입니다.
+  TLS가 필요한지 여부입니다.
+  유휴 클라이언트 시간 초과.
+  디버깅을 위해 SQL 문에서 추가 정보를 로깅할지 여부입니다.
+  Secrets Manager 보안 암호를 검색하는 데 사용되는 IAM 역할입니다.
+  프록시에서 사용하는 보안 그룹입니다.
+ 프록시와 연결된 기본 인증 체계입니다.

 다음 예제에서는 기존 프록시의 이름을 바꾸는 방법을 보여 줍니다.

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

연결 관련 설정을 수정하거나 대상 그룹의 이름을 변경하려면 `modify-db-proxy-target-group` 명령을 사용합니다. 현재 모든 프록시에는 `default`라는 단일 대상 그룹이 있습니다. 이 대상 그룹으로 작업하는 경우 프록시 이름을 지정하고 대상 그룹 이름에 `default`를 지정합니다. 기본 대상 그룹의 이름은 바꿀 수 없습니다.

 다음 예제에서는 대상 그룹을 사용하여 프록시에 대한 `MaxIdleConnectionsPercent` 설정을 먼저 확인한 다음 변경하는 방법을 보여 줍니다.

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

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

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

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

 `deregister-db-proxy-targets` 및 `register-db-proxy-targets` 명령을 사용하여 대상 그룹을 통해 프록시가 연결된 RDS DB 인스턴스를 변경합니다. 현재 각 프록시는 하나의 RDS DB 인스턴스에 연결할 수 있습니다. 대상 그룹은 모든 다중 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`라는 단일 대상 그룹이 있습니다. 이 대상 그룹으로 작업하는 경우 프록시 이름을 지정하고 대상 그룹 이름에 `default`를 지정합니다. 기본 대상 그룹의 이름은 바꿀 수 없습니다.

 `DeregisterDBProxyTargets` 및 `RegisterDBProxyTargets`를 사용하여 대상 그룹을 통해 프록시가 연결된 RDS DB 인스턴스를 변경합니다. 현재 각 프록시는 하나의 RDS DB 인스턴스에 연결할 수 있습니다. 대상 그룹은 다중 AZ 구성의 RDS DB 인스턴스에 대한 연결 세부 정보를 추적합니다.

# RDS 프록시 사용 시 새 데이터베이스 사용자 추가
<a name="rds-proxy-new-db-user"></a>

프록시와 연결된 RDS DB 인스턴스에 새 데이터베이스 사용자를 추가해야 할 경우가 있습니다. Secrets Manager 보안 암호로 표준 인증을 사용하는지 아니면 엔드 투 엔드 IAM 인증을 사용하는지에 따라 진행합니다.

표준 IAM 인증을 사용하는 경우 다음 지침을 따르세요.

1. [RDS 프록시용 데이터베이스 자격 증명 설정](rds-proxy-secrets-arns.md)에 설명된 절차를 사용하여 새 Secrets Manager 비밀을 만듭니다.

1. IAM 역할을 업데이트하여 RDS Proxy에 새 Secrets Manager 비밀에 대한 액세스 권한을 부여합니다. 이렇게 하려면 IAM 역할 정책의 리소스 섹션을 업데이트합니다.

1. **Secrets Manager 보안 암호** 아래에서 RDS 프록시를 수정하여 새 Secrets Manager 보안 암호를 추가합니다.

1.  새 사용자가 기존 사용자를 대신하는 경우 기존 사용자의 프록시 Secrets Manager 비밀에 저장된 자격 증명을 업데이트합니다.

엔드 투 엔드 IAM 인증을 사용하는 경우 데이터베이스 사용자를 생성하고 IAM 권한을 구성해야 합니다. 이를 수행하려면 다음 단계를 수행합니다.

1. 인증에 사용할 IAM 사용자 또는 역할 이름과 일치하는 새 데이터베이스 사용자를 데이터베이스에 생성합니다.

1. 데이터베이스 사용자가 데이터베이스에서 IAM 인증 플러그인으로 구성되어 있는지 확인합니다. [IAM 인증을 사용하여 데이터베이스 계정 생성](UsingWithRDS.IAMDBAuth.DBAccounts.md)을(를) 참조하세요.

1. `rds-db:connect`에 설명된 대로 IAM 정책을 업데이트하여 IAM 사용자 또는 역할에 [엔드 투 엔드 IAM 인증을 위한 IAM 정책 생성](rds-proxy-iam-setup.md#rds-proxy-iam-setup-e2e-steps) 권한을 부여합니다.

1. 프록시가 IAM 인증을 기본 인증 체계로 사용하도록 구성되어 있는지 확인합니다.

엔드 투 엔드 IAM 인증을 사용하면 클라이언트에서 프록시로, 프록시에서 데이터베이스로 인증하는 데 IAM 자격 증명이 사용되므로 Secrets Manager 보안 암호에서 데이터베이스 자격 증명을 관리할 필요가 없습니다.

## RDS 프록시 사용 시 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 프록시 사용 시 데이터베이스 사용자 암호 변경
<a name="rds-proxy-changing-db-user-password"></a>

프록시와 연결된 RDS DB 인스턴스에서 데이터베이스 사용자의 암호를 변경해야 할 경우가 있습니다. 그렇다면 해당 Secrets Manager 비밀을 새 암호로 업데이트합니다.

엔드 투 엔드 IAM 인증을 사용하는 경우 Secrets Manager 보안 암호에서 암호를 업데이트할 필요가 없습니다.

# RDS 프록시에 대한 표준 IAM 인증에서 엔드 투 엔드 IAM 인증으로 전환
<a name="rds-proxy-iam-migration"></a>

 현재 클라이언트가 IAM을 사용하여 프록시에 인증하지만 프록시가 보안 암호를 사용하여 데이터베이스에 연결하는 RDS 프록시에 표준 IAM 인증을 사용하는 경우, 클라이언트-프록시 연결과 프록시-데이터베이스 연결이 모두 IAM 인증을 사용하는 엔드 투 엔드 IAM 인증으로 마이그레이션할 수 있습니다.

**엔드 투 엔드 IAM 인증으로 이동**

1. **RDS 프록시 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. 엔드 투 엔드 IAM 인증을 활성화하도록 RDS 프록시 수정

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

   마이그레이션 중에 가동 중지 시간이 발생하지 않도록 계속하기 전에 RDS 프록시 상태가 **사용 가능**이고 `DefaultAuthScheme`이 `IAM_AUTH`인지 확인합니다.

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

   예상 결과:

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

1. 데이터베이스에서 IAM 인증 활성화

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

1. IAM 인증을 위한 데이터베이스 사용자 구성

   RDS for PostgreSQL의 경우:

   ```
   GRANT rds_iam TO jane_doe;
   ```

   RDS for MySQL 및 RDS for MariaDB의 경우:

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

1. 클라이언트 애플리케이션 코드는 변경할 필요가 없습니다. 연결 프로세스는 동일하게 유지됩니다.

   RDS for PostgreSQL의 경우:

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

   RDS for MySQL 및 RDS for MariaDB의 경우:

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

# RDS 프록시 연결 고려 사항
<a name="rds-proxy-connections"></a>

## 연결 설정 구성
<a name="rds-proxy-connection-pooling-tuning"></a>

RDS 프록시의 연결 풀링을 조정하려면 다음 설정을 수정합니다.
+ [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 Management Console](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 프록시가 대상 데이터베이스와 설정할 수 있는 연결 수를 제한할 수 있습니다. 데이터베이스에 사용할 수 있는 최대 연결의 백분율로 제한을 지정합니다. 이 설정은 RDS 콘솔의 **연결 풀 최대 연결(Connection pool maximum connections)** 필드와 AWS CLI 또는 API의 `MaxConnectionsPercent` 설정으로 표시됩니다.

`MaxConnectionsPercent` 값은 대상 그룹에서 사용하는 RDS DB 인스턴스에 대한 `max_connections` 설정의 백분율로 표시됩니다. 프록시가 이러한 연결을 모두 미리 생성하지는 않습니다. 이 설정을 통해 프록시는 워크로드에 필요한 연결을 설정할 수 있습니다.

예를 들어 등록된 데이터베이스 대상이 `max_connections`가 1000으로 설정되어 있고 `MaxConnectionsPercent`가 95로 설정된 경우, RDS 프록시는 950개의 연결을 해당 데이터베이스 대상에 대한 동시 연결의 상한선으로 설정합니다.

워크로드가 허용된 최대 데이터베이스 연결 수에 도달할 경우 발생하는 일반적인 부작용은 전체 쿼리 지연 시간이 늘어나고, 그와 함께 `DatabaseConnectionsBorrowLatency` 지표도 증가한다는 점입니다. `DatabaseConnections` 및 `MaxDatabaseConnectionsAllowed` 지표를 비교하여 현재 사용된 데이터베이스 연결 수와 허용된 총 데이터베이스 연결 수를 모니터링할 수 있습니다.

이 파라미터를 설정할 때는 다음과 같은 모범 사례를 고려하세요.
+ 워크로드 패턴의 변동에 대비하여 충분한 연결 여유 용량을 확보하세요. 파라미터를 최근에 모니터링한 최대 사용량보다 30% 이상 높게 설정하는 것이 좋습니다. RDS 프록시는 데이터베이스 연결 할당량을 여러 노드에 재분배하므로, 차용 지연 시간이 늘어나는 것을 방지하기 위해 내부 용량 변경 시 추가 연결을 위한 최소 30%의 여유 용량이 필요할 수 있습니다.
+ RDS 프록시는 빠른 장애 조치, 트래픽 라우팅, 내부 작업을 지원하기 위해 활성 모니터링을 위한 특정 수의 연결을 예약합니다. `MaxDatabaseConnectionsAllowed` 지표에는 이러한 예약된 연결이 포함되지 않습니다. 이는 워크로드를 처리하는 데 사용 가능한 연결 수를 나타내며 `MaxConnectionsPercent` 설정에서 파생된 값보다 낮을 수 있습니다.

  최소 권장 `MaxConnectionsPercent` 값
  + db.t3.small: 30
  + db.t3.medium 이상: 20

RDS 콘솔에서 **연결 풀 최대 연결(Connection pool maximum connections)** 필드의 값을 변경하는 방법을 알아보려면 [AWS Management Console](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 프록시가 연결 풀에서 유지할 수 있는 유휴 데이터베이스 연결 수를 제어할 수 있습니다. 기본적으로, RDS 프록시는 5분 동안 연결에 대한 활동이 없으면 풀의 데이터베이스 연결을 유휴 상태로 간주합니다.**

`MaxIdleConnectionsPercent` 값은 RDS DB 인스턴스 대상 그룹에 대한 `max_connections` 설정의 백분율로 표시됩니다. 기본값은 `MaxConnectionsPercent`의 50%이고 상한은 `MaxConnectionsPercent` 값입니다. 예를 들어, `MaxConnectionsPercent`가 80인 경우 `MaxIdleConnectionsPercent`의 기본값은 40입니다. `MaxConnectionsPercent` 값이 지정되지 않은 경우 `MaxIdleConnectionsPercent`는 5(SQL Server)와 50(기타 모든 엔진)입니다.

값이 높으면 프록시가 유휴 데이터베이스 연결 비율을 높게 유지할 수 있습니다. 값이 낮으면 프록시가 높은 유휴 데이터베이스 연결 비율을 닫습니다. 워크로드를 예측할 수 없는 경우 `MaxIdleConnectionsPercent`에 높은 값을 설정하는 것을 고려해 보세요. 이렇게 하면 RDS 프록시가 새 데이터베이스 연결을 많이 열지 않고도 급증하는 활동을 수용할 수 있습니다.

이 설정은 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 프록시가 연결 풀의 데이터베이스 연결을 사용할 수 있을 때까지 기다리는 시간을 선택할 수 있습니다. 기본값은 120초입니다. 이 설정은 연결 수가 최대일 때, 즉 연결 풀에서 사용할 수 있는 연결이 없을 때 적용됩니다. 이는 또한 장애 조치 작업이 진행 중인 경우와 같이 요청을 처리할 수 있는 적절한 데이터베이스 인스턴스가 없는 경우에도 적용됩니다. 이 설정을 사용하면 애플리케이션 코드에서 쿼리 시간 초과를 변경하지 않고도 애플리케이션에 가장 적합한 대기 기간을 설정할 수 있습니다.

이 설정은 RDS 콘솔의 **연결 차용 제한 시간(Connection borrow timeout)** 필드나 AWS CLI 또는 API의 `DBProxyTargetGroup`의 `ConnectionBorrowTimeout` 설정으로 표시됩니다. RDS 콘솔에서 **연결 차용 제한 시간(Connection borrow timeout)** 필드의 값을 변경하는 방법을 알아보려면 [AWS Management Console](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 프록시로의 연결을 클라이언트 연결이라고 합니다. 프록시에서 데이터베이스로의 연결은 데이터베이스 연결입니다. RDS 프록시를 사용하는 경우 데이터베이스 연결은 RDS 프록시 내에서 관리되는 반면 클라이언트 연결은 프록시에서 종료됩니다.

애플리케이션 측 연결 풀링은 애플리케이션과 RDS 프록시 간의 반복적인 연결 설정을 줄이는 이점을 제공할 수 있습니다.

애플리케이션 측 연결 풀을 구현하기 전에 다음과 같은 구성 측면을 고려하세요.
+ 클라이언트 연결 최대 수명: RDS 프록시는 클라이언트 연결의 최대 수명을 24시간으로 제한합니다. 이 값은 구성할 수 없습니다. 예상치 못한 클라이언트 연결 끊김을 방지하려면 최대 연결 수명을 24시간 미만으로 설정하여 풀을 구성하세요.
+ 클라이언트 연결 유휴 제한 시간: RDS 프록시는 클라이언트 연결에 최대 유휴 시간을 적용합니다. 예상치 못한 연결 끊김을 방지하려면 RDS 프록시의 클라이언트 연결 유휴 제한 시간 설정보다 낮은 값으로 풀의 유휴 연결 제한 시간을 구성하세요.

애플리케이션 측 연결 풀에 구성된 최대 클라이언트 연결 수를 RDS 프록시의 **max\$1connections** 설정으로 제한할 필요는 없습니다.

클라이언트 연결 풀링을 사용하면 클라이언트 연결 수명이 길어집니다. 연결이 고정되는 경우 클라이언트 연결을 풀링하면 멀티플렉싱 효율성이 저하될 수 있습니다. 고정되어 있지만 애플리케이션 측 연결 풀에서 유휴 상태인 클라이언트 연결은 데이터베이스 연결을 계속 유지하고 다른 클라이언트 연결에서 데이터베이스 연결을 재사용하지 못하게 합니다. 프록시 로그를 검토하여 연결 고정이 발생하는지 확인하세요.

**참고**  
RDS 프록시는 더 이상 사용되지 않을 경우 24시간 후에 데이터베이스 연결을 닫습니다. 프록시는 최대 유휴 연결 설정 값에 관계없이 이 작업을 수행합니다.

# RDS 프록시 고정 방지
<a name="rds-proxy-pinning"></a>

 멀티플렉싱은 데이터베이스 요청이 이전 요청의 상태 정보에 의존하지 않을 때 더 효율적입니다. 이 경우 RDS Proxy는 각 트랜잭션이 완료될 때 연결을 다시 사용할 수 있습니다. 이러한 상태 정보의 예로는 `SET` 또는 `SELECT` 문을 통해 변경할 수 있는 대부분의 변수 및 구성 파라미터가 있습니다. 클라이언트 연결에 대한 SQL 트랜잭션은 기본적으로 기본 데이터베이스 연결 간에 멀티플렉싱할 수 있습니다.

 프록시에 대한 연결은 *고정*이라는 상태로 들어갈 수 있습니다. 연결이 고정되면 이후의 각 트랜잭션은 세션이 끝날 때까지 동일한 기본 데이터베이스 연결을 사용합니다. 다른 클라이언트 연결도 세션이 끝날 때까지 해당 데이터베이스 연결을 다시 사용할 수 없습니다. 클라이언트 연결이 끊어지면 세션이 종료됩니다.

 RDS Proxy는 다른 세션에 적합하지 않은 세션 상태 변경을 감지하면 클라이언트 연결을 특정 DB 연결에 자동으로 고정합니다. 고정은 연결 재사용의 효과를 줄입니다. 모든 또는 거의 모든 연결이 고정되는 경우 애플리케이션 코드 또는 워크로드를 수정하여 고정을 유발하는 조건을 줄이는 것이 좋습니다.

예를 들어, 애플리케이션이 세션 변수 또는 구성 파라미터를 변경한다고 가정하겠습니다. 이 경우 이후의 문이 효력을 발휘하기 위해 새 변수 또는 파라미터를 사용할 수 있습니다. 따라서 RDS Proxy는 세션 변수 또는 구성 설정을 변경하라는 요청을 처리할 때 해당 세션을 DB 연결에 고정합니다. 이렇게 하면 동일한 세션의 모든 이후 트랜잭션에 대해 세션 상태가 유효하게 유지됩니다.

 일부 데이터베이스의 경우 이 규칙은 설정할 수 있는 모든 파라미터에 적용되지는 않습니다. RDS 프록시는 특정 문과 변수를 추적합니다. 따라서 RDS 프록시는 이들을 수정할 때 세션을 고정하지 않습니다. 이 경우 RDS 프록시는 해당 설정에 대해 동일한 값을 가진 다른 세션에 대해서만 연결을 재사용합니다. RDS 프록시가 데이터베이스 엔진에서 추적하는 항목에 대한 자세한 내용은 다음을 참조하세요. 
+ [RDS 프록시가 RDS for SQL Server 데이터베이스에서 추적하는 대상](#rds-proxy-pinning.sql-server-tracked-vars)
+ [RDS 프록시가 RDS for MariaDB 및 RDS for MySQL 데이터베이스에서 추적하는 대상](#rds-proxy-pinning.mysql-tracked-vars)

## RDS 프록시가 RDS for SQL Server 데이터베이스에서 추적하는 대상
<a name="rds-proxy-pinning.sql-server-tracked-vars"></a>

다음은 RDS 프록시가 추적하는 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 프록시가 RDS for MariaDB 및 RDS for MySQL 데이터베이스에서 추적하는 대상
<a name="rds-proxy-pinning.mysql-tracked-vars"></a>

다음은 RDS 프록시가 추적하는 MariaDB 및 MySQL 문입니다.
+ DROP DATABASE
+ DROP SCHEMA
+ USE

다음은 RDS 프록시가 추적하는 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 프록시는 세션 범위에서 설정할 때 `TRANSACTION_ISOLATION` 및 `TRANSACTION_READ_ONLY` 변수에 대한 변경 사항을 추적합니다. 하지만 다음 트랜잭션 범위에서 설정하면 RDS 프록시가 연결을 고정시킵니다. 이 동작은 `SET` 스테이트먼트 또는 `SET TRANSACTION` 스테이트먼트를 사용하여 이러한 값을 구성하는지 여부에 관계없이 적용됩니다.

## 고정 최소화
<a name="rds-proxy-pinning.minimizing"></a>

 RDS 프록시 성능 튜닝에는 고정을 최소화하여 트랜잭션 수준 연결 재사용(멀티플렉싱)을 최대화하려는 시도가 포함됩니다.

다음 작업을 수행하여 고정을 최소화할 수 있습니다.
+  고정을 야기할 수 있는 불필요한 데이터베이스 요청을 방지합니다.
+  모든 연결에서 변수와 구성 설정을 일관되게 설정합니다. 그렇게 하면 이후 세션에서 특정 설정이 있는 연결을 재사용할 가능성이 증가합니다.

   그러나 PostgreSQL의 경우 변수를 설정하면 세션이 고정됩니다.
+  MySQL 엔진 패밀리 데이터베이스의 경우 프록시에 세션 고정 필터를 적용합니다. 이렇게 해도 애플리케이션의 올바른 작동에 영향을 주지 않음이 확인될 경우 특정 유형의 작업을 세션 고정에서 제외할 수 있습니다.
+  Amazon CloudWatch 지표 중 `DatabaseConnectionsCurrentlySessionPinned`를 모니터링하여 고정이 얼마나 자주 발생하는지 확인합니다. 이 지표와 기타 CloudWatch 지표에 대한 자세한 내용은 [Amazon CloudWatch를 사용한 RDS 프록시 지표 모니터링CloudWatch를 사용하여 RDS 프록시 모니터링](rds-proxy.monitoring.md) 단원을 참조하십시오.
+  `SET` 문을 사용하여 각 클라이언트 연결에 대해 동일한 초기화를 수행하는 경우 트랜잭션 수준 멀티플렉싱을 유지하면서 그렇게 할 수 있습니다. 이 경우 초기 세션 상태를 설정하는 문을 프록시에서 사용하는 초기화 쿼리로 이동합니다. 이 속성은 세미콜론으로 구분된 하나 이상의 SQL 문을 포함하는 문자열입니다.

   예를 들어, 특정 구성 파라미터를 설정하는 프록시에 대한 초기화 질의를 정의할 수 있습니다. 그러면 RDS Proxy는 해당 프록시에 대해 새 연결을 설정할 때마다 해당 설정을 적용합니다. 애플리케이션 코드에서 해당 `SET` 문을 제거하여 트랜잭션 수준 멀티플렉싱을 방해하지 않도록 할 수 있습니다.

   특정 프록시에서 고정이 발생하는 빈도에 대한 지표를 보려면 [Amazon CloudWatch를 사용한 RDS 프록시 지표 모니터링CloudWatch를 사용하여 RDS 프록시 모니터링](rds-proxy.monitoring.md) 단원을 참조하십시오.

## 모든 엔진 패밀리에 대해 고정을 유발하는 조건
<a name="rds-proxy-pinning.all"></a>

 다음과 같이 멀티플렉싱으로 예기치 않은 동작이 발생할 수 있는 상황에서 프록시는 세션을 현재 연결에 고정합니다.
+ 텍스트 크기가 16KB보다 큰 명령문을 사용하면 프록시가 세션을 고정합니다.

## RDS for Microsoft SQL Server에서 고정이 발생하는 조건
<a name="rds-proxy-pinning.sqlserver"></a>

 RDS for SQL Server의 경우 다음 상호 작용도 고정을 유발합니다.
+ 여러 개의 활성 결과 집합(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 프록시 수정](rds-proxy-modifying-proxy.md)(을)를 참조하세요.
+ 임시 테이블을 생성하면 프록시가 세션을 고정합니다. 이렇게 하면 트랜잭션 경계에 관계없이 임시 테이블의 내용이 세션 전체에서 보존됩니다.
+ `ROW_COUNT` 및 `FOUND_ROWS` 를 직접 호출하면 고정을 야기하는 경우가 있습니다.
+ 준비된 문을 사용하면 프록시가 세션을 고정합니다. 이 규칙은 준비된 문이 SQL 텍스트를 사용하는지 이진 프로토콜을 사용하는지 여부를 적용합니다.
+ SET LOCAL을 사용할 경우 RDS 프록시는 연결을 고정하지 않습니다.
+ 저장 프로시저 및 저장 함수를 호출해도 고정이 발생하지 않습니다. RDS 프록시는 이러한 호출로 인한 세션 상태 변경을 감지하지 못합니다. 트랜잭션 전반에 걸쳐 세션 상태를 유지하려고 해당 세션 상태에 의존하는 경우 저장된 루틴 내에서 애플리케이션이 세션 상태를 변경하지 않는지 확인합니다. 예를 들어, RDS 프록시는 현재 모든 트랜잭션에 걸쳐 지속되는 임시 테이블을 생성하는 저장 프로시저와 호환되지 않습니다.
+ MySQL( 구문 /\$1\$1 ... \$1/) 또는 MariaDB( 구문 /\$1M\$1 ... \$1/)에 대한 실행 가능한 설명이 있는 쿼리는 고정을 일으킵니다. RDS 프록시는 세션 상태 변경을 추적하기 위해 이러한 설명에 포함된 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 프록시는 이러한 호출로 인한 세션 상태 변경을 감지하지 못합니다. 트랜잭션 전반에 걸쳐 세션 상태를 유지하려고 해당 세션 상태에 의존하는 경우 저장된 루틴 내에서 애플리케이션이 세션 상태를 변경하지 않는지 확인합니다. 예를 들어, RDS 프록시는 현재 모든 트랜잭션에 걸쳐 지속되는 임시 테이블을 생성하는 저장 프로시저와 호환되지 않습니다.
+ 세션 상태 삭제. 재설정 쿼리로 구성된 `DISCARD ALL` 쿼리와 함께 연결 풀링 라이브러리를 사용하는 경우, RDS Proxy는 해제 시 클라이언트 연결을 고정합니다. 이렇게 하면 프록시의 멀티플렉싱 효율성이 저하되고 `DISCARD ALL` 명령이 세션 상태 관리를 방해할 수 있으므로 예기치 않은 결과가 발생할 수 있습니다.

# RDS 프록시 삭제
<a name="rds-proxy-deleting"></a>

 더 이상 필요하지 않은 프록시는 삭제할 수 있습니다. 또는 프록시와 연결된 DB 인스턴스 또는 클러스터를 서비스 중단 상태로 전환하면 프록시를 삭제할 수 있습니다.

## AWS Management Console
<a name="rds-proxy-deleting.console"></a>

**프록시를 삭제하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1.  탐색 창에서 **Proxies(프록시)**를 선택합니다.

1.  목록에서 삭제할 프록시를 선택합니다.

1.  **Delete Proxy(프록시 삭제)**를 선택합니다.

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

 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 프록시 엔드포인트 작업
<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 프록시 엔드포인트 작업을 수행하려면 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 프록시 지표 모니터링CloudWatch를 사용하여 RDS 프록시 모니터링](rds-proxy.monitoring.md) 섹션을 참조하세요.

프록시 엔드포인트는 연결된 프록시와 동일한 인증 메커니즘을 사용합니다. RDS Proxy는 연결된 프록시의 속성과 일치하는 사용자 정의 엔드포인트에 대한 권한 및 승인을 자동으로 설정합니다.

## 프록시 엔드포인트에 대한 제한 사항
<a name="rds-proxy-endpoints-limits"></a>

RDS 프록시 엔드포인트에는 다음과 같은 제한 사항이 있습니다.
+  RDS 프록시 기본 엔드포인트는 수정할 수 없습니다.
+  프록시의 사용자 정의 엔드포인트의 최대 개수는 20개입니다. 따라서 프록시는 최대 21개의 엔드포인트(기본 엔드포인트와 사용자가 생성하는 20개)를 가질 수 있습니다.
+  추가 엔드포인트를 프록시와 연결할 때 RDS Proxy는 클러스터에서 각 엔드포인트에 사용할 DB 인스턴스를 자동으로 결정합니다. 
+  IPv6 또는 듀얼 스택 엔드포인트 네트워크 유형의 경우 선택한 네트워크 유형을 지원하도록 VPC 및 서브넷을 구성해야 합니다.

프록시를 생성하면 RDS는 애플리케이션과 데이터베이스 간의 보안 통신을 위해 VPC 엔드포인트를 자동으로 만듭니다. VPC 엔드포인트는 Amazon VPC 콘솔에서 보고 액세스할 수 있습니다.

새 프록시 엔드포인트를 추가하면 AWS PrivateLink 인터페이스 엔드포인트가 프로비저닝됩니다. 프록시에 엔드포인트를 하나 이상 추가하면 추가 요금이 발생합니다. 자세한 내용은 [RDS Proxy Pricing](https://aws.amazon.com/rds/proxy/pricing/)을 참조하세요.

## 다중 AZ DB 클러스터의 프록시 엔드포인트
<a name="rds-proxy-endpoints-overview-maz"></a>

기본적으로, 다중 AZ DB 클러스터에 RDS 프록시를 사용할 때 연결하는 엔드포인트에는 읽기/쓰기 기능이 있습니다. 따라서 이 엔드포인트는 모든 요청을 클러스터의 라이터 인스턴스로 보냅니다. 이러한 모든 연결은 라이터 인스턴스의 `max_connections` 값에 포함됩니다. 프록시가 다중 AZ DB 클러스터에 연결되어 있는 경우, 해당 프록시에 대해 추가 읽기/쓰기 또는 읽기 전용 엔드포인트를 생성할 수 있습니다.

읽기 전용 쿼리를 위해 프록시와 함께 읽기 전용 엔드포인트를 사용할 수 있습니다. 다중 AZ DB 클러스터에 리더 엔드포인트를 사용하는 것과 동일한 방식으로 이를 수행합니다. 이렇게 하면 하나 이상의 리더 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 클러스터로 변경하여 이러한 프록시를 활용할 수 있습니다.

 다중 AZ DB 클러스터에 RDS 프록시를 사용할 경우 *리더 엔드포인트*라는 읽기 전용 엔드포인트를 생성하고 연결할 수 있습니다.

#### 리더 엔드포인트가 애플리케이션 가용성을 높이는 방법
<a name="rds-proxy-endpoints-reader-hapa"></a>

 경우에 따라 클러스터에 있는 리더 인스턴스를 사용할 수 없게 될 수 있습니다. 이 경우 DB 프록시의 리더 엔드포인트를 사용하는 연결은 다중 AZ DB 클러스터 리더 엔드포인트를 사용하는 연결보다 더 빠르게 복구됩니다. RDS 프록시는 클러스터에서 사용 가능한 리더 인스턴스로만 연결을 라우팅합니다. 인스턴스를 사용할 수 없게 될 때 DNS 캐싱으로 인해 지연이 발생하지 않습니다.

 연결이 다중화된 경우 RDS 프록시는 애플리케이션을 중단하지 않고 후속 쿼리를 다른 리더 인스턴스로 보냅니다. 리더 인스턴스가 사용할 수 없는 상태인 경우 해당 인스턴스 엔드포인트에 대한 모든 클라이언트 연결이 닫힙니다.

 연결이 고정된 경우 연결에 대한 다음 쿼리에서 오류가 반환됩니다. 그러나 애플리케이션은 동일한 프록시 엔드포인트에 즉시 다시 연결할 수 있습니다. RDS Proxy는 `available` 상태에 있는 다른 리더 DB 인스턴스로 연결을 라우팅합니다. 수동으로 다시 연결하면 RDS 프록시가 이전 리더 인스턴스와 새 리더 인스턴스 간의 복제 지연을 확인하지 않습니다.

 다중 AZ DB 클러스터에 사용 가능한 리더 인스턴스가 없는 경우, RDS 프록시는 리더 엔드포인트가 사용 가능해지면 연결을 시도합니다. 연결 대여 제한 시간 내에 리더 인스턴스가 사용 가능한 상태가 되지 않으면 연결 시도가 실패합니다. 리더 인스턴스를 사용할 수 있게 되면 연결 시도가 성공합니다.

#### 리더 엔드포인트가 쿼리 확장성을 높이는 방법
<a name="rds-proxy-endpoints-reader-scalability"></a>

 프록시용 리더 엔드포인트는 다음과 같은 방법으로 다중 AZ DB 클러스터 쿼리 확장성을 높입니다.
+  가능한 경우 RDS Proxy는 특정 리더 엔드포인트 연결을 사용하는 모든 쿼리 문제에 대해 동일한 리더 DB 인스턴스를 사용합니다. 이렇게 하면 동일한 테이블에 있는 일련의 관련 쿼리가 특정 DB 인스턴스에서 캐싱, 계획 최적화 등을 활용할 수 있습니다.
+  Reader 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 프록시를 사용하면 EC2 인스턴스와 같은 다른 VPC의 리소스에서 한 VPC에 있는 Amazon RDS DB 인스턴스에 대한 액세스를 설정할 수 있습니다. 예를 들어 조직에 동일한 데이터베이스 리소스에 액세스하는 애플리케이션이 여러 개 있을 수 있습니다. 각 애플리케이션은 자체 VPC에 있을 수 있습니다.

 VPC 간 액세스를 활성화하려면 프록시를 위한 새 엔드포인트를 생성합니다. 프록시 자체는 Amazon RDS DB 인스턴스와 동일한 VPC에 상주합니다. 하지만 VPC 간 엔드포인트는 EC2 인스턴스 등의 다른 리소스와 함께 다른 VPC에 상주합니다. VPC 간 엔드포인트는 EC2 및 기타 리소스와 동일한 VPC의 서브넷 및 보안 그룹과 연결됩니다. 이러한 연결을 사용하면 VPC 제한으로 인해 데이터베이스에 액세스할 수 없는 애플리케이션이 엔드포인트에 연결할 수 있습니다.

 다음 단계에서는 RDS Proxy를 통해 VPC 간 엔드포인트를 생성하고 액세스하는 방법을 설명합니다.

1.  VPC 2개를 생성하거나 RDS 작업에 이미 사용 중인 VPC 2개를 선택합니다. 각 VPC에는 인터넷 게이트웨이, 라우팅 테이블, 서브넷 및 보안 그룹과 같은 연결된 자체 네트워크 리소스가 있어야 합니다. VPC가 하나만 있는 경우 [Amazon RDS 시작하기](CHAP_GettingStarted.md)에서 RDS를 성공적으로 사용하기 위해 다른 VPC를 설정하는 단계를 참조하세요. 또한 Amazon EC2 콘솔에서 기존 VPC를 조사하여 함께 연결할 리소스의 종류를 확인할 수 있습니다.

1.  연결할 Amazon RDS DB 인스턴스에 연결된 DB 프록시를 생성합니다. [Amazon RDS용 프록시 만들기](rds-proxy-creating.md)의 절차를 따르십시오.

1.  RDS 콘솔에서 프록시의 [**세부 정보(Details)**] 페이지에 있는 [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 [**엔드포인트 생성(Create endpoint)**]을 선택합니다. [프록시 엔드포인트 생성](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 Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1.  탐색 창에서 **Proxies(프록시)**를 선택합니다.

1.  새 엔드포인트를 생성하려는 프록시의 이름을 클릭합니다.

    해당 프록시에 대한 세부 정보 페이지가 나타납니다.

1.  [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 [**프록시 엔드포인트 생성(Create proxy endpoint)**]을 선택합니다.

    [**프록시 엔드포인트 생성(Create proxy endpoint)**] 창이 나타납니다.

1.  [**프록시 엔드포인트 이름(Proxy endpoint name)**]에 원하는 알기 쉬운 이름을 입력합니다.

1.  [**대상 역할(Target role)**]에서 엔드포인트를 읽기/쓰기와 읽기 전용 중 무엇으로 설정할지 선택합니다.

    읽기/쓰기 엔드포인트를 사용하는 연결은 데이터 정의 언어(DDL) 문, 데이터 조작 언어(DML) 문, 쿼리 등 모든 종류의 작업을 수행할 수 있습니다. 이러한 엔드포인트는 항상 RDS DB 클러스터의 기본 인스턴스에 연결합니다. 애플리케이션에서 단일 엔드포인트만 사용하는 경우 일반 데이터베이스 작업에 읽기/쓰기 엔드포인트를 사용할 수 있습니다. 관리 작업, OLTP(온라인 트랜잭션 처리) 애플리케이션 및 ETL(추출 변환 로드) 작업에 읽기/쓰기 엔드포인트를 사용할 수도 있습니다.

    읽기 전용 엔드포인트를 사용하는 연결은 쿼리만 수행할 수 있습니다. RDS 프록시는 엔드포인트에 대한 각 연결마다 리더 인스턴스 중 하나를 사용할 수 있습니다. 이렇게 하면 쿼리 집약적인 애플리케이션이 다중 AZ DB 클러스터의 클러스터링 기능을 활용할 수 있습니다. 이러한 읽기 전용 연결은 클러스터의 기본 인스턴스에 오버헤드를 발생시키지 않습니다. 이렇게 하면 보고 및 분석 쿼리가 OLTP 애플리케이션의 쓰기 작업 속도를 저하시키지 않습니다.

1.  **Virtual Private Cloud(VPC)**의 경우, 일반적으로 프록시 또는 연결된 데이터베이스에 액세스하는 데 사용하는 것과 동일한 EC2 인스턴스 또는 기타 리소스에서 엔드포인트에 액세스하려면 기본값을 선택합니다. 이 프록시에 대해 VPC 간 액세스를 설정하려면 기본값 이외의 VPC를 선택합니다. VPC 간 액세스에 대한 자세한 내용은 [VPC 간에 RDS 데이터베이스 액세스](rds-proxy-endpoints.md#rds-proxy-cross-vpc) 섹션을 참조하세요.

1.  **엔드포인트 네트워크 유형**에서 프록시 엔드포인트의 IP 버전을 선택합니다. 사용할 수 있는 옵션:
   + **IPv4** - 프록시 엔드포인트는 IPv4 주소만 사용합니다(기본값).
   + **IPv6** - 프록시 엔드포인트는 IPv6 주소만 사용합니다.
   + **듀얼 스택** – 프록시 엔드포인트는 IPv4 및 IPv6 IP 주소를 모두 지원합니다.

   IPv6 또는 듀얼 스택을 사용하려면 선택한 네트워크 유형을 지원하도록 VPC 및 서브넷을 구성해야 합니다.

1.  [**서브넷(Subnets)**]의 경우 RDS Proxy는 기본적으로 연결된 프록시와 동일한 서브넷을 채웁니다. VPC의 주소 범위 중 일부만 연결할 수 있도록 엔드포인트에 대한 액세스를 제한하려면 하나 이상의 서브넷을 제거합니다.

1.  **VPC 보안 그룹**의 경우 기존 보안 그룹을 선택하거나 새 보안 그룹을 생성할 수 있습니다. RDS Proxy는 기본적으로 연결된 프록시와 동일한 보안 그룹 또는 그룹을 채웁니다. 프록시의 인바운드 및 아웃바운드 규칙이 이 엔드포인트에 적합한 경우, 기본 선택 항목을 그대로 두면 됩니다.

    새 보안 그룹을 생성하도록 선택한 경우 이 페이지에서 보안 그룹의 이름을 지정합니다. 그런 다음 EC2 콘솔에서 보안 그룹 설정을 편집합니다.

1.  [**프록시 엔드포인트 생성(Create proxy endpoint)**]을 선택합니다.

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

 프록시 엔드포인트를 생성하려면 AWS CLI [create-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-proxy-endpoint.html) 명령을 사용합니다.

 다음 필수 파라미터를 포함합니다.
+  `--db-proxy-name value` 
+  `--db-proxy-endpoint-name value` 
+  `--vpc-subnet-ids list_of_ids`. 서브넷 ID를 공백으로 구분합니다. VPC 자체의 ID는 지정하지 않습니다.

 다음과 같은 선택적 파라미터도 포함할 수 있습니다.
+  `--target-role { READ_WRITE | READ_ONLY }`이 파라미터의 기본값은 입니다.`READ_WRITE` 프록시가 라이터 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`라는 프록시 엔드포인트를 생성합니다.  
대상 LinuxmacOS, 또는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 Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1.  탐색 창에서 **Proxies(프록시)**를 선택합니다.

1.  목록에서 엔드포인트를 보려는 프록시를 선택합니다. 프록시 이름을 클릭하여 세부 정보 페이지를 봅니다.

1.  [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 보려는 엔드포인트를 선택합니다. 세부 정보 페이지를 보려면 이름을 클릭합니다.

1.  값을 확인하고 싶은 파라미터를 조사합니다. 다음과 같은 속성을 확인할 수 있습니다.
   +  엔드포인트가 읽기/쓰기인지 아니면 읽기 전용인지 여부.
   +  데이터베이스 연결 문자열에 사용하는 엔드포인트 주소.
   +  엔드포인트와 연결된 VPC, 서브넷 및 보안 그룹.

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

 하나 이상의 프록시 엔드포인트를 보려면 AWS CLI [describe-db-proxy-endpoints](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-endpoints.html) 명령을 사용합니다.

 다음과 같은 선택적 파라미터를 포함할 수 있습니다.
+  `--db-proxy-endpoint-name` 
+  `--db-proxy-name` 

 다음 예에서는 `my-endpoint` 프록시 엔드포인트를 설명합니다.

**Example**  
대상 LinuxmacOS, 또는Unix:  

```
aws rds describe-db-proxy-endpoints \
  --db-proxy-endpoint-name my-endpoint
```
Windows의 경우:  

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

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

 하나 이상의 프록시 엔드포인트를 설명하려면 RDS API [DescribeDBProxyEndpoints](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyEndpoints.html) 작업을 사용합니다.

# 프록시 엔드포인트 수정
<a name="rds-proxy-endpoints.ModifyingEndpoint"></a>

프록시 엔드포인트를 수정하려면 다음 지침을 따르세요.

## 콘솔
<a name="rds-proxy-endpoints.ModifyingEndpoint.CON"></a>

**하나 이상의 프록시 엔드포인트를 수정하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1.  탐색 창에서 **Proxies(프록시)**를 선택합니다.

1. 목록에서 엔드포인트를 수정할 프록시를 선택합니다. 프록시 이름을 클릭하여 세부 정보 페이지를 봅니다.

1.  [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 수정할 엔드포인트를 선택합니다. 목록에서 선택하거나 이름을 클릭하여 세부 정보 페이지를 볼 수 있습니다.

1.  프록시 세부 정보 페이지의 [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 [**편집(Edit)**]을 선택합니다. 또는 프록시 엔드포인트 세부 정보 페이지의 **작업**에서 **편집**을 선택합니다.

1.  수정할 파라미터의 값을 변경합니다.

1.  **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` 

 다음 파라미터 중 하나 이상을 사용하여 엔드포인트 속성에 대한 변경 사항을 지정합니다.
+  `--new-db-proxy-endpoint-name` 
+  `--vpc-security-group-ids`. 보안 그룹 ID를 공백으로 구분합니다.

 다음 예에서는 `my-endpoint` 프록시 엔드포인트의 이름을 `new-endpoint-name`으로 변경합니다.

**Example**  
대상 LinuxmacOS, 또는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 프록시가 각 프록시에 대해 자동으로 생성하는 기본 프록시 엔드포인트는 삭제할 수 없습니다.  
 프록시를 삭제하면 RDS Proxy가 모든 연결된 엔드포인트를 자동으로 삭제합니다.

## 콘솔
<a name="rds-proxy-endpoints.DeleteEndpoint.console"></a>

**AWS Management Console을 사용하여 프록시 엔드포인트를 삭제하려면**

1.  탐색 창에서 **Proxies(프록시)**를 선택합니다.

1.  목록에서 엔드포인트를 삭제할 프록시를 선택합니다. 프록시 이름을 클릭하여 세부 정보 페이지를 봅니다.

1.  [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 삭제할 엔드포인트를 선택합니다. 목록에서 하나 이상의 엔드포인트를 선택하거나, 단일 엔드포인트의 이름을 클릭하여 세부 정보 페이지를 볼 수 있습니다.

1.  프록시 세부 정보 페이지의 [**프록시 엔드포인트(Proxy endpoints)**] 섹션에서 [**삭제(Delete)**]를 선택합니다. 또는 프록시 엔드포인트 세부 정보 페이지의 **작업**에서 **삭제**를 선택합니다.

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

 프록시 엔드포인트를 삭제하려면 다음 필수 파라미터를 사용하여 [delete-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-proxy-endpoint.html) 명령을 실행합니다.
+  `--db-proxy-endpoint-name` 

 다음 명령은 `my-endpoint`라는 프록시 엔드포인트를 삭제합니다.

대상 LinuxmacOS, 또는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 프록시 지표 모니터링
<a name="rds-proxy.monitoring"></a>

 Amazon CloudWatch를 사용하여 RDS Proxy를 모니터링할 수 있습니다. CloudWatch는 프록시에서 원시 데이터를 수집하여 읽기 쉬운 실시간 지표로 처리합니다. CloudWatch 콘솔에서 이러한 지표를 찾으려면 **지표**를 선택한 다음 **RDS**, **Per-Proxy Metrics(프록시별 지표)**를 차례로 선택합니다. 자세한 내용은 Amazon CloudWatch 사용 설명서의 [Amazon CloudWatch 지표 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html)을 참조하세요.

**참고**  
 RDS는 프록시와 연결된 각 기본 Amazon EC2 인스턴스에 대해 이러한 지표를 게시합니다. 하나의 프록시가 둘 이상의 EC2 인스턴스에서 사용될 수 있습니다. CloudWatch 통계를 사용하여 연관된 모든 인스턴스에서 프록시 값을 집계합니다.  
 이러한 지표 중 일부는 프록시에 의한 첫 번째 연결이 성공하기 전까지 표시되지 않을 수 있습니다.

 RDS Proxy 로그에서 각 항목에는 연결된 프록시 엔드포인트의 이름이 접두사로 붙습니다. 이 이름은 사용자 정의 엔드포인트에 대해 지정한 이름이거나 읽기/쓰기 요청을 수행하는 프록시의 기본 엔드포인트에 대한 특수 이름(`default`)일 수 있습니다.

 모든 RDS Proxy 지표는 `proxy` 그룹에 있습니다.

 각 프록시 엔드포인트에는 자체 CloudWatch 지표가 있습니다. 각 프록시 엔드포인트의 사용을 독립적으로 모니터링할 수 있습니다. 프록시 엔드포인트에 대한 자세한 내용은 [Amazon RDS 프록시 엔드포인트 작업](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분마다 보고됩니다. 이 지표에 가장 유용한 통계는 합계입니다.  |  1분  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `ClientConnectionsNoTLS`   |  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  |   수신된 쿼리 수입니다. 여러 문을 포함하는 쿼리는 하나의 쿼리로 계산됩니다. 이 지표에 가장 유용한 통계는 `Sum`입니다.  |   1분 이상   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryRequestsNoTLS  |  TLS 이외의 연결에서 받은 쿼리 수입니다. 여러 문을 포함하는 쿼리는 하나의 쿼리로 계산됩니다. 이 지표에 가장 유용한 통계는 Sum입니다. |  1분 이상  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `QueryRequestsTLS`   |  TLS 연결에서 받은 쿼리 수입니다. 여러 문을 포함하는 쿼리는 하나의 쿼리로 계산됩니다. 이 지표에 가장 유용한 통계는 Sum입니다. |  1분 이상  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryResponseLatency  |  쿼리 요청을 받는 시간과 프록시가 응답하는 시간 사이의 시간(마이크로 초)입니다. 이 지표에 가장 유용한 통계는 Average입니다. |  1분 이상  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 

 AWS Management Console의 CloudWatch 아래에서 RDS Proxy 활동 로그를 찾을 수 있습니다. 각 프록시는 **로그 그룹** 페이지에 항목이 있습니다.

**중요**  
 이러한 로그는 프로그래밍 방식 액세스가 아니라 사용자가 문제 해결을 위해 사용하기 위한 로그입니다. 로그의 형식과 내용은 변경될 수 있습니다.  
 특히 이전 로그에는 각 요청의 엔드포인트를 나타내는 접두사가 포함되어 있지 않습니다. 최신 로그에서는 각 항목에 연결된 프록시 엔드포인트의 이름이 접두사로 붙습니다. 이 이름은 사용자 정의 엔드포인트에 대해 지정한 이름이거나, 프록시의 기본 엔드포인트를 사용한 요청을 위한 `default`라는 특수한 이름일 수 있습니다.

# RDS 프록시 이벤트 작업
<a name="rds-proxy.events"></a>

이벤트는 서비스형 소프트웨어(SaaS) 파트너로부터 AWS 환경, 서비스 또는 애플리케이션과 같은 환경의 변화를 나타냅니다.** 또는 사용자 지정 애플리케이션이나 서비스 중 하나일 수 있습니다. 예를 들어 Amazon RDS에서는 RDS 프록시를 생성하거나 수정할 때 이벤트를 생성합니다. Amazon RDS는 거의 실시간으로 Amazon EventBridge에 이벤트를 전송합니다. 다음에서 구독할 수 있는 RDS 프록시 이벤트 목록과 RDS Proxy 이벤트의 예를 찾을 수 있습니다.

이벤트 작업에 대한 자세한 내용은 다음을 참조하세요.
+ AWS Management Console, AWS CLI 또는 RDS API를 사용하여 이벤트를 보는 방법에 대한 지침은 [Amazon RDS 이벤트 보기](USER_ListEvents.md) 섹션을 참조하세요.
+ EventBridge로 이벤트를 전송하도록 Amazon RDS를 구성하는 방법을 알아보려면 [Amazon RDS 이벤트에서 트리거되는 규칙 생성](rds-cloud-watch-events.md) 섹션을 참조하세요.

## RDS 프록시 이벤트
<a name="rds-proxy.events.list"></a>

다음 표에서는 RDS 프록시가 소스 유형일 때 이벤트 범주와 이벤트 목록을 보여줍니다.


|  범주  | RDS 이벤트 ID |  메시지  |  참고  | 
| --- | --- | --- | --- | 
| 구성 변경 | RDS-EVENT-0204 |  RDS가 DB 프록시(*이름*)를 수정했습니다.  | None | 
| 구성 변경 | RDS-EVENT-0207 |  RDS가 DB 프록시(*이름*)의 엔드포인트를 수정했습니다.  | None | 
| 구성 변경 | RDS-EVENT-0213 |  RDS가 DB 인스턴스 추가를 감지하여 DB 프록시(*이름*)의 대상 그룹에 자동으로 추가했습니다.  | None | 
|  구성 변경  | RDS-EVENT-0214 |  RDS가 DB 인스턴스(*이름*)의 삭제를 감지하여 DB 프록시(*이름*)의 대상 그룹(*이름*)에서 자동으로 제거했습니다.  | None | 
|  구성 변경  | RDS-EVENT-0215 |  RDS가 DB 클러스터(*이름*)의 삭제를 감지하여 DB 프록시(*이름*)의 대상 그룹(*이름*)에서 자동으로 제거했습니다.  | None | 
|  생성  | RDS-EVENT-0203 |  RDS가 DB 프록시(*이름*)를 생성했습니다.  | None | 
|  생성  | RDS-EVENT-0206 |  RDS가 DB 프록시(*이름*)에 대한 엔드포인트(*이름*)을 생성했습니다.  | None | 
| 삭제 | RDS-EVENT-0205 |  RDS가 DB 프록시(*이름*)를 삭제했습니다.  | None | 
|  삭제  | RDS-EVENT-0208 |  RDS가 DB 프록시(*이름*)에 대한 엔드포인트(*이름*)을 삭제했습니다.  | None | 
|  실패  | RDS-EVENT-0243 |  서브넷(*이름*)에서 사용할 수 있는 IP 주소가 충분하지 않기 때문에 RDS가 프록시(*이름*)의 용량을 프로비저닝하지 못했습니다. 이러한 문제를 해결하려면 RDS 프록시 설명서의 권장 사항에 따라 서브넷에 최소한의 미사용 IP 주소 개수가 있는지 확인하세요.  |  권장 인스턴스 클래스 수를 확인하려면 [IP 주소 용량 계획](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address) 섹션을 참조하세요.  | 
|  실패 | RDS-EVENT-0275 |  RDS가 DB 프록시 *이름*에 대한 일부 연결을 제한했습니다. 클라이언트에서 프록시로의 동시 연결 요청 수가 제한을 초과했습니다.  | None | 

다음은 JSON 형식의 RDS 프록시 이벤트의 예입니다. 이벤트는 RDS가 `my-rds-proxy`라는 RDS 프록시의 `my-endpoint`라는 엔드포인트를 수정했음을 보여줍니다. 이벤트 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 프록시 문제 해결
<a name="rds-proxy.troubleshooting"></a>

 다음에서 몇 가지 일반적인 RDS 프록시 문제에 대한 문제 해결 아이디어와 RDS 프록시에 대한 CloudWatch 로그에 대한 정보를 찾을 수 있습니다.

 RDS 프록시 로그에서 각 항목에는 연결된 프록시 엔드포인트의 이름이 접두사로 붙습니다. 이 이름은 사용자 정의 엔드포인트에 지정한 이름일 수 있습니다. 아니면 읽기/쓰기 요청을 수행하는 프록시의 기본 엔드포인트에 대한 특수 이름(`default`)일 수 있습니다. 프록시 엔드포인트에 대한 자세한 내용은 [Amazon RDS 프록시 엔드포인트 작업](rds-proxy-endpoints.md) 섹션을 참조하세요.

**Topics**
+ [프록시에 대한 연결 확인](#rds-proxy-verifying)
+ [일반적인 문제 및 해결 방법](#rds-proxy-diagnosis)
+ [RDS for MySQL 관련 RDS 프록시 문제 해결](#rds-proxy-MySQL-troubleshooting)
+ [RDS for PostgreSQL 관련 RDS 프록시 문제 해결](#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 인스턴스와 통신할 수 있는지 확인할 수 있습니다.
+  프록시가 DB 인스턴스에 연결할 수 있는 `State`의 `AVAILABLE` 값입니다.
+  `State`의 `UNAVAILABLE` 값은 임시 또는 영구 연결 문제를 나타냅니다. 이 경우 `Reason` 및 `Description` 필드를 검사합니다. 예를 들어 `Reason`의 값이 `PENDING_PROXY_CAPACITY`인 경우 프록시가 조정 작업을 완료한 후 다시 연결해 보십시오. `Reason`의 값이 `UNREACHABLE`, `CONNECTION_FAILED` 또는 `AUTH_FAILURE`인 경우 `Description` 필드의 설명을 사용하여 문제를 진단합니다.
+  `State` 또는 `REGISTERING`로 변경하기 전에 `AVAILABLE` 필드의 값이 잠시 동안 `UNAVAILABLE`일 수 있습니다.

 다음 Netcat 명령(`nc`)이 성공하면 로그인한 EC2 인스턴스 또는 다른 시스템에서 프록시 엔드포인트에 액세스할 수 있습니다. 이 명령은 프록시 및 연결된 데이터베이스와 동일한 VPC에 있지 않은 경우 실패를 보고합니다. 동일한 VPC에 있지 않아도 데이터베이스에 직접 로그인할 수 있습니다. 그러나 동일한 VPC에 있지 않으면 프록시에 로그인할 수는 없습니다.

```
nc -zx MySQL_proxy_endpoint 3306

nc -zx PostgreSQL_proxy_endpoint 5432
```

 다음 명령을 사용하여 EC2 인스턴스에 필수 속성이 있는지 확인할 수 있습니다. 특히 EC2 인스턴스의 VPC는 프록시가 연결하는 의 VPC와 동일해야 합니다.

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

 프록시에 사용되는 Secrets Manager 비밀을 검사합니다.

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

 `get-secret-value`에서 표시한 `SecretString` 필드가 `username` 및 `password` 필드를 포함하는 JSON 문자열로 인코딩되어 있는지 확인합니다. 다음 예제는 `SecretString` 필드의 형식을 보여 줍니다.

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

IAM 인증 문제를 해결할 때 다음을 확인합니다.
+ 데이터베이스에 IAM 인증이 활성화되어 있습니다.
+ 프록시는 올바른 인증 체계로 구성됩니다.
+ 프록시에 제공된 IAM 역할의 IAM 정책은 적절한 데이터베이스와 해당 사용자 이름에 필요한 `rds-db:connect` 권한을 부여합니다.
+ 엔드 투 엔드 IAM 인증의 경우 IAM 사용자 또는 역할 이름과 일치하는 데이터베이스 사용자가 있습니다.
+ 연결에 대해 SSL/TLS가 활성화됩니다.

## 일반적인 문제 및 해결 방법
<a name="rds-proxy-diagnosis"></a>

이 섹션에서는 RDS 프록시를 사용할 때 발생하는 몇 가지 일반적인 문제와 잠재적 해결 방법에 대해 설명합니다.

`aws rds describe-db-proxy-targets` CLI 명령을 실행한 후 `TargetHealth` 설명에 `Proxy does not have any registered credentials`라고 표시되면 다음을 확인하세요.
+ 사용자가 프록시에 액세스할 수 있도록 등록된 보안 인증 정보가 있습니다.
+ 프록시에서 사용하는 Secrets Manager 보안 암호에 액세스하는 IAM 역할은 유효합니다.

DB 프록시를 생성하거나 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 프록시 문제 해결
<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.  |   프록시에서 **전송 계층 보안 필요** 설정을 활성화했지만 연결에 MySQL 클라이언트의 파라미터 `ssl-mode=DISABLED`가 포함되었습니다. 다음 중 하나를 수행하십시오. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/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/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 

## RDS for PostgreSQL 관련 RDS 프록시 문제 해결
<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 프록시에 대한 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.`   |   사용자가 **전송 계층 보안 필요** 설정을 활성화했지만 PostgreSQL 클라이언트에서 `sslmode=disable`로 연결하려고 시도했습니다.  |   이 오류를 해결하려면 다음 중 하나를 수행합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   이 오류를 해결하려면 다음을 수행하십시오. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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 프록시에서 지원되지 않는 스트리밍 복제 모드를 사용하려고 합니다.  |   연결하는 데 사용되는 PostgreSQL 클라이언트에서 스트리밍 복제 모드를 해제하세요.  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support the option option_name.`   |   시작 메시지를 통해 프록시에 연결하는 데 사용되는 PostgreSQL 클라이언트가 현재 RDS 프록시에서 지원되지 않는 옵션을 요청하고 있습니다.  |   연결하는 데 사용되는 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 프록시로의 활성 연결 수를 줄이세요.  | 
|  `ERROR 53300: Rate of connection to proxy exceeded number_value.`   |   클라이언트에서 프록시로의 연결 요청 속도가 제한을 초과했습니다.  |   PostgreSQL 클라이언트로부터의 연결이 설정되는 속도를 줄이세요.  | 
|  `ERROR XX000: Unknown error.`   |   알 수 없는 오류가 발생했습니다.  |   문제를 조사할 수 있도록 AWS Support에 문의해 주세요.  | 
|  `ERROR 08000: Timed-out waiting to acquire database connection.`   |   `ConnectionBorrowTimeout` 설정에 지정된 기간 내에 데이터베이스 연결을 획득하기 위해 대기 중인 프록시 제한 시간입니다. 몇 가지 가능한 이유는 다음과 같습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   가능한 해결책은 다음과 같습니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR XX000: Request returned an error: database_error.`   |   프록시에서 설정된 데이터베이스 연결이 오류를 반환했습니다.  |   솔루션은 특정 데이터베이스 오류에 따라 다릅니다. 예를 들면 다음과 같습니다. `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 프록시가 데이터베이스에 연결할 수 없습니다. 이는 프록시의 `DefaultAuthScheme` 파라미터가 등록된 사용자와 함께 `IAM_AUTH`로 설정되어 있지만 클라이언트가 IAM 인증 대신 암호 인증을 사용하는 경우에 발생합니다.  |  프록시에 대한 클라이언트 연결에 대해 IAM 인증을 활성화하고 다시 시도하세요.  | 
|  `ERROR 28000: Configure IAM authentication as the DefaultAuthScheme in your proxy and try again.`  |  `DefaultAuthScheme`이 `IAM_AUTH`로 설정되지 않았기 때문에 RDS 프록시가 데이터베이스에 연결할 수 없습니다. 프록시의 `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 인스턴스에 연결할 수 있는 프록시가 포함될 수 있습니다. CloudFormation의 RDS Proxy 지원에는 두 가지 새로운 레지스트리 유형인 `DBProxy` 및 `DBProxyTargetGroup`이 포함됩니다 

 다음 목록은 RDS Proxy에 대한 샘플 CloudFormation 템플릿을 보여줍니다.

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

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

 이 샘플의 리소스에 대한 자세한 내용은 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html) 및 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html)을 참조하세요.

 CloudFormation을 사용하여 생성할 수 있는 리소스에 대한 자세한 내용은 [RDS 리소스 유형 참조](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_RDS.html)를 확인하세요.