VPC, 서브넷 설정으로 RDS에 안전하게 접근하기!

Server The SOPT·2022년 7월 9일
21

AWS

목록 보기
1/1
post-thumbnail

✏️ 작성자: 우진
📌 작성자의 한마디: "AWS 털리기 전에 외양간 고칩시다."



???: AWS가 털려서 900만원 낼뻔 했어.

개발자라면 누구나 들어본 AWS 괴담.
우리가 그 주인공이 되어 우리의 소를 다 털리기 전에, 미리미리 외양간을 고칠 필요가 있습니다.

서비스 별로 IAM 사용자를 만들어 관리하고,
VPC와 서브넷 구축을 통해 필요한 경우에만 서비스 접근, 호출을 가능케 하면 되는 것이죠.

본 포스팅에선, VPC와 서브넷 구축을 통해
"EC2를 거쳐야만 RDS에 접근할 수 있는 환경"을 구축하는 방법을 보여드리겠습니다.

아, 그런데
VPC는 뭐고 서브넷은 뭐지?






VPC와 서브넷이란?

VPC : Virtual Private Cloud

-> 물리적으로 같은 클라우드 상에 있지만, 보안상의 목적 등을 위해 논리적으로 다른 클라우드인것처럼 동작하도록 만든 가상 클라우드 환경

아래는 VPC가 적용되지 않은 환경을 표현한 다이어그램입니다.
시스템이 복잡하고, 인스턴스 하나만 추가해도 모든 인스턴스를 수정해야 합니다.

아래는 VPC가 적용된 환경입니다. VPC 별로 다른 네트워크 설정을 할 수 있고, 독립된 네트워크처럼 작동합니다.

서브넷(Subent) : 보안, 통신 성능 향상 등을 목적으로 VPC를 잘개 쪼갠 단위

-> Public과 Private으로 나뉨

Public Subnet은 외부에서 접근이 가능한 네트워크 영역입니다.
Private Subnet은 외부에서 접근이 불가능합니다. 내부에서 외부로만 접근이 가능하면, 그것 또한 NAT 게이트웨이를 이용하여 가능합니다. 중요한 리소스들을 엄격하게 관리하기 위해 사용합니다.

우리는 EC2 인스턴스를 만들고 사용하면서 '보안 그룹'이라는 것을 한 번쯤 본 적이 있을 것입니다.
해당 인스턴스에 인/아웃바운드로 접근할 수 있는 규격을 정의한 것인데요,

서브넷에도 해당 서브넷에 접근하기 위해 거쳐야 하는 관문인 '네트워크 ACL'이 있습니다.
하지만 여기서는 자세히 다루지 않겠습니다.

개념은 이쯤 알아두고,
우리가 구축하려는 시스템을 그림을 통해 알아봅시다.

어렵지 않습니다.
VPC를 새로 생성해 그 안에 EC2와 RDS 인스턴스를 개설하고 연결시킵니다.
이때, 외부에서는 EC2에만 접근 가능하고, RDS는 접근할 수 없습니다!
RDS는 EC2를 거쳤을 때만 접근 가능하게 만듭니다.
바로 우리에게 익숙한 '보안 그룹'을 통해서 말이죠.

자 그럼, 실습을 통해 시스템을 구축해보겠습니다.
VPC 생성(서브넷 생성 포함) -> 보안 그룹 2개 세팅(각각 EC2, RDS용) -> (원하는 서브넷에) EC2, RDS 인스턴스 생성 및 연결 -> 연결 확인
순서로 진행하겠습니다.

(사실 우리가 이전에 만든 인스턴스들은 default-VPC라는 자동 생성된 VPC에 속해있긴 합니다. 새로운 시스템을 구축하기 위해 새 VPC를 생성해봅시다.)




VPC 및 서브넷 생성

우선 AWS 콘솔에 로그인합니다.

그리고 검색창에 VPC를 검색하면 서비스를 찾을 수 있습니다.

VPC를 생성해봅시다.

우선 아래 정보들은 기본값을 유지하고,
이름 태그만 원하는 값으로 바꿔봅시다.
생성할 리소스 - VPC 등 : 현재 화면에서 서브넷 등 부가 요소들을 함께 생성함

테넌시, AZ 수, 서브넷 수도 아래와 같이 기본값을 유지한 채로,
'서브넷 CIDR 블록 사용자 지정'을 클릭해봅시다.
(AZ는 2개 이상이어야 후에 데이터베이스에서 서브넷 그룹을 생성할 수 있습니다!)

토글해서 나온 CIDR 설정을 아래와 같이 수정해봅시다.

