Amazon EC2 인스턴스를 Bastion 호스트로 사용하여 로컬 시스템에서 프라이빗 Amazon RDS DB 인스턴스에 연결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2023년 1월 18일

Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 Bastion(점프) 호스트로 사용하여 이 작업을 수행하고 싶습니다. 그런 다음, 인스턴스를 사용하여 로컬 시스템에서 프라이빗 Amazon Relational Database Service(RDS) DB 인스턴스에 연결하고 싶습니다.

간략한 설명

Amazon EC2 인스턴스를 점프 서버로 사용하여 로컬 시스템에서 프라이빗 Amazon RDS DB 인스턴스에 연결하려면 다음 단계를 따르세요.

1.    EC2 인스턴스를 시작 및 구성하고 하고 인스턴스의 네트워크 설정을 구성합니다.

2.    RDS DB 인스턴스의 보안 그룹을 구성합니다.

3.    로컬 시스템에서 RDS DB 인스턴스에 연결합니다.

중요:프라이빗 Amazon RDS 또는 Amazon Aurora DB 인스턴스에 연결하려면 VPN 또는 AWS Direct Connect를 사용하는 것이 가장 좋습니다. 이러한 옵션을 사용할 수 없다면 Bastion 호스트를 사용합니다. 다음 예제 구성은 보안 그룹을 사용하여 액세스를 제한합니다. 그러나 연결을 보다 안전하게 하기 위해 서브넷의 네트워크 액세스 제어 목록(네트워크 ACL)을 제한할 수 있습니다. 0.0.0.0/0 대신 더 작은 범위를 사용하도록 인터넷 게이트웨이의 라우팅 범위를 제한할 수도 있습니다. 예를 들어 인터넷 게이트웨이를 추가할 때 필요한 CIDR 범위만 대상의 라우팅 테이블에 추가합니다. 자세한 정보는 라우팅 옵션 예제를 참조하세요.

해결 방법

다음 예제 구성은 Amazon Virtual Private Cloud(VPC)에 있는 Amazon RDS for MySQL 인스턴스에 대한 것입니다. 인스턴스에는 EC2 인스턴스에 대해 설정된 보안 그룹이 있습니다.

EC2 인스턴스 시작 및 구성

1.    Amazon EC2 콘솔을 연 다음 인스턴스 시작을 선택합니다.

2.    Amazon Machine Image(AMI)를 선택합니다.

3.    인스턴스 유형을 선택한 후 다음: 인스턴스 세부 정보 구성을 선택합니다.

4.    네트워크에서 RDS DB 인스턴스가 사용하는 VPC를 선택합니다.

5.    서브넷에서 라우팅 테이블에 인터넷 게이트웨이가 있는 서브넷을 선택합니다. 인터넷 게이트웨이가 아직 없는 경우에는 EC2 인스턴스를 생성한 후 서브넷에 추가할 수 있습니다.

6.    퍼블릭 IP 자동 할당의 경우 활성화가 선택되어 있는지 확인합니다.

7.    다음: 스토리지 추가를 선택하고 필요에 따라 스토리지를 수정합니다.

8.    다음: 태그 추가를 선택하고 필요에 따라 태그를 추가합니다.

9.    다음: 보안 그룹 구성을 선택하고 규칙 추가를 선택한 후 다음을 입력합니다.

유형: 사용자 지정 TCP 규칙을 입력합니다.

프로토콜: CP를 입력합니다.

포트 범위: 22를 입력합니다.

소스: 로컬 시스템의 IP 주소를 입력합니다. 기본적으로 소스 IP 주소는 모두에게 공개되지만 로컬 퍼블릭 IP 주소에 대한 액세스를 제한할 수 있습니다.

10.    검토 및 시작을 선택합니다.

11.    시작을 선택합니다.

RDS DB 인스턴스의 보안 그룹 구성

참고: 하나 이상의 EC2 인스턴스를 RDS 데이터베이스에 자동으로 연결하려면 EC2 인스턴스를 RDS 데이터베이스에 자동으로 연결을 참조하세요.

1.    Amazon RDS 콘솔을 열고 탐색 창에서 데이터베이스를 선택합니다.

2.    RDS DB 인스턴스의 이름을 선택합니다. 또는 아직 없는 경우 RDS DB 인스턴스를 생성합니다.

3.    연결 및 보안 탭을 선택합니다.

4.    보안 섹션에서 VPC 보안 그룹 아래의 링크를 선택합니다.

5.    보안 그룹을 선택하고 작업을 선택한 다음 인바운드 규칙 편집을 선택합니다.

6.    규칙 추가를 선택하고 다음을 입력합니다.

유형: 사용자 지정 TCP 규칙을 입력합니다.

프로토콜: TCP를 입력합니다.

포트 범위: RDS DB 인스턴스의 포트를 입력합니다.

소스: EC2 인스턴스의 프라이빗 IP 주소를 입력합니다.

7.    저장을 선택합니다.

