

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