(아래 내용은 참고만 - CIDR 을 검색하면 알기 쉬운 내용들이 나옵니다.)
/ 뒤의 숫자는 오른쪽에 있는 IP의 개수를 결정합니다.
/ 뒤의 숫자를 X라고 하면, 2의 (32-X)제곱 만큼의 IP 대역을 가집니다.
10.0.0.0 의 IP 주소에서 각 숫자들은 0~255 즉 256개의 범위를 가집니다.
따라서 4개의 서브넷이 각각 10.0.0.0, 10.0.1.0, 10.0.2.0, 10.0.3.0을 기준으로 256개의 IP값 범위를 가지게 되는 것이죠.
기본값인 20은 4096개의 IP 범위를 가지는데 그 범위를 직관적으로 알기 쉽게 축소해보았습니다.
기본값으로 진행해도 큰 상관은 없습니다.

VPC 엔드포인트는 지금 사용할 것이 아니기에 '없음'으로 표시하고 넘어갑시다.

아래와 같이 모든 항목이 체크되면 VPC와 서브넷 생성 완료!




보안 그룹 세팅

외부에서 우리의 VPC 내부에 있는 EC2로 접근할 수 있는 프로토콜을 먼저 세팅하겠습니다.

VPC 콘솔 좌측의 '보안 그룹'으로 들어가서 '보안그룹 생성'을 클릭합니다.

보안 그룹 이름을 test-sg 로 하겠습니다.
VPC를 반드시 위에서 생성한 것으로 교체해줍니다!

그리고 인바운드 규칙을 추가합니다.

아래와 같이 설정합니다. 그리고 하단으로 내려가 '보안 그룹 생성' 클릭!

이번에는 내부망에서 EC2를 통해 RDS로 접근할 수 있는 프로토콜을 세팅하겠습니다.

똑같이 보안 그룹 생성으로 들어가 아래와 같이 설정합니다.

이번에도 인바운드 규칙을 추가하는데, 아래와 같이 설정합니다.
그런데, 빨간 박스 안에 뭐라고 쳐야 할까요?
바로 위에서 설정한 'test-sg' 라는 보안 그룹의 ID를 검색 후 선택하면 됩니다.
해당 보안그룹을 거쳐 들어온 트래픽만 3306 포트를 통해 받아주겠다! 이런 뜻입니다.

그런데 'test-sg'의 ID를 어떻게 알 수 있을까요?
콘솔에서 좌측의 '보안 그룹'에 들어가면 알 수 있습니다!

아까 생성한 보안 그룹 ID를 복사해서 다시 생성 중인 보안 그룹의 인바운드 규칙에 추가해줍니다.
그리고 하단에서 '보안 그룹 생성'을 클릭하면, DB(RDS)에 사용할 보안 그룹이 생성됩니다.



RDS 인스턴스 생성

RDS 서비스를 검색합니다.

생성에 앞서, '서브넷 그룹'을 설정합니다.
콘솔 좌측에서 '서브넷 그룹'으로 들어가 'DB 서브넷 그룹 생성'을 클릭합니다.

아래와 같이 설정합니다.
VPC는 역시 위에서 생성한 것으로 꼭 설정해주어야 합니다!

가용 영역(AZ)은 아래와 같이 설정합니다.
위에서 서브넷을 추가할 때, 아래 선택한 2개의 가용 영역을 추가했기 때문입니다.

서브넷 또한 모두 추가하고 우측 하단의 '생성'을 클릭합니다.

서브넷 그룹을 생성했으니, RDS 인스턴스를 생성해봅시다!
다시 RDS 콘솔 초기화면으로 들어가 '데이터베이스 생성'을 클릭합니다.

MySQL 엔진을 사용하고, 프리 티어를 선택합니다.
빨간 박스로 체크한 부분 외에는 기본 설정을 사용했습니다.

마스터 사용자 이름과 암호는 MySQL의 root 계정과 같습니다. 정보를 기억해야 합니다.

'스토리지 자동 조정 활성화'는 체크 해제합니다.
필요한 스토리지 용량이 할당된 크기보다 커지면, 자동으로 스토리지가 추가 할당되어 과금의 우려가 있습니다.

VPC를 설정해주어야 합니다! 서브넷 그룹도 아까 만든 것으로 설정해줍니다.
퍼블릭 액세스는 '아니요' 상태로 유지합니다. 지금 시스템을 구축하고 있는 이유니까요!

보안 그룹과 가용 영역(AZ)도 아래와 같이 설정해줍니다.

아래에서 암호 인증은 사용할 방식대로 선택(지금은 IAM을 사용하지 않아 '암호 인증'선택)하고

추가 구성에서 아래와 같이 데이터베이스 이름을 정해줍니다.
초기 생성 시, 'sopt'라는 이름의 데이터베이스가 자동 생성됩니다.
테스트 용으로 만드는 것이므로 자동 백업을 비활성화 하겠습니다.
실제 운영 시에는 백업이 반드시 필요할 것입니다.

나머지 설정은 하지 않고 하단에서 '데이터베이스 생성'을 클릭하겠습니다.
데이터베이스 생성은 수 분이 소요됩니다. 그동안 EC2 인스턴스를 생성해보겠습니다.



EC2 인스턴스 생성

EC2 서비스를 검색해서 들어갑니다.

인스턴스를 시작합시다!

