programing

EC2 인스턴스에서 RDS 인스턴스에 연결할 수 없습니다.

minecode 2022. 10. 21. 21:38
반응형

EC2 인스턴스에서 RDS 인스턴스에 연결할 수 없습니다.

EC2 instance i-78a8df00에서 RDS instance mysql에 접속하려고 합니다.*******.us-east-1.rds.amazonaws.com.그들은 둘 다 미국 동부 지역에 있다.RDS 보안 그룹에 EC2 인스턴스 보안 그룹(sg-********)을 추가했지만 도움이 되지 않았습니다.이 명령어를 실행하면 타임아웃이 되기 때문에 방화벽/DNS의 문제로 보입니다.

ubuntu@ip-10-195-189-237:~$ mysql -h mysql.************.us-east-1.rds.amazonaws.com

오류 2003(HY000):mysql의 MySQL 서버에 연결할 수 없습니다.*******.us-east-1.rds.amazonaws.com' (110)

위와 같은 회선을 사용하여 로컬머신에서 RDS 인스턴스에 정상적으로 접속할 수 있습니다.다양한 포럼 솔루션을 시도했지만 도움이 되지 않습니다.

새로운 EC2 인스턴스를 회전시켰을 때도 같은 문제가 있었습니다만, RDS 인스턴스의 포트 3306에 접속할 수 있는 착신 IP 주소의 RDS 보안 그룹의 설정을 변경하지 않았습니다.

RDS 대시보드의 Security Groups라고 불리는 옵션 중 하나가 혼란스러운 비트였습니다.당신은 문제를 해결하기 위해 그것이 필요하지 않아요.

필요한 것은 다음과 같습니다.

  • RDS 인스턴스 목록으로 이동
  • 연결하려는 인스턴스를 클릭합니다.
  • Security Group rules 섹션을 클릭합니다.

여기에 이미지 설명 입력

그러면 Security Group 세부 정보가 포함된 새 브라우저 탭 또는 창이 열립니다.아래쪽에서 여러 탭을 찾은 후 인바운드 규칙 탭을 선택하고 편집 버튼을 클릭합니다.

여기에 이미지 설명 입력

값을 EC2 인스턴스 또는 IPv4 CIDR 블록의 IP 주소로 변경합니다.

174.33.0.0/16

이 값을 얻으려면 instance에 ssh로 접속하여 ip addr을 실행하거나 브라우저에서 EC2 Manager를 실행하여 인스턴스 상세에서 Private IP 값을 찾습니다.

RDS 또는 RedShift에 연결하려고 할 때 유사한 문제가 발생할 수 있는 사용자를 위한 추가 정보:

1) 보안그룹 확인

RDS 인스턴스의 Security Group에서 소스 서버가 속한 Security Group(또는 AWS 외부에 있는 경우 해당 IP가 직접 추가됨)에서 액세스할 수 있는지 확인합니다.참조할 Security Group은 RDS 콘솔 UI('security group'이라는 이름)에서 RDS 인스턴스 속성으로 지정된 Security Group입니다.

참고: 데이터베이스 Security Group은 AWS EC2 Security Group과 다를 수 있습니다.RDS 인스턴스가 클래식/퍼블릭 EC2에 있는 경우 RDS UI의 "데이터베이스 보안 그룹" 섹션에서 체크인해야 합니다.VPC 사용자의 경우 Security Group은 일반 VPC Security Group이 됩니다(RDS 인스턴스의 Atribut에 sg-xx라는 이름이 표시됩니다).

2) DNS가 문제가 아님을 확인합니다.

Amazon은 분할 DNS를 사용하므로 AWS 외부 DNS 조회는 공용 IP를 반환하고 AWS 내부 조회는 개인 IP를 반환합니다.DNS 문제가 의심될 경우 다른 가용성 영역에서 다른 IP가 반환되는지 확인했습니까?AZ마다 IP가 다를 경우 AWS 지원에 문의해야 합니다.

3) 소켓 접속을 확립하여 네트워크 접속을 확인합니다.

RDS는 현재 ICMP 트래픽을 드롭하고 있기 때문에 tracerpath나 traceroute 등의 툴은 도움이 되지 않을 가능성이 있습니다.

