Aws 개념
VPC( Virtual Private Cloud )
VPC란?
퍼블릭 클라우드 환경 내에서 사용자가 직접 설계하고 제어하는 고객 전용의 논리적으로 격리된 가상 네트워크입니다.
Aamzon VPC를 사용하면 사용자가 정의한 논리적으로 격리된 가상 네트워크상에서 AWS리소를 제어할 수 있다.
- IP 범위, 라우팅, 보안 정책(Secuity Group)을 직접 설정 가능
VPC는 하나의 아파트라고 비유를 들 수 있다.
Subnet
Subnet은 VPC를 더 작은 논리 네트워크 단위로 세분화한 것이다.
각 서브넷은 CIDR(Classless Inter-Domain Routing) 블록(IP 대역) 으로 정의하고 Public subnet과 Private Subnet으로 분리하여 관리할 수 있다.
Public Subnet: Public Subnet에 존재하는 인스턴스는 외부/내부와 통신이 가능하다.Private Subnet: Private Subnet에 존재하는 인스턴스는 외부와 통신이 불가능하고 내부 통신만 가능하다.
여기서 말한 외부와 내부의 의미는 다음과 같다. 외부는 VPC 바깥의 네트워크를 말하는 것이고 일반적으로 인터넷이 대표적인 외부이다. 내부는 같은 VPC내의 영역을 일컫는다.
앞서 VPC를 설명할 때 하나의 큰 아파트라고 비유를 했다. Subnet은 VPC라는 아파트에 존재하는 각각의 방이라고 비유를 할 수 있다.
Routing Table
브넷과 연결된 라우팅 규칙 집합이다. 특정 목적지(CIDR)에 대해 어떤 게이트웨이(IGW, NAT 등) 로 트래픽을 보낼지 정의
Routing Table 예시:
1
2
• 0.0.0.0/0 → IGW(Internet GateWay) → 인터넷 통신
• 0.0.0.0/0 → NAT Gateway → 프라이빗 ECS에서 외부로
| 항목 | IGW (Internet Gateway) 사용 | NAT Gateway 사용 |
|---|---|---|
| 대상 | Public Subnet에 있는 리소스들 (예: ALB, 공개 EC2 등) | Private Subnet에 있는 리소스들 (예: ECS Task, DB 등) |
| 의미 | 인스턴스가 직접 인터넷과 양방향 통신 가능 | 인스턴스는 인터넷으로 나갈 수만 있음, 외부에서 들어올 수 없음 |
| 필수 조건 | 퍼블릭 IP가 인스턴스에 반드시 부여되어 있어야 함 | 퍼블릭 IP는 없어야 하며, NAT Gateway는 Public Subnet에 있어야 함 |
| 예시 | - ALB가 외부 사용자 요청을 직접 받는 경우 - 웹 서버가 직접 응답 | - DB가 외부 저장소에서 패키지를 다운로드 - ECS가 외부 API 호출 등 |
NAT Gateway가 인스턴스는 인터넷으로 나갈 수만 있음, 외부에서 들어올 수 없다는 것이 모호할 수 있다. Aws 내부에서 요청을 보내면 응답을 받을 수 있지만 외부에서 Aws 내부로 요청은 할 수 없다고 이해하면 된다.
aws 내부에 존재하는 SpringBoot 완전히 다른 네트워크와 통신하기 위해서는 NAT GateWay를 사용한다. 나는 Gemini Api 호출과 Docker Hub에서 이미지를 받아오기 위해 사용했다.
Security Group
Security Group는 AWS에서 제공하는 가상 방화벽(Virtual Firewall)이다. 인스턴스에 대한 인바운드(Inbound) 및 아웃바운드(Outbound) 트래픽을 제어할 수 있다.
- 인바운드 규칙: 인스턴스로 들어오는 요청을 허용할지 결정
- 아웃바운드 규칙: 인스턴스에서 나가는 요청을 허용할지 결정
서브넷이 네트워크를 논리적으로 나누는 구조적인 장치라면, 보안 그룹은 실제 트래픽의 입출입을 통제하는 문지기 역할을 한다.
예시:
- 80포트(HTTP)와 443포트(HTTPS)만 허용
- 특정 IP나 VPC로부터만 SSH 접속 허용 등
보안 그룹은 상태 저장(Stateless)이 아닌 상태 유지(Stateful) 하다. 즉, 인바운드가 허용되면 대응하는 아웃바운드는 자동으로 허용된다.
ALB( Application Load Balancer )
ALB란 OSI 7계층 중 L7(어플리케이션) 계층에서 동작하는 로드 밸런서이다. 이런게만 알고 있으면 추상적이고 와닿지가 않는 것같다.
ALB는 URL, 쿠키, 헤더 등을 기준으로 분산한다. 즉 사용자가 /api/user와 같은 api를 서버한테 요청을 하면 이 ALB가 요청 받아 실질적인 메인 백엔드 서버에게 전달한다.
ALB는 Nginx와 유사한 역할을 한다. ALB를 사용하면 Aws 위에서 console을 이용하여 편리하게 관리할 수 있지만, Nginx를 사용하면 직접 Ec2에 띄어서 관리를 해야한다.
Nginx 사용하며 삽질을 하면 네트워크에 대한 기본기가 생길 것이다.
ECS( Elastic Container Service )
AWS의 컨테이너 오케스트레이션 서비스이다.
EC2또는 Fargate 런타임 위에 컨테이너를 배포한다.- 보통
ECSTask는 Private Subnet에 배치하여 보안성을 높인다. - 외부 요청은
ALB를 통해 들어옴 - 외부로 나가는 요청은
NATGateway 통해 전송된다.
Docker 컨테이너를 클러스터 기반으로 배포·관리할 수 있도록 해주는 플랫폼이다. 실제로 ECS에서 서비스를 생성하거나 Task Definition를 작성할 때image를 명시하는 field가 존재한다. 여기에 docker image를 기입하면 docker hub에 존재하는 image로 컨테이너가 생성된다.
ECR( Elastic Container Registry )
이미지를 저장하는 Repository이다. ECS에서 서비스를 생성할 때 Docker Image로 생성할 수 있지만 SpringBoot를 띄울 때는 직접 생성한 이미지가 필요하다. ECR 직접 생성한 이미지를 저장할 수 있는 저장소이다.
나는 Github action과 ECR를 연동하였다.
main branch에 변경사항이 있으면 Github action이 트리거된다. 변경 사항이 적용된 프로젝트의 이미지를 ECR로 push하고, ECS 또한 update된다.
Github action -> ECR Flow 예시
Cloudmap
AWS Cloud Map은 ECS 서비스를 포함한 다양한 리소스를 DNS 기반으로 자동 등록하고 조회할 수 있게 해주는 서비스 디스커버리 도구이다. 즉, ECS 서비스에 DNS 이름을 붙여서 다른 서비스가 쉽게 찾을 수 있도록 하는 주소록 역할을 한다.
VPC 내부 DNS에서만 접근 가능함을 주의하자.
Namespace란?
Cloud Map에서 Namespace는 이름 공간이다. 즉, 서비스의 도메인 구조를 정의하는 최상위 DNS 영역이다.
나는 ECS끼리 서로 통신하는데 있어서 쉽게 서로를 식별할 수 있게 만들었다. howru 라는 네임스페이스를 만들고 spacy-api,fast-api,libretranslate DNS를 등록하였다.
SpringBoot는 다른 ECS를 식별할때 다음과 같이 식별할 수 있다.
spacy-api.howru:8000fast-api.howru:8001libretranslate.howru:5000
데이터 흐름 요약
1) 외부 → ECS로 (수신 흐름)
1
2
3
4
5
6
7
사용자 브라우저
↓
인터넷 게이트웨이 (IGW)
↓
퍼블릭 서브넷의 ALB
↓
프라이빗 서브넷의 ECS Task (사설 IP)
ECS가 퍼블릭 IP가 없어도 외부 요청을 처리할 수 있음
ALB 가 외부와 통신을 담당, 내부에 사설 트래픽 전달
2) ECS → 외부로 (송신 흐름)
1
2
3
4
5
6
7
ECS Task (Private Subnet)
↓
NAT Gateway (Public Subnet)
↓
인터넷 게이트웨이
↓
외부 인터넷
ECS가 외부 API를 호출하거나 패키지 다운로드 시 사용
NAT Gateway가 인터넷으로 나가는 트래픽을 중계
reference links
- https://foghornconsulting.com/2023/09/19/what-is-vpc-in-aws
- https://aws.amazon.com/ko/blogs/korea/easily-manage-security-group-rules-with-the-new-security-group-rule-id/