보안 그룹에 대한 이 구성은 EC2 인스턴스의 프라이빗 IP 주소에서 수신되는 트래픽을 허용합니다. EC2 인스턴스와 RDS DB 인스턴스가 동일한 VPC를 사용하는 경우 RDS DB 인스턴스의 라이팅 테이블을 수정할 필요가 없습니다. VPC가 다른 경우 VPC 피어링 연결을 생성하여 해당 VPC 간의 연결을 허용합니다.

참고: 확장성이 더 높은 솔루션을 사용하는 경우에는 주의해야 합니다. 예를 들어 보안 그룹 규칙에서 보안 그룹 ID를 사용하는 경우, 단일 인스턴스에 대한 액세스를 제한하지 않는지 확인합니다. 대신 특정 보안 그룹 ID를 사용하는 모든 리소스에 대한 액세스를 제한하도록 규칙을 구성합니다.

로컬 시스템에서 RDS DB 인스턴스에 연결

사용하는 클라이언트에 따라 RDS DB 인스턴스에 연결하는 단계가 다를 수 있습니다. 자세한 내용은 Amazon RDS DB 인스턴스에 연결을 참조하십시오. MySQL을 사용하는 경우 SSL을 사용하여 클라이언트 애플리케이션과 Amazon RDS 간의 연결을 암호화하는 것이 모범 사례입니다.

다음 예제에서는 MySQL Workbench 클라이언트를 사용하여 Bastion 호스트에 연결합니다.

1.    새 연결을 시작하고 연결 방법에서 표준 TCP/IP over SSH를 선택합니다.

2.    EC2 인스턴스의 SSH 설정에 대한 다음 세부 정보를 입력합니다.

참고: 퍼블릭 IP 주소로 시작된 EC2 인스턴스는 생성된 VPC에 DNS 호스트 이름이 활성화되어 있는 경우 퍼블릭 DNS가 있습니다.

퍼블릭 IP 자동 할당: 활성화DNS 호스트 이름 옵션에서 선택되어 있는지 확인합니다.

SSH 호스트 이름: EC2 인스턴스의 퍼블릭 DNS 이름 또는 퍼블릭 IP 주소를 입력합니다.

SSH 사용자 이름: EC2 인스턴스의 사용자 이름을 입력합니다. 예를 들어 ec2-user는 EC2 Linux 시스템의 사용자 이름입니다.

SSH 키 파일: EC2 인스턴스를 생성할 때 사용한 프라이빗 키를 선택합니다.

3.    MySQL 인스턴스 설정에 대한 다음 세부 정보를 입력합니다.

MySQL 호스트 이름: RDS DB 인스턴스 엔드포인트를 입력합니다.

MySQL 서버 포트: 3306을 입력합니다. 또는 사용자 지정 포트를 사용하는 경우 사용자 지정 포트 번호를 입력합니다.

사용자 이름: RDS DB 인스턴스의 사용자 이름을 입력합니다.

암호: RDS DB 인스턴스의 암호를 입력합니다.

4.    테스트 연결을 선택합니다.

5.    연결이 성공하면 연결 이름을 입력하고 연결을 저장합니다.

SSH 터널을 사용하여 로컬 MySQL 클라이언트에서 프라이빗 RDS 인스턴스로 연결하려면 다음 명령을 참조하십시오.

리눅스 또는 macOS:

1.    다음 명령을 사용하여 SSH 터널을 구성합니다.

ssh -i "YOUR_EC2_KEY" -L LOCAL_PORT:RDS_ENDPOINT:REMOTE_PORT EC2_USER@EC2_HOST -N -f

참고: YOUR_EC2_KEY, LOCAL_PORT, RDS_ENDPOINT, REMOTE_PORT, EC2_USEREC2_HOST를 관련 정보로 교체해야 합니다.

이전 명령에서 사용자 지정 필드를 완성하면 명령이 다음 예와 비슷하게 표시됩니다.

ssh -i "ec2Key.pem" -L 3336:rdsinstance.xxx.xxx.rds.amazonaws.com:3306 ec2-user@ec2-34-244-136-223.xxxcompute.amazonaws.com -N -f

2.    터널이 로컬 포트에서 수신 대기 중인지 테스트 및 확인하려면 다음 명령을 실행합니다.

lsof -i4 -P | grep -i "listen" | grep LOCAL_PORT
nc -zv 127.0.0.1 LOCAL_PORT

참고: LOCAL_PORT를 로컬 포트 번호로 변경해야 합니다.

3.    터널이 로컬 포트에서 성공적으로 수신 중이면 다음과 비슷한 출력이 표시됩니다.

lsof -i4 -P | grep -i "listen" | grep 3336
ssh       17692 user    8u  IPv4 0x3bc46bcfeffce12f      0t0  TCP localhost:3336 (LISTEN)

nc -zv 127.0.0.1 3336
Connection to 127.0.0.1 port 3336 [tcp/directv-tick] succeeded!

4.    다음 명령을 실행하여 EC2 인스턴스를 Bastion 호스트로 사용하여 로컬 시스템에서 RDS 인스턴스에 연결합니다.

mysql -h 127.0.0.1 -P LOCAL_PORT -u RDS_USER -p

참고: LOCAL_PORT를 로컬 포트 번호로 변경하고 DB_USER를 사용자의 RDS DB 사용자 이름으로 변경합니다.