포트 3306(mysql, postgres의 경우 5432)에서 RDS 인스턴스에 대한 소켓 연결을 확립하여 포트 연결을 테스트합니다.먼저 RDS 인스턴스의 IP를 검색하여 telnet 또는 nc 중 하나를 사용합니다.

telnet x.x.x.x 3306
nc -vz x.x.x.x 3306

a) 접속 시도가 실패하여 즉시 실패하는 경우 포트가 차단되었거나 원격 호스트가 해당 포트에서 서비스를 실행하고 있지 않을 수 있습니다.트러블 슈팅을 진행하려면 , AWS 서포트에 문의해 주세요.AWS 외부에서 연결하는 경우 먼저 AWS 내부의 다른 인스턴스에서 연결을 시도합니다(방화벽이 이러한 연결을 차단하고 있을 수 있습니다.

b) 접속에 실패하여 타임아웃이 발생했을 경우 방화벽에 의해 패킷이 폐기 또는 무시되거나 패킷이 다른 네트워크 경로로 반환되고 있을 가능성이 있습니다.다음을 실행하여 확인할 수 있습니다.netstat -an | grep SYN(telnet/nc 의 CLI 의 "/" 입니다).SYN 상태의 연결은 연결 요청을 보냈지만 아무것도 받지 않았음을 의미합니다(SYN_ACK 또는 거부/차단).일반적으로 이는 방화벽 또는 보안 그룹이 패킷을 무시하거나 폐기하는 것을 의미합니다.

호스트와 RDS 인스턴스 간에 iptables 또는 NAT 게이트웨이를 사용하고 있지 않은지 확인합니다.VPC 의 경우는, 송신원호스트로부터의 송신/발신 트래픽도 허가해 주세요.

c) 소켓 연결 테스트는 성공했지만 mysql 클라이언트(CLI, 워크벤치, 앱 등)로 연결할 수 없는 경우 netstat 출력을 보고 연결이 어떤 상태인지 확인합니다(x.x.x 를 RDS 인스턴스의 실제 IP 주소로 바꿉니다).

netstat -an | grep x.x.x.x

Telnet 또는 NC를 사용할 때 연결이 확립되었지만 mysql 클라이언트를 사용할 때 'SYN' 상태가 나타나면 MTU 문제가 발생할 수 있습니다.

