RDS Proxy 문제 해결 - Amazon Relational Database Service

RDS Proxy 문제 해결

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

RDS Proxy 로그에서 각 항목에는 연결된 프록시 엔드포인트의 이름이 접두사로 붙습니다. 이 이름은 사용자 정의 엔드포인트에 대해 지정한 이름이거나, 프록시의 기본 엔드포인트를 사용한 읽기/쓰기 요청을 위한 default라는 특수한 이름일 수 있습니다. 프록시 엔드포인트에 대한 자세한 내용은 Amazon RDS 프록시 엔드포인트 작업 섹션을 참조하세요.

프록시에 대한 연결 확인

다음 명령을 사용하여 연결 메커니즘의 모든 구성 요소가 다른 구성 요소와 통신할 수 있는지 확인할 수 있습니다.

describe-db-proxies 명령을 사용하여 프록시 자체를 검사합니다. 또한 describe-db-proxy-target-groups를 사용하여 연결된 대상 그룹을 검사합니다. 대상의 세부 정보가 프록시와 연결하려는 RDS DB 인스턴스 또는 Aurora 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 명령을 사용하여 대상 그룹에 지정된 대상을 검사합니다. 다음과 같은 명령을 사용합니다.

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

describe-db-proxy-targets 명령의 출력에는 TargetHealth 필드가 포함됩니다. State 내부의 Reason, DescriptionTargetHealth 필드를 검사하여 프록시가 기본 DB 인스턴스와 통신할 수 있는지 확인할 수 있습니다.

  • 프록시가 DB 인스턴스에 연결할 수 있는 StateAVAILABLE 값입니다.

  • StateUNAVAILABLE 값은 임시 또는 영구 연결 문제를 나타냅니다. 이 경우 ReasonDescription 필드를 검사합니다. 예를 들어 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는 프록시가 연결하는 RDS DB 인스턴스 또는 Aurora DB 클러스터의 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

SecretString에 표시된 get-secret-value 필드가 usernamepassword 필드를 포함하는 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 }

일반적인 문제 및 해결 방법

RDS Proxy 사용 시 발생할 수 있는 몇 가지 일반적인 문제에 대한 가능한 원인과 해결 방법은 다음을 참조하십시오.

새 프록시를 생성하거나 프록시에 연결하는 동안 다음과 같은 문제가 발생할 수 있습니다.

오류 원인 또는 해결 방법

403: The security token included in the request is invalid

새 IAM 역할을 생성하는 대신 기존 IAM 역할을 선택합니다.

MySQL 프록시에 연결하는 동안 다음과 같은 문제가 발생할 수 있습니다.

오류 원인 또는 해결 방법
ERROR 1040 (HY000): Connections rate limit exceeded (limit_value) 클라이언트에서 프록시로의 연결 요청 속도가 제한을 초과했습니다.
ERROR 1040 (HY000): IAM authentication rate limit exceeded 클라이언트에서 프록시로의 IAM 인증을 사용하는 동시 요청 수가 제한을 초과했습니다.
ERROR 1040 (HY000): Number simultaneous connections exceeded (limit_value) 클라이언트에서 프록시로의 동시 연결 요청 수가 제한을 초과했습니다.

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_set_client'' 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가 포함되었습니다. 다음 중 하나를 수행하십시오.

  • 프록시에 대해 전송 계층 보안 필요 설정을 비활성화합니다.

  • PostgreSQL 클라이언트에서 ssl-mode=REQUIRED의 최소 설정을 사용하여 데이터베이스에 연결합니다.

ERROR 2026 (HY000): SSL connection error: Internal Server Error

프록시에 대한 TLS 핸드셰이크가 실패했습니다. 몇 가지 가능한 이유는 다음과 같습니다.

  • SSL은 필요하지만 서버는 이를 지원하지 않습니다.

  • 내부 서버 오류가 발생했습니다.

  • 잘못된 핸드셰이크가 발생했습니다.

ERROR 9501 (HY000): Timed-out waiting to acquire database connection

데이터베이스 연결을 얻기 위해 대기 중인 프록시 시간이 초과되었습니다. 몇 가지 가능한 이유는 다음과 같습니다.

  • 최대 연결에 도달했기 때문에 프록시가 데이터베이스 연결을 설정할 수 없습니다.

  • 데이터베이스를 사용할 수 없으므로 프록시가 데이터베이스 연결을 설정할 수 없습니다.

PostgreSQL 프록시에 연결하는 동안 다음과 같은 문제가 발생할 수 있습니다.

오류 원인 솔루션

IAM authentication is allowed only with SSL connections.

사용자가 PostgreSQL 클라이언트에서 sslmode=disable 설정이 있는 IAM 인증을 사용하여 데이터베이스에 연결하려고 했습니다.

사용자는 PostgreSQL 클라이언트에서 sslmode=require의 최소 설정을 사용하여 데이터베이스에 연결해야 합니다. 자세한 내용은 PostgreSQL SSL 지원 설명서를 참조하십시오.

This RDS Proxy requires TLS connections.

사용자가 전송 계층 보안 필요 설정을 활성화했지만 PostgreSQL 클라이언트에서 sslmode=disable로 연결하려고 시도했습니다.

이 오류를 해결하려면 다음 중 하나를 수행합니다.

  • 프록시의 전송 계층 보안 필요 옵션을 비활성화합니다.

  • PostgreSQL 클라이언트에서 sslmode=allow의 최소 설정을 사용하여 데이터베이스에 연결합니다.

