본문 바로가기

카테고리 없음

[AWS 배포] : AWS 네트워크 구조 이해

반응형

먼저 AWS를 하나의 회사 건물이라고 생각해보자.

                    회사 건물 (VPC)

        ┌────────────────────────────────────┐
        │                                    │
        │      사무실(Private)               │
        │                                    │
        │      서버실(Private)               │
        │                                    │
        │      안내데스크(Public)            │
        │                                    │
        └────────────────────────────────────┘

인터넷 사람들은

절대로

서버실

로 들어가면 안 된다.

반드시

안내데스크

를 거쳐야 한다.

AWS에서는

안내데스크가

ALB(Application Load Balancer)

이다.


VPC란?

VPC는

내 회사만 사용하는 네트워크

이다.

쉽게 말하면

AWS 안에 내 전용 IDC

를 하나 만드는 것이다.

예를 들어

VPC

10.0.0.0/16

을 만들면

이 안에는

10.0.x.x

만 존재한다.

인터넷에서는

절대로

10.0.1.25

같은 주소를 볼 수 없다.


Subnet은?

VPC를

건물이라고 하면

Subnet은

방이다.

예를 들어

VPC

┌────────────────────────────┐

Public

Private

Database

└────────────────────────────┘

처럼 나눈다.


왜 Public과 Private를 나누나?

예를 들어

ERP 서버가

인터넷에

직접 노출되어 있다고 생각해보자.

Internet

↓

Backend

↓

Database

이러면

해커가

바로

8000 포트

를 공격할 수 있다.

이건 매우 위험하다.


그래서

실제로는

Internet

↓

ALB

↓

Backend

↓

Database

구조를 만든다.

Backend는

인터넷에서 보이지 않는다.


Public Subnet

Public Subnet은

인터넷이 보이는 방이다.

여기에는

보통

ALB

NAT Gateway

Bastion Host

만 넣는다.

외부 사람들이

접속 가능한 것만 둔다.


Private App Subnet

여기가

실제 서비스가 실행되는 곳이다.

React

Django

Node

NestJS

FastAPI

Spring

전부

여기에 있다.

여기에는

Public IP

가 없다.

인터넷에서는

접속이 안 된다.


Private Data Subnet

여기는

데이터만 있다.

PostgreSQL

Redis

EFS

등이다.

심지어

Backend도

허가를 받아야 들어간다.


전체 그림

                    Internet

                         │

                         ▼

                 ALB (Public)

                         │

──────────────────────────────────────

          Private App Subnet

      Frontend

            │

            ▼

      Backend

            │

──────────────────────────────────────

        Private Data Subnet

      PostgreSQL

      EFS

이게

가장 많이 쓰는 구조다.


왜 ALB만 인터넷을 보게 하나?

예를 들어

ERP에는

/login

/api

/files

가 있다.

사용자는

erp.company.com

으로 접속한다.

DNS는

ALB를 가리킨다.

erp.company.com

↓

ALB

↓

Backend

Backend는

세상에 존재하는지조차

모른다.


Security Group이란?

이게

AWS 방화벽이다.

예를 들어

ALB에는

443 허용

만 한다.

Internet

↓

443

ALB

끝이다.


Backend는

8000

을 열어야 한다.

하지만

누구에게?

인터넷이 아니라

ALB에게만.

ALB SG

↓

Backend SG

8000

ALB만

Backend를 볼 수 있다.


Database는?

PostgreSQL은

5432

를 쓴다.

하지만

절대로

Internet

↓

5432

를 열면 안 된다.

대신

Backend SG

↓

5432

RDS SG

만 허용한다.

그러면

Backend만

DB를 본다.


EFS도 마찬가지

EFS는

NFS 프로토콜을 쓴다.

포트는

2049

이다.

하지만

역시

Backend SG

↓

2049

EFS

만 허용한다.


왜 Public IP를 안 주는가?

이게 정말 중요하다.

예를 들어

Backend가

3.39.xxx.xxx

라는 Public IP를 가지면

전 세계 누구나

접속을 시도할 수 있다.

http://3.39.xxx.xxx:8000

누군가 계속 때릴 수 있다.

하지만

Private IP만 있다면

10.0.2.15

같은 주소다.

이건

AWS 내부에서만 보인다.

인터넷에서는

아예 접근할 수 없다.


그런데 Private 서버는 인터넷을 어떻게 쓰나?

Backend도

패키지를 설치하고

AWS API도 호출해야 한다.

그래서

Private

↓

NAT Gateway

↓

Internet

를 사용한다.

밖으로는 나갈 수 있지만

밖에서 안으로는 못 들어온다.

이걸

Outbound Only

라고 생각하면 된다.


가용 영역(AZ)을 두 개 쓰는 이유

서울 리전에는 여러 AZ가 있다.

예를 들어

AZ-A

AZ-C

를 사용한다고 하자.

그러면

                ALB

            /          \

      ECS(A)        ECS(C)

         │              │

      RDS Multi-AZ

         │

       EFS

만약

AZ-A

전체가 장애가 나더라도

AZ-C

가 계속 서비스를 제공한다.

이게 AWS에서 말하는 고가용성(High Availability) 이다.


나의 서비스 ERP 프로젝트에 적용하면

내가 구축하려는 ERP는 이 네트워크 구조가 가장 적합하다.

Internet
     │
Route53
     │
ACM (HTTPS)
     │
ALB (Public Subnet)
     │
────────────────────────────────────
Private App Subnet
     │
 ├── React + Nginx (ECS)
 └── Django (ECS)
     │
────────────────────────────────────
Private Data Subnet
     ├── RDS PostgreSQL
     ├── EFS
     └── Secrets Manager(연동)

이 구조의 핵심은 인터넷에서는 ALB만 보이고, 애플리케이션과 데이터베이스는 모두 사설 네트워크 안에서만 통신한다는 점이다.

다음 단계에서는 이 구조를 바탕으로 VPC를 실제로 어떻게 생성하고, Subnet, Route Table, Internet Gateway, NAT Gateway가 서로 어떻게 연결되는지를 그림과 함께 설명하면 AWS 네트워크의 전체 흐름이 훨씬 명확해질 것이다.

반응형