AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Amazon RDS DB 인스턴스에 연결 시 발생하는 문제를 해결하려면 어떻게 해야 합니까?
Amazon Relational Database Service(Amazon RDS) DB 인스턴스에 연결할 수 없는 이유를 해결하려고 합니다.
간략한 설명
Amazon RDS DB 인스턴스 연결이 실패할 수 있는 이유는 다음과 같습니다.
- DB 인스턴스에 연결하기 위한 소스에는 보안 그룹, 네트워크 액세스 제어 목록(ACL) 또는 로컬 방화벽에 권한 부여 액세스 권한이 없습니다.
- 클라이언트 애플리케이션에서 DB 인스턴스로 향하는 네트워크 경로가 라우팅 테이블에 없습니다.
- DB 인스턴스에 연결하는 데 잘못된 DNS 이름 또는 엔드포인트를 사용합니다.
- DB 인스턴스는 공개적으로 액세스할 수 없으며 인터넷을 통해 연결할 수 없습니다.
- 다중 AZ DB 인스턴스가 장애 조치되었고 보조 DB 인스턴스가 인바운드 연결을 허용하지 않는 서브넷 또는 라우팅 테이블을 사용합니다.
- 사용자 인증이 올바르지 않습니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
Amazon RDS DB 인스턴스 연결 문제를 해결하려면 다음 작업을 완료하십시오.
자동 진단 사용
연결 문제를 빠르게 파악할 수 있는 자동화된 도구로 시작합니다.
다음 단계를 완료하십시오.
- 자동 진단 도구를 실행하려면 다음과 같은 start-automation-execution AWS Systems Manager 명령을 사용합니다.
참고: EC2-INSTANCE-ID를 EC2 인스턴스 ID로 바꾸고 DB-INSTANCE-NAME을 RDS 인스턴스 식별자로 바꿉니다.aws ssm start-automation-execution \ --document-name "AWSSupport-TroubleshootConnectivityToRDS" \ --parameters "InstanceId=EC2-INSTANCE-ID,DBInstanceIdentifier=DB-INSTANCE-NAME" - 자동화 결과를 확인하려면 다음 get-automation-execution 명령을 실행합니다.
참고: EXECUTION-ID를 1번 단계의 실행 ID로 바꿉니다.aws ssm get-automation-execution \ --automation-execution-id EXECUTION-ID
런북을 실행하는 방법에 대한 설명과 확인 항목에 대한 세부 정보는 AWSSupport-TroubleshootConnectivityToRDS를 참조하십시오.
DB 인스턴스 상태 확인
DB 인스턴스를 사용할 수 있고 연결할 준비가 되었는지 확인합니다.
다음 단계를 완료하십시오.
- DB 인스턴스 상태를 확인하려면 다음 describe-db-instances 명령을 실행합니다.
참고: DB-INSTANCE-NAME을 Amazon RDS 인스턴스 식별자로 바꿉니다.aws rds describe-db-instances \ --db-instance-identifier DB-INSTANCE-NAME \ --query 'DBInstances[*].DBInstanceStatus' - 연결을 시도하기 전에 사용 가능 상태가 표시될 때까지 기다립니다. 새 인스턴스 또는 재부팅된 인스턴스를 사용할 수 있게 되려면 최대 20분이 걸릴 수 있습니다.
보안 그룹 규칙 확인
보안 그룹은 Amazon RDS 인스턴스에 대한 네트워크 액세스를 제어합니다. 소스의 트래픽을 허용하는지 확인합니다.
다음 단계를 완료하십시오.
- Amazon RDS 인스턴스에 연결된 보안 그룹을 식별하려면 다음 describe-db-instances 명령을 실행합니다.
참고: DB-INSTANCE-NAME을 RDS 인스턴스 식별자로 바꿉니다.aws rds describe-db-instances \ --db-instance-identifier DB-INSTANCE-NAME \ --query 'DBInstances[*].VpcSecurityGroups[*].VpcSecurityGroupId' - 각 보안 그룹의 인바운드 규칙을 확인하려면 다음 describe-security-groups 명령을 실행합니다.
참고: SECURITY-GROUP-ID를 1번 단계의 각 보안 그룹 ID로 바꿉니다.aws ec2 describe-security-groups \ --group-ids SECURITY-GROUP-ID \ --query 'SecurityGroups[*].IpPermissions' - IP 주소를 허용하는 규칙을 추가하려면 다음과 같은 authorize-security-group-ingress 명령을 실행합니다.
참고: SECURITY-GROUP-ID를 보안 그룹 ID로 바꿉니다. DATABASE-PORT를 데이터베이스 포트(MySQL의 경우 3306, PostgreSQL의 경우 5432)로 바꿉니다. YOUR-IP-ADDRESS를 퍼블릭 IP 주소로 바꿉니다.aws ec2 authorize-security-group-ingress \ --group-id SECURITY-GROUP-ID \ --protocol tcp \ --port DATABASE-PORT \ --cidr YOUR-IP-ADDRESS/32
네트워크 ACL 규칙 확인
네트워크 액세스 제어 목록(ACL)은 서브넷 수준의 보안을 제공합니다. 데이터베이스 트래픽을 허용하는지 확인합니다.
다음 단계를 완료하십시오.
- Amazon RDS 서브넷의 네트워크 액세스 제어 목록(ACL)을 확인하려면 다음 describe-network-acls 명령을 실행합니다.
참고: SUBNET-ID를 RDS 서브넷 ID로 바꿉니다.aws ec2 describe-network-acls \ --filters "Name=association.subnet-id,Values=SUBNET-ID" \ --query 'NetworkAcls[*].NetworkAclId' - 네트워크 액세스 제어 목록(ACL) 규칙을 확인하려면 다음 describe-network-acls 명령을 실행합니다.
참고: NETWORK-ACL-ID를 1번 단계의 네트워크 ACL ID로 바꿉니다.aws ec2 describe-network-acls \ --network-acl-ids NETWORK-ACL-ID \ --query 'NetworkAcls[*].Entries' - 인바운드 규칙이 데이터베이스 포트에서 트래픽을 허용하고 아웃바운드 규칙이 임시 포트(1024-65535)를 허용하는지 확인합니다.
라우팅 테이블 구성 확인
라우팅 테이블은 네트워크 트래픽을 전달합니다. Amazon RDS 인스턴스에 적절한 라우팅을 제공하는지 확인합니다.
다음 단계를 완료하십시오.
- Amazon RDS 서브넷의 라우팅 테이블을 확인하려면 다음 describe-route-tables 명령을 실행합니다.
CMD
참고: SUBNET-ID를 RDS 서브넷 ID로 바꿉니다. - 퍼블릭 액세스의 경우 인터넷 게이트웨이([IP_ADDRESS])로 향하는 경로가 있는지 확인합니다.
- 프라이빗 액세스의 경우 NAT 게이트웨이, VPC 피어링 연결 또는 VPN 게이트웨이에 대한 경로를 적절하게 확인합니다.
자세한 내용은 Amazon RDS DB 인스턴스의 IP 주소 관련 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.
DNS 확인 실패 확인
Amazon RDS 엔드포인트가 올바른 IP 주소로 확인되는지 확인합니다.
다음 단계를 완료하십시오.
-
클라이언트에서 DNS 확인을 테스트하려면 다음 명령을 실행합니다.
nslookup RDS-ENDPOINT참고: RDS-ENDPOINT를 RDS 인스턴스 엔드포인트로 바꿉니다.
-
dig 명령으로 테스트하려면 다음 명령을 실행합니다.
dig RDS-ENDPOINT -
DNS 확인에 실패할 경우 Amazon VPC DNS 설정을 확인하거나 다른 DNS 서버를 사용합니다.
네트워크 연결 테스트
데이터베이스 인증을 테스트하기 전에 RDS 인스턴스에 대한 네트워크 연결을 확인합니다.
다음 단계를 완료하십시오.
-
Amazon RDS 인스턴스에 대한 연결을 테스트하려면 다음 telnet 명령을 실행합니다.
telnet RDS-ENDPOINT DATABASE-PORT참고: RDS-ENDPOINT를 RDS 엔드포인트로, DATABASE-PORT를 데이터베이스 포트로 바꿉니다.
-
netcat으로 테스트하려면 다음 명령을 실행합니다.
nc -zv RDS-ENDPOINT DATABASE-PORT -
연결에 성공하면 인증 관련 문제일 수 있습니다. 실패할 경우 네트워크 관련 문제입니다.
자세한 내용은 VPC Reachability Analyzer를 사용하여 Amazon RDS 데이터베이스에 대한 네트워크 연결 문제 해결을 참조하십시오.
데이터베이스 인증 확인
데이터베이스 자격 증명과 인증 방법을 확인합니다.
다음 단계를 완료하십시오.
- MySQL의 암호 인증을 테스트하려면 다음 명령을 실행합니다.
참고: RDS-ENDPOINT를 엔드포인트로, DATABASE-PORT를 포트로, USERNAME을 데이터베이스 사용자 이름으로 바꿉니다.mysql -h RDS-ENDPOINT -P DATABASE-PORT -u USERNAME -p - PostgreSQL의 암호 인증을 테스트하려면 다음 명령을 실행합니다.
참고: RDS-ENDPOINT, DATABASE-PORT, USERNAME 및 DATABASE-NAME을 해당 값으로 바꿉니다.psql -h RDS-ENDPOINT -p DATABASE-PORT -U USERNAME -d DATABASE-NAME - 필요한 경우 마스터 암호를 재설정하려면 다음 modify-db-instance 명령을 실행합니다.
참고: DB-INSTANCE-NAME을 인스턴스 식별자로 바꾸고 NEW-PASSWORD를 새 암호로 바꿉니다.aws rds modify-db-instance \ --db-instance-identifier DB-INSTANCE-NAME \ --master-user-password NEW-PASSWORD \ --apply-immediately
연결 제한 확인
Amazon RDS 인스턴스가 연결 제한에 도달하지 않았는지 확인합니다.
다음 단계를 완료하십시오.
-
MySQL의 현재 연결을 확인하려면 데이터베이스에 연결하고 다음 쿼리를 실행합니다.
SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections'; -
PostgreSQL의 현재 연결을 확인하려면 다음 쿼리를 실행합니다.
SELECT count(*) FROM pg_stat_activity; SHOW max_connections; -
MySQL에서 연결 오류를 확인하려면 다음 쿼리를 실행합니다.
SHOW STATUS LIKE 'Connection_errors%'; SHOW STATUS LIKE 'Max_used_connections';
Amazon RDS 인스턴스가 연결 제한에 도달하면 다음 단계를 완료하십시오.
-
종료될 수 있는 유휴 연결을 식별하려면 MySQL에 대해 다음 쿼리를 실행합니다.
SELECT id, user, host, db, command, time, state, info FROM information_schema.processlist WHERE command = 'Sleep' AND time > 300 ORDER BY time DESC; -
MySQL에서 유휴 연결을 종료하려면 다음 명령을 실행합니다.
CALL mysql.rds_kill(CONNECTION-ID);참고: CONNECTION-ID를 1번 단계의 연결 ID로 바꿉니다.
-
max_connections 파라미터를 늘리려면 다음 modify-db-parameter-group 명령을 실행합니다.
aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_connections,ParameterValue=NEW-VALUE,ApplyMethod=pending-reboot"참고: PARAMETER-GROUP-NAME을 파라미터 그룹 이름으로 바꾸고 NEW-VALUE를 원하는 연결 제한으로 바꿉니다. max_connections를 변경한 후에는 재부팅해야 합니다.
-
파라미터 변경 사항을 적용하려면 Amazon RDS 인스턴스를 재부팅합니다. 다음 reboot-db-instance 명령을 실행합니다.
aws rds reboot-db-instance \ --db-instance-identifier DB-INSTANCE-NAME참고: DB-INSTANCE-NAME을 Amazon RDS 인스턴스 식별자로 바꿉니다.
-
RDS 프록시를 사용하여 연결 풀링을 구현하려면 다음 create-db-proxy 명령을 실행합니다.
aws rds create-db-proxy \ --db-proxy-name PROXY-NAME \ --engine-family mysql \ --target-group-config DBInstanceIdentifiers=DB-INSTANCE-NAME \ --vpc-subnet-ids SUBNET-ID-1,SUBNET-ID-2 \ --auth AuthScheme=SECRETS,SecretArn=SECRET-ARN참고: PROXY-NAME, DB-INSTANCE-NAME, SUBNET-ID-1, SUBNET-ID-2 및 SECRET-ARN을 해당 값으로 바꿉니다.
사용자별 연결 제한 확인
다음 단계를 완료하십시오.
-
현재 max_user_connections를 확인하려면 다음 쿼리를 실행합니다.
SHOW VARIABLES LIKE 'max_user_connections'; -
사용자별 현재 연결을 확인하려면 다음 쿼리를 실행합니다.
SELECT user, COUNT(*) as connection_count FROM information_schema.processlist GROUP BY user ORDER BY connection_count DESC; -
특정 사용자가 연결 제한에 도달했는지 확인하려면 다음 쿼리를 실행합니다.
SELECT user, max_user_connections FROM mysql.user WHERE user = 'USERNAME';참고: USERNAME을 연결 문제가 발생한 특정 사용자 이름으로 바꿉니다.
max_user_connections 파라미터는 전체 연결 제한에 도달하지 않은 경우에도 특정 사용자의 연결을 방지할 수 있습니다.
Amazon RDS 인스턴스가 최대 사용자 연결에 도달하면 다음 단계를 완료하십시오.
- max_user_connections 파라미터를 전역적으로 늘리려면 다음 modify-db-parameter-group 명령을 실행합니다.
참고: PARAMETER-GROUP-NAME을 파라미터 그룹 이름으로 바꾸고 NEW-VALUE를 원하는 사용자당 연결 제한으로 바꿉니다.aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_user_connections,ParameterValue=NEW-VALUE,ApplyMethod=immediate" - 특정 사용자 계정의 연결 제한을 수정하려면 다음 쿼리를 실행합니다.
참고: USERNAME을 사용자 이름으로 바꾸고 NEW-LIMIT를 해당 사용자에 대해 원하는 연결 제한으로 바꿉니다.ALTER USER 'USERNAME'@'%' WITH MAX_USER_CONNECTIONS NEW-LIMIT;
자세한 내용은 MySQL 웹 사이트의 계정 리소스 제한 설정을 참조하십시오.
연결 오류 제한 확인
다음 단계를 완료하십시오.
-
Amazon RDS for MySQL의 현재 max_connect_errors를 확인하려면 다음 쿼리를 실행합니다.
SHOW VARIABLES LIKE 'max_connect_errors'; -
현재 차단된 호스트가 있는지 확인하려면 다음 쿼리를 실행합니다.
SELECT * FROM performance_schema.host_cache WHERE SUM_CONNECT_ERRORS > 0; -
호스트의 현재 연결 오류 수를 확인하려면 다음 쿼리를 실행합니다.
SELECT HOST, SUM_CONNECT_ERRORS, COUNT_HANDSHAKE_ERRORS, COUNT_AUTHENTICATION_ERRORS FROM performance_schema.host_cache WHERE HOST = 'YOUR-CLIENT-IP';참고: YOUR-CLIENT-IP를 실제 클라이언트 IP 주소로 바꿉니다.
-
호스트 캐시를 플러시하고 모든 호스트의 차단을 해제하려면 다음 쿼리를 실행합니다.
FLUSH HOSTS; -
향후 차단을 방지하기 위해 max_connect_errors 파라미터를 늘리려면 다음 modify-db-parameter-group 명령을 실행합니다.
aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_connect_errors,ParameterValue=NEW-VALUE,ApplyMethod=immediate"참고: PARAMETER-GROUP-NAME을 파라미터 그룹 이름으로 바꾸고 NEW-VALUE를 더 높은 제한(예: 1000000)으로 바꿉니다.
-
파라미터 변경 사항이 적용되었는지 확인하려면 1번 단계의 쿼리를 다시 실행하고 새 값을 확인합니다.
자세한 내용은 Amazon RDS for MySQL에서 ‘Host is blocked because of many connections errors’ 오류를 해결하려면 어떻게 해야 합니까?를 참조하십시오.
관련 정보
Amazon RDS DB 인스턴스에 연결할 수 없습니다
SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터에 대한 연결 암호화
Amazon VPC의 퍼블릭 또는 프라이빗 서브넷을 사용하는 Amazon RDS DB 인스턴스에 연결하려면 어떻게 해야 합니까?

