AWS 서비스

[AWS] VPC 설정하기 (중요)

szoo_ 2024. 9. 11. 20:03

Amazon Virtual Private Cloud(Amazon VPC)를 사용하면 정의한 논리적으로 격리된 가상 네트워크에서 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점과 함께 고객의 자체 데이터 센터에서 운영하는 기존 네트워크와 매우 유사합니다.

이 서비스는 여러 인스턴스나 서비스로 구성된 나만의 논리적으로 격리된 네트워크 환경을 구축하기 위해 사용된다.

 

VPC의 구성 요소

  • 서브넷(Subnet)
  • 인터넷 게이트웨이(Internet Gateway, IGW)
  • NAT 게이트웨이(NAT Gateway)
  • 라우팅 테이블(Route Table)
  • 보안 그룹(Security Group)
  • 네트워크 ACL(Network Access Control List)
  • VPC 엔드 포인트(VPC endpoint)
  • 가상 프라이빗 게이트웨이(Virtual Private Gateway, VGW)
  • DHCP 옵션 세트(DHCP Option Set)

와 같은 서비스가 있지만 이 글에서는 밑줄친 서비스만 하여 구성할 예정이다.

 

또한 "VPC 내에 있는 모든 요소는 모두 VPC 라는 네트워크 안에 구성되어 있으므로 프라이빗 IP로 통신 할 수 있다."

이 문장을 잘 기억해두길 바란다.

 

해당 실습을 하기 전  인터넷 게이트웨이와 NAT 게이트웨이는 프리티어 서비스가 아니기에 조금의 요금이 부과될 수 있기 때문에 이 부분은 고려해야한다.

요금(간단한 실습 기준)

  • IGW(인터넷 게이트웨이) 예상 비용: 탄력적IP($0.005/hour)
  • NAT 예상 비용: $0.045/hour

VPC 생성하기

1. VPC 서비스 검색 > VPC 생성하기

    • 생성할 리소스 - VPC만 : 직접 하나씩 구성요소를 파악해가며 하기 위해 따로 만드는 과정으로 진행한다.
    • IPv4 CIDR 블록 - 수동 입력
      • CIDR이란? IP 주소를 효율적으로 관리하고 할당하기 위한 주소 표기 방식, IP 주소와 서브넷 마스크를 결합해 네트워크를 구분한다.
        CIDR의 역할로는 네트워크의 크기를 정의하고 IP 주소 절약 할 수 있다는 장점이 있다.
    • IPv6 CIDR 블록 - 없음
    • 테넌시 - 기본값

저는 이렇게 하여 생성하겠습니다.

 

+ 또한 계정 당 생성 할 수 있는 VPC의 최대 갯수는 5개입니다. (글 적으며 생성하다가 최대갯수에 도달해서 하나 지우고 다시 진행하였음)

 

VPC를 생성하면 아래와 같은 화면으로 정상적으로 VPC와 VPC 기본 라우팅 테이블이 생성된 것을 확인 할 수 있다. 


Subnet이란? 

왼쪽 퍼블릭 서브넷, 오른쪽 프라이빗 서브넷

VPC 내에서 서로 분리된 작은 네트워크를 만들고, 리소스(ec2 인스턴스)를 논리적으로 구분할 수 있는 단위로, 이를 통해 네트워크 관리와 트래픽 제어가 용이해진다.

  • 퍼블릭 서브넷(public subnet): 외부 인터넷과 연결된 리소스를 배포할 때 사용
    • 웹서버(프론트), 프록시 서버 등 인터넷을 통해 접근이 필요한 리소스(외부에 직접적으로 노출됨)
    • 인터넷 게이트웨이를 통해 외부와 직접 통신
  • 프라이빗 서브넷 (private subnet): 인터넷에 직접 연결되지 않은 리소스를 배포할 때 사용
    • 데이터베이스 서버, 내부 애플리케이션(백엔드) 서버 등 외부에서 접근이 필요 없는 리소스
    • NAT 인터넷 게이트웨이를 통해 인터넷으로 나가는 트래픽만 허용 가능

 

다음으로 VPC 내에 구성된 서브넷을 생성 할 것이다.

퍼블릭 서브넷, 프라이빗 서브넷으로 구성할 것이기에 총 2개를 생성할 것이다.

 

Subnet 생성하기