RDS 는, 이 기술시에 PMTUD(https://en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD) 에 사용되는 ICMP 패킷을 서포트하고 있지 않는 경우가 있습니다.ClassicLink를 통해 클래식 ec2 인스턴스에서 VPC에 있는 RDS 또는 RedShift에 액세스하려고 하면 문제가 발생할 수 있습니다.다음을 사용하여 MTU를 낮춘 후 다시 테스트합니다.

sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400

더 낮은 MTU가 작동한 경우 AWS 고객 지원 센터에 문의하여 도움을 받고 RDS 인스턴스에 연결하려고 할 때 MTU 문제가 발생한다는 점을 언급하십시오.이 문제는 TCP 패킷이 터널링을 위해 캡슐화로 랩되어 패킷 데이터/페이로드에 사용 가능한 MTU가 낮아지면 발생할 수 있습니다.송신원서버의 MTU 를 낮추면, 랩 된 패킷은 계속 제한치 미만이 됩니다.

정상적으로 동작하지 않는 경우는, MTU를 디폴트로 되돌리고, AWS 서포트에 문의해 트러블 슈팅을 실시합니다.

Mark의 문제는 multi-AZ routing & EC2 classic과 관련이 있는 것 같았는데, 오늘 이 같은 문제에 부딪혔습니다.

이를 수정하기 위해 EC2 인스턴스에서2개의 개인 IP 주소를 추가하여 RDS 인스턴스와 함께 자동으로 생성된 Security Group을 수정했습니다.

RDS 인스턴스에 인바운드 규칙 추가

이것은 매우 명백한 문제였지만, 저는 AWS에 익숙하지 않기 때문에 저 같은 사람에게 도움이 되었으면 합니다.

다중 AZ가 모든 걸 망친 것 같아디폴트 multi-AZ 설정에서는 데이터베이스가 region us-east-1d에 배치되고 EC2 인스턴스가 region us-east-1a에 배치되었기 때문에 DNS가 올바르게 라우팅되지 않았습니다.RDS 인스턴스를 비멀티 AZ로 다시 만들어 us-east-1a에서 라이브로 만들어 모두 행복합니다.

RDS, ELB 및 멀티 AZ 기능을 갖춘 AWS의 DNS 라우팅에 관한 슈퍼천재가 있다면 아마존 웹 서비스의 문서 어디에도 기재되어 있지 않기 때문에 그 방법을 알면 매우 좋을 것입니다.

3일 동안 고군분투한 끝에 내 것이 왜 연결이 안 되는지 알게 되었습니다.

EC2 인스턴스에 포트 3306의 아웃바운드 규칙을 추가하고 RDS 서버에 포트 3306의 인바운드 규칙을 추가합니다.인바운드 값은 EC2 인스턴스의 보안이어야 합니다.

예:

  • EC2 Security Group은 -sg.ec2입니다.
  • RDS Security Group은 sg.rds입니다.

sg.ec2의 발신 규칙을 편집하여 포트에 커스텀 TCP를 추가합니다.3306행선지0.0.0.0/0

그런 다음 sg.rds의 인바운드 규칙을 편집하여 포트 3306에 sg.ec2로 인바운드 규칙을 추가합니다.

오늘 EC2 인스턴스가 갑자기 RDS 인스턴스에 접속할 수 없게 되어 Wordpress가 작동하지 않게 되었을 때도 같은 문제가 있었습니다.Security Group은 올바르고 EC2 인스턴스의 콘솔에서 MySQL에 접속할 수 있었지만 PHP에서는 접속할 수 없었습니다.EC2 서버를 재기동하는 것은 어떤 이유에서인지 도움이 되었습니다.

이전 투고와 이 투고 사이에 Amazon이 DNS 라우팅 문제를 수정한 것 같습니다.멀티 AZ rds에서는 모든 것이 정상적으로 동작하고 있기 때문입니다.

솔루션:EC2 인스턴스의 IP 주소에서 접속할 수 있도록 RDS 인스턴스의 보안 그룹의 인바운드 규칙을 조정해야 했습니다.

자세한 설명:AWS RDS 인스턴스를 생성할 때 퍼블릭 IP 주소를 통해 연결할 수 있는 옵션을 선택했습니다.그 때, 임의의 IP 주소로부터 접속할 수 있다고 상정했습니다만, 실제로는 그렇지 않았습니다.인스턴스 작성/설정 시 노트북의 퍼블릭 IP 주소를 취득하여 RDS 보안 그룹의 인바운드 규칙을 설정하여 해당 IP 주소로부터의 접속만 받아들이도록 했습니다.그래서 EC2 인스턴스의 IP 주소에서 들어오는 MYSQL/Aurora 연결을 허용하는 규칙을 수동으로 추가해야 했습니다.

같은 문제가 발생하여 동일한 VPC 및 다중 AZ 설정에서 모두 EC2 인스턴스에서 RDS에 연결할 수 없었습니다.

멀티 AZ 셋업은 문제가 되지 않았습니다.

EC2 인스턴스 Security Group에서 RDS Security Group으로 전송되는 Outbound 규칙 3306만 누락되었습니다.

Amazon 문서에 따르면 다음을 사용해야 합니다.

PROMPT> mysql -h <endpoint> -P 3306 -u <mymasteruser> -p

여기서 endpoint 및 mymasteruser(사용자명)는 RDS 인스턴스에서 가져온 것입니다.

이 문제는 엔드포인트(**.us-east-1.rds.amazonaws.com)가 아닌 직접 IP 퍼블릭주소를 사용하여 해결했습니다.IP 퍼블릭주소는 "ping" 명령어를 사용하여 얻을 수 있습니다(ping ***.us-east-1.rds.amazonaws.com).

언급URL : https://stackoverflow.com/questions/16837806/cant-connect-to-rds-instance-from-ec2-instance

반응형