들어가며
안녕하세요! 오늘은 로컬에서 AWS Private Subnet에 있는 인스턴스에 접근하는 방법을 알아보겠습니다. Private Subnet에 접근하는 쉬운 방법은 퍼블릭 액세스를 허용하는 것인데요. 이것은 외부 인터넷에서 직접 접근할 수 있어 보안에 취약합니다. 또한, AWS Public IPv4의 경우 시간당 0.005USD(1달 기준 3.6USD)의 비용이 발생합니다. 그래서 일반적으로 Bastion Host를 사용하여 Private Subnet에 접근하거나 새롭게 등장한 EC2 Instance Connect 방식을 사용합니다.
이번 글에서는 로컬에서 Bastion Host를 사용해 Private Subnet의 인스턴스에 접근하는 구체적인 방법에 대해서 알아보겠습니다.
Public Subnet과 Private Subnet
Public Subnet
- 인터넷 접근성: 퍼블릭 서브넷은 인터넷과 직접 연결되어 있어 외부에서 접근할 수 있습니다.
- 라우팅: 퍼블릭 서브넷의 라우팅 테이블에는 인터넷 게이트웨이가 포함되어 있습니다.
- 용도: 웹 서버, 로드 밸런서와 같은 인터넷에서 접근해야 하는 리소스를 호스팅하는 데 사용됩니다.
- IP 주소: 일반적으로 퍼블릭 IP 주소를 할당받아 인터넷에서 접근할 수 있습니다.
Private Subnet
- 인터넷 비접근성: 프라이빗 서브넷은 인터넷과 직접 연결되어 있지 않으며, 외부에서 직접 접근할 수 없습니다.
- 라우팅: 프라이빗 서브넷의 라우팅 테이블에는 인터넷 게이트웨이가 없고, NAT 게이트웨이나 NAT 인스턴스를 통해 인터넷에 접근할 수 있습니다.
- 용도: 데이터베이스 서버, 애플리케이션 서버와 같은 외부에서 접근할 필요가 없는 리소스를 호스팅하는 데 사용됩니다.
- IP 주소: 일반적으로 프라이빗 IP 주소를 사용하며, 외부에서 접근할 수 없습니다.
로컬에서 Private Subnet 인스턴스에 접근하는 방법
SSH 연결 팁
설명을 하기에 앞서 SSH 연결에 대한 팁을 알아보겠습니다. AWS의 SSH 클라이언트 연결 설명은 다음과 같습니다.
생성한 pem 키에 대해서 chmod 400을 통해 파일 소유자에게 읽기 권한만을 줍니다. 그 후 다음과 같은 명령어를 통해 인스턴스에 연결합니다.
ssh -i "키.pem" ubuntu@주소.ap-northeast-2.compute.amazonaws.com
이 방법은 명령어가 길고, 주소를 기억해야해서 불편할 수 있습니다. 자주 접근하는 것들에 대해서 호스트 정보를 정의하고 편하게 사용할 수 있습니다. 예를 들어, "ssh example"와 같이 쉽게 접속할 수 있습니다.
우선 pem 키에 대해서 위와 동일하게 chmod 400을 해줍니다. 다음으로 터미널에서 "open ~/.ssh" 명령어를 입력하면 .ssh 폴더를 띄울 수 있습니다. 그 곳에 pem 키를 보관합니다.
"vi ~/.ssh/config" 명령어를 통해 SSH 관련 설정을 정의할 수 있습니다.
Host example
HostName 1.23.4.567
Port 22
User ubuntu
IdentityFile ~/.ssh/example.pem
- Host: 설정 블록의 이름을 지정합니다. example라는 이름으로 SSH 연결을 참조했습니다.
- HostName: 실제로 연결할 서버의 IP 주소 또는 도메인을 입력합니다.
- Port: SSH 프로토콜이 사용하는 포트를 지정합니다. 기본적으로 22입니다.
- User: SSH 연결 시 사용할 사용자 계정 이름을 지정합니다. Ubuntu OS로 인스턴스를 생성했으므로 ubuntu입니다.
- IdentityFile: 로그인 시 사용할 개인 키 파일의 경로를 지정합니다. 위애서 pem 키를 보관한 경로입니다.
이제 터미널에서 다음과 같이 생성한 설정으로 SSH 연결을 할 수 있습니다.
ssh example
ProxyJump를 사용해서 Private Subnet에 접근
Public Subnet에는 Bastion Host(EC2)가 있고, Private Subnet에는 애플리케이션 서버(EC2)가 있다고 가정하겠습니다. Bastion Host는 보안 그룹을 통해서 Private Subnet의 EC2에 접근할 수 있습니다. 이 경우 로컬에서 Private Subnet에 있는 EC2에 SSH로 연결하는 방법을 알아 보겠습니다.
ProxyJump는 SSH 연결 시 중간 서버를 통해 다른 서버에 연결하는 방법입니다. 이를 사용하면 직접 접근할 수 없는 서버에 안전하게 접근할 수 있습니다. SSH의 -J 옵션을 사용하여 설정할 수 있습니다.
기본적으로 "ssh -J user@proxy_host user@target_host"와 같이 사용합니다. 이것 또한 명령어가 길어지고, 기억하기가 번거롭습니다. 위에서 "ssh example"과 같이 설정해보겠습니다.
Host bastion-host
HostName 12.3.45.678
Port 22
User ubuntu
IdentityFile ~/.ssh/bastion-host.pem
Host project-app
HostName 23.4.56.789
Port 22
User ubuntu
IdentityFile ~/.ssh/project-app.pem
ProxyJump bastion-host
먼저 bastion-host에 대해서 설정합니다. 그리고 project-app 설정 중 아래에 ProxyJump로 bastion-host를 지정합니다.
이제 "ssh project-app" 명령어를 실행하면 Public Subnet에 있는 bastion-host를 거쳐 Private Subnet의 project-app에 SSH 연결할 수 있습니다.
IntelliJ의 Database 연결 방법
현재 Public Subnet에 EC2가 있고, Private Subnet에 RDS, ElastiCache가 있다고 가정하겠습니다. EC2에서는 보안 그룹을 통해서 RDS, ElastiCache에 접근할 수 있습니다.
서비스를 운영하다보면, 로컬에서 편한 UI로 데이터베이스를 확인하고 싶은 경우가 많습니다. 이 경우 IntelliJ에서 데이터베이스를 연결할 수 있습니다.
먼저, 인텔리제이의 오른쪽에 Database를 클릭하고, 왼쪽의 + 버튼을 클릭합니다. Data Source에서 해당하는 데이터베이스를 선택합니다. 저는 PostgreSQL을 선택하겠습니다.
다음으로 General에서 데이터베이스 연결을 위한 값들을 입력해줍니다. Host에는 RDS의 엔드포인트를 넣고, Port는 PostgreSQL의 경우 5432입니다. User, Password는 데이터베이스 생성 시 적었던 것들을 넣어줍니다. 데이터베이스를 생성했다면 데이터베이스 이름을 적어줍니다.
RDS는 Private Subnet에 있으므로, Public Subnet에 있는 EC2를 거쳐서 가야합니다. 그러기 위해서 SSH/SSL 탭을 클릭해줍니다. 왼쪽에 Use SSH tunnel 옵션을 선택하고, SSH 설정을 작성해줍니다.
데이터베이스 연결을 위한 준비가 끝났습니다. 창 아래에 있는 Test Connection을 통해서 확인해보시길 바랍니다. EC2와 RDS의 보안 그룹이 이상할 경우 문제가 발생할 수 있습니다. 문제가 있을 경우 꼼꼼히 확인해주세요.
ElastiCache의 경우에도 동일하게 연결할 수 있습니다. 다만 주의할 점은 ElastiCache를 생성할 때 "전송 중 암호화"를 선택했을 경우, 데이터베이스 연결에서 Use SSL 옵션을 켜주시길 바랍니다.
마치며
이번 글에서는 Bastion Host를 이용해서 로컬에서 Private Subnet에 접근하는 구체적인 방법과 팁을 알아보았습니다. Bastion Host는 예전 방식이고 요즘(2023년 이후)에는 EC2 Instance Connect Endpoint 방식을 사용한다고 합니다. 저는 이 방법이 익숙하지 않고, 간단한 환경에서는 이 방식이 오히려 복잡하다고 느껴졌습니다. 관심있으신 분들은 AWS 관련 글을 참고하시길 바랍니다.
읽어주셔서 감사합니다 ㅎ~ㅎ
'서버' 카테고리의 다른 글
Testcontainers로 실제 서비스와 유사한 환경에서 테스트하기 (1) | 2025.03.02 |
---|---|
분산락을 이용한 중복 생성 문제 해결 (2) | 2025.02.23 |
AWS ElastiCache로 Redis(or Valkey) 운영하기 (0) | 2025.02.10 |
스프링에서 AWS S3를 이용한 이미지 업로드 방법 (0) | 2025.02.03 |
고가용성을 위한 단일 장애 지점(SPOF) 해결 방법 (2) | 2025.01.25 |