공개적으로 액세스할 수 없는 Amazon Relational Database Service(Amazon RDS) DB 인스턴스가 있습니다. 리눅스/맥 OS 시스템에서 연결하려고 합니다. Bastion Host를 사용하여 RDS DB 인스턴스에 연결하려면 어떻게 해야 하나요?
간략한 설명
프라이빗 Amazon RDS 또는 Amazon Aurora DB 인스턴스에 연결하려면, VPN 또는 AWS Direct Connect를 사용하는 것이 좋습니다. VPN 또는 AWS Direct Connect를 사용할 수 없는 경우에는 Bastion Host를 사용하는 것이 좋습니다. 이 방법을 사용하여 VPC 외부에서 Aurora 서버리스 및 RDS 프록시에 연결할 수도 있습니다. 이 예제에서는 RDS DB 인스턴스가 프라이빗인 경우에도 Linux/macOS 시스템에서 RDS DB 인스턴스에 연결하도록 Bastion Host를 설정하는 방법을 보여줍니다.
해결 방법
1. DB 인스턴스를 수정하여 Amazon RDS DB 인스턴스를 프라이빗으로 설정합니다. 프라이빗 서브넷을 사용하여 공개적으로 액세스할 수 있는 파라미터를 no로 설정합니다(예: 인터넷 게이트웨이 없음 - 라우팅 테이블의 igw). DB가 모든 IP에서 포트(5432, 3306)를 허용할 수 있도록 보안 그룹을 설정합니다.
2. DB 인스턴스와 동일한 VPC에서 사용 가능한 가장 작은 EC2 인스턴스를 시작합니다. Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 퍼블릭 서브넷을 통해 인터넷에서 액세스할 수 있도록 설정합니다(예: 라우팅 테이블에 인터넷 게이트웨이 — igw가 있음). 연결하려는 Linux/macOS 시스템의 IP를 허용하도록 보안 그룹을 설정합니다.
3. Linux/macOS 시스템에서 다음 명령을 실행하여 시스템에서 연결하기 위한 터널을 생성합니다.
Syntax 1:
ssh -i <identity_file> -f -l <bastion-host-username> -L
<local-port-you-connect-to>:<rds-endpoint>:<rds:listening-port>
<bastion-host-public-ip> -v
Example Command:
ssh -i "private_key.pem" -f -l ec2-user -L 5432:172.31.39.62:5432 3.133.141.189 -v
위 명령(SSH 터널링)을 실행할 때 다음 설정을 구성합니다.
- 디버그1: LOCALHOST에 대한 로컬 연결: 5432가 원격 주소 172.31.39.62:5432로 전달되었습니다.
- 디버그1: 127.0.0.1 포트 5432에서의 로컬 포워딩 수신.
- 디버그1: 채널 0: new [port listener]
- 디버그1: ::1 포트 5432에서 로컬 포워딩 수신.
Syntax 2:
ssh -i "Private_key.pem" -f -N -L 5433:RDS_Instance_Endpoint:5432 ec2-user@EC2-Instance_Endpoint -v
Example Command:
ssh -i "private.pem" -f -N -L
5433:pg115.xxxx.us-east-2.rds.amazonaws.com:5432
ec2-user@ec2-xxxx-xxx9.us-east-2.compute.amazonaws.com -v
4. 이제 SSH 터널링이 구현되었으므로 로컬 Linux/macOS 시스템에서 DB 인스턴스에 연결할 수 있습니다. 다음 예제는 PostgreSQL에 연결하지만 이 메서드를 사용하여 MySQL 또는 연결하려는 다른 엔진에 연결할 수도 있습니다.
Syntax -
psql -hlocalhost -Upostgres -p<local-port-you-connect-to> -d postgres
-h = localhost
-U = the username present in the DB for connectivity
-p = 'local-port-you-connect-to' from the SSH Tunneling command
-d = Any DB, user wish to connect.
Example command -
a483e73d651f:.ssh rahul_saha$ psql -hlocalhost -Upostgres -p5432 -d postgres
Password for user postgres:
psql (12.1, server 11.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
rdsadmin | rdsadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
template0 | rdsadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin +
| | | | | rdsadmin=CTc/rdsadmin
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
$ psql -hlocalhost -Upostgres -p -d postgres
$ mysql -h127.0.0.1 -uroot -p
참고: DB 인스턴스에 연결할 때 localhost 키워드를 사용하면 MySQL은 소켓을 사용하여 연결을 시도합니다. MySQL DB 인스턴스에 액세스할 때는 호스트 이름 127.0.0.1을 사용해야 합니다. 자세한 내용은 [local] MySQL 서버에 연결할 수 없음에 대한 MySQL 설명서를 참조하세요.
관련 정보
AWS 기반 리눅스 Bastion Host
Amazon EC2 인스턴스를 Bastion Host로 사용하여 로컬 시스템에서 프라이빗 Amazon RDS DB 인스턴스에 연결합니다.