IAM authentication failed for user user_name. Check the IAM token for this user and try again.

이 오류는 다음과 같은 이유 때문일 수 있습니다.

  • 클라이언트가 잘못된 IAM 사용자 이름을 제공했습니다.

  • 클라이언트가 사용자에게 잘못된 IAM 권한 부여 토큰을 제공했습니다.

  • 클라이언트가 필요한 권한이 없는 IAM 정책을 사용하고 있습니다.

  • 클라이언트가 사용자에게 만료된 IAM 권한 부여 토큰을 제공했습니다.

이 오류를 해결하려면 다음을 수행하십시오.

  1. 제공된 IAM 사용자가 있는지 확인합니다.

  2. IAM 권한 부여 토큰이 제공된 IAM 사용자에 속하는지 확인합니다.

  3. IAM 정책에 RDS에 대한 적절한 권한이 있는지 확인합니다.

  4. 사용된 IAM 권한 부여 토큰의 유효성을 확인합니다.

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 supports only IAM or MD5 authentication.

프록시에 연결하는 데 사용되는 데이터베이스 클라이언트가 프록시에서 현재 지원하지 않는 인증 메커니즘(예: SCRAM-SHA-256)을 사용하고 있습니다.

IAM 인증을 사용하지 않는 경우 MD5 암호 인증만 사용하세요.

A user name is missing from the connection startup packet. Provide a user name for this connection.

연결을 설정하려고 할 때 프록시에 연결하는 데 사용되는 데이터베이스 클라이언트가 사용자 이름을 전송하지 않습니다.

선택한 PostgreSQL 클라이언트를 사용하여 프록시에 대한 연결을 설정할 때 사용자 이름을 정의해야 합니다.

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보다 크거나 같은 버전을 사용하세요.

Feature not supported: RDS Proxy currently doesn't support streaming replication mode.

프록시에 연결하는 데 사용되는 PostgreSQL 클라이언트가 현재 RDS 프록시에서 지원되지 않는 스트리밍 복제 모드를 사용하려고 합니다.

연결하는 데 사용되는 PostgreSQL 클라이언트에서 스트리밍 복제 모드를 해제하세요.

Feature not supported: RDS Proxy currently doesn't support the option option_name.

시작 메시지를 통해 프록시에 연결하는 데 사용되는 PostgreSQL 클라이언트가 현재 RDS 프록시에서 지원되지 않는 옵션을 요청하고 있습니다.

연결하는 데 사용되는 PostgreSQL 클라이언트에서 위의 메시지에서 지원되지 않는 것으로 표시되는 옵션을 해제하세요.

The IAM authentication failed because of too many competing requests.

클라이언트에서 프록시로의 IAM 인증을 사용하는 동시 요청 수가 제한을 초과했습니다.

PostgreSQL 클라이언트에서 IAM 인증을 사용하는 연결이 설정되는 속도를 줄이세요.

The maximum number of client connections to the proxy exceeded number_value.

클라이언트에서 프록시로의 동시 연결 요청 수가 제한을 초과했습니다.

PostgreSQL 클라이언트에서 이 RDS 프록시로의 활성 연결 수를 줄이세요.

Rate of connection to proxy exceeded number_value.

클라이언트에서 프록시로의 연결 요청 속도가 제한을 초과했습니다.

PostgreSQL 클라이언트로부터의 연결이 설정되는 속도를 줄이세요.

The password that was provided for the role role_name is wrong.

이 역할의 암호가 Secrets Manager 암호와 일치하지 않습니다.

Secrets Manager에서 이 역할의 암호를 확인하여 암호가 PostgreSQL 클라이언트에서 사용 중인 암호와 같은지 확인하세요.

The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.

IAM 인증에 사용되는 IAM 토큰에 문제가 있습니다.

새 인증 토큰을 생성하여 새 연결에 사용하세요.

IAM is allowed only with SSL connections.

클라이언트가 IAM 인증을 사용하여 연결을 시도했지만 SSL이 활성화되지 않았습니다.

PostgreSQL 클라이언트에서 SSL을 활성화하세요.

Unknown error.

알 수 없는 오류가 발생했습니다.

문제를 조사할 수 있도록 AWS Support에 문의해 주세요.

Timed-out waiting to acquire database connection.

데이터베이스 연결을 얻기 위해 대기 중인 프록시 시간이 초과되었습니다. 몇 가지 가능한 이유는 다음과 같습니다.

  • 최대 연결에 도달했기 때문에 프록시가 데이터베이스 연결을 설정할 수 없습니다.

  • 데이터베이스를 사용할 수 없으므로 프록시가 데이터베이스 연결을 설정할 수 없습니다.

가능한 해결책은 다음과 같습니다.

  • RDS DB 인스턴스 또는 Aurora DB 클러스터 상태의 대상을 확인하여 사용할 수 없는지 확인합니다.

  • 실행 중인 장기 실행 트랜잭션 및/또는 쿼리가 있는지 확인합니다. 연결 풀에서 데이터베이스 연결을 오랫동안 사용할 수 있습니다.

Request returned an error: database_error.

프록시에서 설정된 데이터베이스 연결이 오류를 반환했습니다.

솔루션은 특정 데이터베이스 오류에 따라 다릅니다. 예를 들면 다음과 같습니다. Request returned an error: database "your-database-name" does not exist 즉, 지정된 데이터베이스 이름 또는 데이터베이스 이름으로 사용되는 사용자 이름(데이터베이스 이름을 지정하지 않은 경우)이 데이터베이스 서버에 존재하지 않습니다.