VPC만 잘 설정해주고 나머지는 원하는 스펙, 설정으로 EC2 인스턴스를 생성하면 됩니다.
저는 아래와 같이 생성해보겠습니다.

네트워크 설정은 아래와 같이 해주어야 합니다.
네트워크 설정 우측 상단에서 '편집'을 클릭하여 VPC와 서브넷을 다시 설정합니다.
보안 그룹은 '기존 보안 그룹 선택'을 통해 위에서 생성한 EC2용 보안 그룹을 설정해줍니다.

그리고 인스턴스 시작!

그런데 이렇게 만들어진 인스턴스는 공인 IP가 할당되어 있지 않아서 탄력적 IP(Elastic IP)를 설정해주어야 합니다.

아래와 같이 '탄력적 IP 주소 할당'을 클릭하고 나오는 페이지에서 바로 '할당'을 클릭합니다.

'탄력적 IP 주소 연결' 을 클릭합니다.

위에서 만든 인스턴스를 선택합니다.

프라이빗 IP 주소는 클릭해서 나오는 주소를 바로 선택합니다.
(아니라면, EC2 인스턴스의 요약 페이지로 가서 프라이빗 IP 주소를 가져옵니다. 근데 아마 나오는 주소가 있을 겁니다.)

이제 우측 하단의 '연결' 버튼을 클릭합니다.



RDS 연결 확인

로컬에서 연결하기

MySQL Workbench를 이용해서 연결을 확인해보겠습니다.

Workbench를 실행하고 아래에 표시한 버튼을 통해 New Connection을 생성합니다.

Hostname은 RDS 인스턴스의 엔드포인트를 입력합니다.
Username은 RDS 인스턴스 생성 시 만든 마스터 계정의 이름
Password는 'Store in Keychain'을 클릭해서 마스터 계정의 비밀번호를 입력합니다.

RDS 인스턴스의 엔드포인트를 모르겠다구요?
해당 인스턴스의 요약에 가면 볼 수 있습니다.

어쨌든 Workbench로 돌아가서 'Test Connection'을 클릭해봅시다.
어라.. 렉이 좀 걸리더니..

??
연결에 실패합니다.. 왜죠..?
..
..
..














당연합니다!!

우리는 외부에서 EC2로는 접근할 수 있지만, RDS는 EC2의 보안 그룹을 거친 트래픽만 접근할 수 있게 설계했습니다.
로컬 PC에서 RDS로 접근하는 트래픽이 차단된 것이니, 우리가 설계한 대로 동작한 것을 확인할 수 있습니다!

EC2에서 연결하기

이번에는 EC2 인스턴스에 접속해서 RDS에 접근해보겠습니다.
EC2 접속 방법은 생략하겠습니다. 위에서 설정한대로 키 페어로 접속하면 됩니다!

자, 아래와 같이 잘 접속했다면 RDS 인스턴스에 연결해봅시다.

우선 설치부터 진행합니다.

// APT 업데이트
sudo apt-get update
// MySQL 설치
sudo apt install mysql-client

그리고 아래와 같은 명령으로 연결합니다! (admin은 위에서 설정한 마스터 사용자의 이름입니다)

sudo mysql -u admin -p --port 3306 --host <RDS 인스턴스 엔드포인트>

RDS 인스턴스의 엔드포인트는, 위에서 Workbench로 연결 시도할 때 가져왔었습니다.
RDS 인스턴스의 요약에 가면 확인할 수 있습니다.

아래와 같이 'Enter password:'에는, 위에서 설정한 마스터 사용자의 비밀번호를 입력합니다.
그러면..!

RDS 인스턴스의 MySQL과 잘 연결되었음을 확인할 수 있습니다!






이로써 VPC 내부에서만 접근이 가능한 RDS 인스턴스와 MySQL 데이터베이스를 구축 완료했습니다.
이처럼 EC2는 Public한 공간에, RDS는 Private한 공간에 분리하는 구성은, 안전하고 효과적인 DB 관리를 위해 자주 사용된다고 합니다.

쉽고 편한 AWS 서비스, 하지만 언제나 방심은 금물!
안전한 사용으로 보안 사고를 예방하는 멋진 서버 개발자가 됩시다 ^_^
감사합니다.



참고 링크1 : https://ndb796.tistory.com/224?category=987004
참고 링크2 : https://medium.com/harrythegreat/aws-%EA%B0%80%EC%9E%A5%EC%89%BD%EA%B2%8C-vpc-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0-71eef95a7098
참고 링크3 : https://jbhs7014.tistory.com/164
참고 링크4 : https://pjh3749.tistory.com/283

profile
대학생연합 IT벤처창업 동아리 SOPT 30기 SERVER 파트 기술 블로그입니다.

3개의 댓글

comment-user-thumbnail
2023년 7월 21일

좋은 글 감사합니다. :)

답글 달기
comment-user-thumbnail
2024년 2월 25일

정말 깔끔한 설명 감사드립니다!

답글 달기
comment-user-thumbnail
2024년 9월 16일

사랑합니다

답글 달기