1. VPC 서비스에서 서브넷을 선택하여 서브넷 생성하기

 위 사진에서 VPC ID에 내가 새로 생성한 VPC를 선택한다. 기본값인 VPC가 아닌 새로 생성한 VPC를 선택해야함을 주의하자.

 

2. 서브넷 하위 정보 입력하기

  • 서브넷 이름 - blog_public_subnet / blog_private_subnet
  • 가용 영역 - 아시아 태평양(서울) / ap-northeast-2a(둘다)
    만약 아시아 태평양이 보이지 않는다면 리전이 제대로 선택되었는지 확인하자, 다른 리전이면 생성한 VPC를 지우고 서울로 진행하거나 해당 리전 그대로 진행하자.
  • IPv4 VPC CIDR 블록 - VPC에서 생성한 그대로 따라가면 된다(선택지는 어차피 하나일 것이다)
  • IPv4 서브넷 CIDR 블록
    • blog_public_subnet - 192.168.1.0/24
    • blog_private_subnet - 192.168.2.0/24

각각 하나씩 입력하여 총 2개의 서브넷을 생성하면 된다.


라우팅 테이블이란?

라우팅 테이블 아이콘

네트워크 트래픽이 어디로 전달될지를 결정하는 역할.
서브넷 내의 리소스가 인터넷이나 다른 서브넷, 네트워크로 트래픽을 보낼 때 어떤 경로를 사용할지 정의한다.

지금 당장은 라우팅 테이블의 역할에 대해 이해가 될수도 있고 안될 수도 있지만
위 그림을 떠올리며 앞으로의 실습을 진행하다보면 조금씩 라우팅 테이블에 대한 이해도가 증가 할 것이다.

 

 

 

다음으로 라우팅 테이블도 퍼블릭, 프라이빗을 구성하기 위해 2개 만들 것이다. 

Route Table 생성하기

1. VPC 서비스에서 라우팅 테이블 선택 후 생성하기

  • 이름: blog_rtb_public / blog_rtb_private
  • VPC: 생성했던 VPC - blog_vpc

2. 서브넷 연결하기

해당 라우팅 테이블에 연결된 서브넷이 있다면 명시적 서브넷 연결에 해당 서브넷이 표시된다.

이렇게해서 저장하면 해당 라우팅 테이블에 서브넷이 연결된다.

 

아래는 VPC 기본 라우팅 테이블과 새로 생성한 라우팅 테이블에 각각 하나의 서브넷이 연결된 모습


이제 라우팅 테이블을 통해 서브넷을 퍼블릭 또는 프라이빗으로 만들기 위해 인터넷 게이트웨이와 NAT 게이트웨이를 생성 할 것이다.

 

인터넷 게이트웨이란?

IGW 아이콘

VPC 내의 퍼블릭 리소스가 외부의 인터넷과 통신 할 수 있도록 도와주는 게이트웨이

NAT 게이트웨이란?

NAT 아이콘

외부와 단절된 프라이빗 서브넷에 있는 인스턴스들이 인터넷과 간접적으로 통신 할 수 있도록 해주는 서비스
이것을 통해 프라이빗 서브넷의 인스턴스들은 인터넷은 통신하지만 외부에 직접적으로 노출되지 않는다.

 

인터넷 게이트웨이(IGW, internet gateway) 생성하고 연결하기

1. VPC 서비스에서 인터넷 게이트웨이 선택하고 생성하기

2. 생성한 IGW를 VPC에 연결하기

VPC 당 하나의 IGW만 있으면 된다.(여러개 불가능)

3. 라우팅 테이블에 가서 퍼블릭 라우팅 테이블에 인터넷 게이트웨이 추가하기

 

4. 퍼블릭 라우팅 테이블에 정상적으로 연결됨을 확인

 

NAT 게이트웨이(NAT gateway) 생성하고 연결하기

 

! 주의 - NAT 게이트웨이는 시간당 0.059 달러가 부과되므로 비용이 부담된다면, 해당 단계를 건너 뛰어도 된다.

            또한, 실습이 마친다면 바로 삭제해주자

 

1. VPC 서비스에서 NAT 게이트웨이 선택하고 생성하기

  • 이름 - blog_nat
  • 서브넷 - blog_public_subnet: 퍼블릭 라우팅 테이블에 연결되어 있는 퍼블릭 서브넷을 선택하면 된다
  • 연결 유형 - 퍼블릭: 인터넷과 통신시키기 위함이므로 NAT는 퍼블릭 설정
  • 탄력적 IP 할당 - 해당 버튼을 눌러 탄력적 IP를 할당해주자

2. 라우팅 테이블에 가서 프라이빗 라우팅 테이블에 NAT 게이트웨이 추가하기

 

3. 프라이빗 라우팅 테이블에 정상적으로 연결됨을 확인

 

이렇게 성공적으로 다 만들어서 연결한다면 축하한다. 

나만의 VPC를 생성하고 필요한 구성을 모두 마쳤다. 

 

 

VPC의 리소스 맵

전체적인 구성도는 아래 그림과 같다(해당 그림에서는 서브넷이 여러개 있다. 만약 동일하게 하고 싶다면 서브넷을 더 생성하여 퍼블릭, 프라이빗 라우팅 테이블에 연결해주기만 하면 된다)

 

이 사진을 잘 보면 퍼블릭 라우팅 테이블과 프라이빗 라우팅 테이블의 차이점이 하나 보인다.

그것은 라우팅 테이블의 라우팅되는 목적지가 인터넷 게이트웨이냐 NAT 게이트웨이냐의 차이점이다.

따라서,

- 특정 프라이빗 서브넷을 퍼블릭 서브넷으로 바꾸고 싶다면?
    해당 서브넷의 프라이빗 라우팅 테이블로부터 연결을 해제하고 퍼블릭 라우팅 테이블에 연결

- 특정 퍼블릭 서브넷을 프라이빗 서브넷으로 바꾸고 싶다면?

   해당 서브넷의 퍼블릭 라우팅 테이블로부터 연결을 해제하고 프라이빗 라우팅 테이블에 연결

 

또한, 외부와의 인터넷 연결이 

인터넷 게이트웨이 - 퍼블릭 라우팅 테이블 - 퍼블릭 서브넷 - NAT 게이트웨이 - 퍼블릭 라우팅 테이블 순으로 되어 있기에 프라이빗의 서브넷에서 외부와의 인터넷 통신이 안된다면 해당 순서가 정상적으로 연결되었는지 확인 해야 한다.

 


보안그룹 생성하기

보안그룹은 VPC에 종속되어 다른 VPC라면 보안그룹도 그에 맞춰 새로 생성해야 한다.

따라서 우리는 ssh 연결만 할 것이기에 22포트만 허용된 보안그룹을 생성할 것이다.


자 이제 생성한 VPC에 인스턴스를 연결해보자

인스턴스는 퍼블릭 서브넷, 프라이빗 서브넷에 각각 1개를 만들 것이다.

 

생성한 VPC에 인스턴스 생성하기

인스턴스 생성하는 기본 정보는 모두 동일하다.

  • 이름 - blog_public / blog_private 
  • OS - ubuntu
  • 인스턴스 종류 - t2.micro
  • 키 페어 - blog_key

네트워크 설정에서 달라진다. 아래 그림을 따라하자

1. 네트워크 설정 - 편집 클릭

2.  세부 설정

  • VPC - 생성한 VPC 선택
  • Subnet - 해당 인스턴스가 퍼블릭이라면 퍼블릭 서브넷 선택: 인스턴스가 연결되는 서브넷이 어떤 서브넷이냐에 따라 인스턴스가 퍼블릭 인스턴스인지, 프라이빗 서브넷인지 갈리게 된다.
  • 퍼블릭 IP 자동 할당 - 활성화
  • 방화벽 - 기존 보안 그룹 선택 : 아까 VPC에 맞게 새로 생성한 보안 그룹 선택(인바운드: 22)

3. 인스턴스 추가

4. 퍼블릭 인스턴스 접속

 - ssh로 접속하는 방법도 있지만 저는 귀찮으므로 콘솔을 통해 접속하도록 하겠습니다. 

해당 이미지처럼 나온다면 정상적으로 접속된 것

 

5. 프라이빗 인스턴스 접속

- 똑같이 접속하려고 하면 아래와 같은 화면이 나올 것이다.

프라이빗 인스턴스는 직접적인 접근은 불가능하고 간접적으로만 가능하다. 왜냐하면 외부(인터넷)으로부터 노출이 되어 있지 않기 때문

 

아래 그림과 같은 상황이다.

그럼 프라이빗 인스턴스로는 접근을 할 수 없는걸까?

방법이 있다! 그것은 바로 퍼블릭 인스턴스에서 프라이빗 인스턴스로 접속하는 방법이 있다. 

자 그럼 프라이빗 인스턴스를 접근하는 순서를 떠올려보겠다.

  • 맥북에서 SSH로 키 페어를 이용해 퍼블릭 인스턴스에 접속한다.
  • 맥북에 있는 키 페어를 퍼블릭 인스턴스로 복사(생성)한다.
  • 퍼블릭 인스턴스에서 SSH로 프라이빗 인스턴스에 접속한다.
    • 이때 프라이빗 인스턴스로의 접속은 퍼블릭 IP가 아닌 프라이빗 IP로 접속해야 한다.
      왜냐하면 프라이빗 인스턴스에서 받은 퍼블릭 IP는 NAT를 통해 외부와 인터넷 통신을 위해 할당받은 IP이기에 외부에서 내부로 들어가지는 못한다.
      따라서, VPC의 특성("VPC 내에 있는 모든 요소는 모두 VPC 라는 네트워크 안에 구성되어 있으므로 프라이빗 IP로 통신 할 수 있다.")을 이용해서 프라이빗 IP로 접속을 할 것이다.

 

프라이빗 인스턴스에 접속하기

1. 준비하기

  • 퍼블릭 인스턴스의 퍼블릭 IP
  • 프라이빗 인스턴스의 프라이빗 IP
  • 키 페어 값
    • 해당 키 페어를 cat <키페어>를 한다면 아래와 같은 형식이 나오는데 %을 제외한 모든 값을 복사한다 
      -----BEGIN RSA PRIVATE KEY----
      ~~~
      -----END RSA PRIVATE KEY-----

      물결표만 복사하는 것이 아닌 맨 끝 %을 제외한 모두를 복사하면 된다.

2. 퍼블릭 인스턴스에 접속하기

    ssh -i <키페어> ubuntu@<퍼블릭 인스턴스의 퍼블릭 IP>

3. 퍼블릭 인스턴스에 키 페어 복사(생성)하기

  • 명령어 sudo vi blog_key.pem 입력
  • 키 페어 값 붙여넣기(보통 아무런 값이 입력되어 있지 않았을 때 붙여넣기 커맨드를 하면 모두 붙여넣어진다)
    • 지워야 한다면 영어 d를 꾹 누르면 모두 지워진다.
    • 혹은 esc를 계속 눌렀다가 영어 i를 누르면 insert 모드가 되어 직접 편집 할 수 있다.
  • 모두 입력했다면 esc를 한번 누르고 :wq (저장하고 나오기) 를 하면 된다
  • 명령어 ls를 입력했을 때 해당 키 페어가 생성되어 있는 것을 확인

4. 프라이빗 인스턴스에 접속하기

    ssh -i <키페어> ubuntu@<프라이빗 인스턴스의 프라이빗 IP>

정상적으로 접속했다면 퍼블릭 인스턴스에 처음 접속하듯이 똑같은 화면이 나타나는 것을 볼 수 있다.

정상적으로 프라이빗 인스턴스에 접속했다.

 

위 사진에서 첫번째 빨간 박스의 IP 주소는 프라이빗 인스턴스의 프라이빗 IP이고, 두번째 박스는 퍼블릭 인스턴스의 프라이빗 IP인 것을 확인 할 수 있다.

 


결론

왜 이렇게까지 불편하게 설정해야 할까요?

 

편리함을 우선시하면 보안에 취약점이 생길 수 있다. 내가 쉽게 접근할 수 있도록 만든 인프라는, 역으로 생각하면 다른 사람들, 즉 악의적인 사용자들도 손쉽게 접근할 수 있다는 뜻이다. 특히, 백엔드 서버나 데이터베이스 서버는 민감한 정보를 다루기 때문에, 이를 공인 IP로 노출시키는 것은 큰 보안 위험을 초래할 수 있다. 

 

따라서, 클라우드 환경에서 백엔드 인스턴스나 데이터베이스 인스턴스는 프라이빗 서브넷에 분리하여 배치하고, 직접 외부에 노출되지 않도록 하는 것이 기본적인 보안 원칙이기에, 이렇게 구성하여 외부에서는 이러한 민감한 인스턴스에 직접 접근할 수 없고, 내부에서만 안전하게 접근할 수 있게 된다.

 


실습을 다 마쳤다면. 생성했던 것들은 모두 지워주자(돈 듦). 삭제는 생성의 역순이다.