AWS VPC 3-tier Based Architecture에 기반한 VPC와 Application 연결
Connecting a VPC to a 3-tier application layer VPC
Dec 15, 2023
3-tier Architecture란?VPC 생성VPC 생성Private / Public Subnet 생성 Public Routing Table 및 Private Routing Table 생성 및 연동VPC와 Application (EC2 와 연결) Private EC2 생성 Bastion Host 생성
회사에서 인프라 관련 온보딩 문서를 작성하다가, AWS에서 인프라를 구성하는 막연한 개념에 대해서 어떻게 이해시키면 좋을지 고민하게 됐다. 그러던 중 VPC 실습을 통해 인프라 리소스를 직접 만들어보며 개념을 익히는 것이 좋다고 생각하여 간단한 실습 문서를 작성하게 됐다.
3-tier Architecture란?
VPC 3-tier Architecture란 계층을 3개(Presentation Tier, Application Tier, Database Tier)로 나누어
인프라를 설계하는 것을 말합니다.
이번 실습에선 Database 계층을 제외한 나머지 핵심 요소들을 생성하고 서로간 연결하는 방법에 대해서 알아보겠습니다. 일반적으로 데이터베이스를 제외한 3-tier Architecture를 구성한다고 치면, 흔히 생각할 수 있는 구조는 다음과 같습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F2d3a10f3-9662-42d8-b2df-8c58dd9951bc%252FFrame_26.png%3Ftable%3Dblock%26id%3Dd141c08c-95aa-4893-810b-df352e4eea8d%26cache%3Dv2&w=3840&q=75)
위 구조를 살펴보면, VPC가 리소스들을 둘러싸고 있고 사설 network인 VPC안의 Application 들이 외부 인터넷과 통신할 수 있도록 IGW와 NAT이 이를 중간에서 중계하는 것 입니다. 고가용성과 대용량 트래픽 처리를 위해 AZ는 2개로 설정됐고 ALB와 Scaling Group이 이를 지원하는 구조입니다.
Routing Table에서 트래픽 혹은 패킷이 어떻게 이동해야 할지 지시해주며, 데이터는 이 흐름을 따라 Bastion host를 경유하여 Application이 위치한 layer에 도달하고 이에 대한 응답이 이루어집니다.
이번 실습에서 수행할 메인 작업은 VPC와 Application 계층을 이어주는 작업입니다. 표현 계층인 Presentation Tier에서 사용할 Load Balancer나 Scale out을 도와주는 Auto Scale Group 등은 이번 실습에서 제외되는데, 그 이유는 VPC 생성과 EC2를 연결하는 과정에서 Load Balancer의 연결이 필수는 아니라서입니다. 고가용성과 부하 분산의 개념에 대해서 설명하는데, 도움이 되겠지만 인프라 구성을 위한 목적에는 부합하지 않다고 느꼈습니다.
이번 게시물의 주요 목적은, 간단한 실습을 통해 AWS 인프라 구성에 대한 이해를 키우는 것 입니다.
IGW, NAT Gateway?
위 Architecture에서 IGW와 NAT Gateway에 대해서 잘 모르시는 분들이 있을 수 있습니다.
간단하게 설명하면,
NAT Gateway
- NAT은 기본적으로 네트워크 주소 변환 기술입니다. 일반적인 네트워크 구조에서 NAT은
- 출발지 IP 10.10.10.10, 목적지 IP 20.20.20.20 포트 80으로 패킷 전송
- NAT 장비에서 패킷 수신 후 정책에 따라 외부 네트워크와 통신 가능한 공인 IP 11.11.11.11로 IP 주소 변경, NAT 변경 전후의 IP 주소는 NAT 테이블에 저장
- NAT 장비에서 출발지 주소를 11.11.11.11로 변경해 패킷 전송
- 수신한 Application에서 Response 발신, 출발지 IP가 20.20.20.20으로 목적지는 공인 IP 11.11.11.11
- Application으로부터 응답을 수신한 NAT 장비가 자신의 NAT 테이블의 목적지 IP에 대한 원래 패킷을 발생시킨 출발지 IP주소 와 매핑 후 재변환 후 패킷 수신 의 흐름으로 동작합니다.
AWS의 NAT Gateway도 이런 흐름과 비슷하게 동작합니다.
- NAT Gateway는 NAT Gateway(네트워크 주소 변환 게이트웨이)는 프라이빗 서브넷 내의 인스턴스가 인터넷과 통신할 수 있도록 하는 서비스입니다. 아웃바운드 트래픽을 위한 것으로 사용되며, 인바운드 트래픽은 지원하지 않습니다.
- Private Subnet에서 MySQL이나 Node.js 등의 설치를 위해 외부와 통신하기 위해서는 NAT Gateway가 필요합니다. 내부로 들어오고 나가는 트래픽 뿐만 아니라, 서버는 외부 인터넷과 연결되어 특정 리소스 등을 설치할 필요가 있는데, 이 때 NAT Gateway가 없다면 외부 인터넷과 접근할 수 없게 됩니다.
IGW(Internet Gateway)
- 인터넷 게이트웨이는 수평 확장되고 가용성이 높은 중복 VPC 구성 요소로, VPC와 인터넷 간에 통신할 수 있게 해줍니다. IPv4 트래픽 및 IPv6 트래픽을 지원합니다. 네트워크 트래픽에 가용성 위험이나 대역폭 제약이 발생하지 않습니다.
- 리소스에 퍼블릭 IPv4 주소 또는 IPv6 주소가 있는 경우 인터넷 게이트웨이를 사용하면 퍼블릭 서브넷(예: EC2 인스턴스)의 리소스가 인터넷에 연결할 수 있습니다.
- IGW를 통해 Public Subnet과 연결된 Bastion Host에 접근할 수 있고, Private Subnet안의 Application에게서 응답을 받을 수 있게 됩니다.
VPC 생성
아래의 값들을 기반으로 리소스들을 생성할 것 입니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fcfe7990f-afdf-433a-b108-98b2dc631a48%252FUntitled.png%3Ftable%3Dblock%26id%3De3f8f92d-01e4-4464-84c6-0e99c09f37af%26cache%3Dv2&w=3840&q=75)
VPC 생성
VPC를 생성할 때, 사용할 IPv4 CIDR 영역에 대한 설계가 존재하겠지만, 이번 실습에서는 어떻게
사설 network의 인프라망을 구성해야 하는가가 목적이 아닌 실제 AWS에서 Resource를 생성하는 것에 목적이 있기 때문에 제외하겠습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F5db9c1a6-bb20-4ce6-8b55-7098ad30a07f%252FUntitled.png%3Ftable%3Dblock%26id%3D938bd20b-dd4c-4eef-a50f-4ecdf7c3dcc4%26cache%3Dv2&w=3840&q=75)
Private / Public Subnet 생성
- Lay-subnet-sample-public1-ap-northeast-2a
- Lay-subnet-sample-public2-ap-northeast-2c
- Lay-subnet-sample-private1-ap-northeast-2a
- Lay-subnet-sample-private2-ap-northeast-2c
그 다음 서브넷을 생성합니다. 하나의 VPC에 사용할 subnet 4개를 동시에 만들어야 합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fe082f21e-ed1b-4743-8e06-1d534d63be09%252FUntitled.png%3Ftable%3Dblock%26id%3D9462e2c8-0db0-47fb-a9bd-ade4ba2f00ef%26cache%3Dv2&w=3840&q=75)
Internet Gateway 생성 및 연동
인터넷 게이트웨이(IGW)를 생성했다면, vpc와 연결해야 합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F7afca31c-5e8d-41e2-8c2d-4a1d02d9858a%252FUntitled.png%3Ftable%3Dblock%26id%3Da330b96f-3fab-4b21-81b5-947854537ecd%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F1a4446ab-698a-435d-a775-57b2f42fb27c%252FUntitled.png%3Ftable%3Dblock%26id%3D1839e89a-1194-41b8-8d49-678396485c48%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fccc99289-f9f8-4936-91a1-4e9e1ea39e9d%252FUntitled.png%3Ftable%3Dblock%26id%3D5f0ccfc3-dd32-4a7f-9695-fa2ea5112d21%26cache%3Dv2&w=3840&q=75)
위에서 설명했던 것 처럼, IGW를 VPC와 연결해주지 않는다면 사설 네트워크로 진입할 길목이 사라져 접근할 수 없습니다. IGW를 통해 인터넷에 연결되는 것은 주로 퍼블릭 서브넷의 인스턴스들이며, 프라이빗 서브넷의 인스턴스들은 NAT Gateway나 Bastion Host를 통해 간접적으로 외부와 통신합니다.
NAT gateway 연결
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F634a62ad-c937-4a26-bfff-055eb978b692%252FUntitled.png%3Ftable%3Dblock%26id%3D833586da-ee77-4278-911d-5c1fd6afc0de%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F088498d7-2302-4c06-b8e7-64f59cdd67e7%252FUntitled.png%3Ftable%3Dblock%26id%3D7b5743b4-2427-4fe4-9a4a-87cd1b430fe7%26cache%3Dv2&w=3840&q=75)
Private Subnet안에 갇혀 있는 Application이 외부 인터넷과 연결하기 위해 NAT Gateway가 사용되기 때문에 당연히 Private Subnet과 연결될 것 같지만 , NAT Gateway를 생성할 때 Public Subnet과 연결해야 합니다.
그 이유는, 결국 Public Subnet안에 있는 리소스만이 실제 Public IP를 사용할 수 있기 때문에, NAT Gateway가 Public Subnet안에 없다면 변환한 NAT 장치가 보낼 트래픽이 당도할 길이 존재하지 않게 됩니다.
이러한 이유로 NAT Gateway의 서브넷은 Public이 됩니다.
Public Routing Table 및 Private Routing Table 생성 및 연동
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F83361efc-fe7d-4b15-bf3b-b1d0965f829a%252FUntitled.png%3Ftable%3Dblock%26id%3Dfa97b6bc-f798-4601-80c4-8e40863b0b46%26cache%3Dv2&w=3840&q=75)
VPC에 연결되있는 라우팅 테이블을 public으로 네이밍하고 위에서 생성한 igw를 연결시켜줍니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F9927cd12-f330-478a-927d-0fe0fd1a04af%252FUntitled.png%3Ftable%3Dblock%26id%3Dd8af16f7-93b0-433a-bbb3-8e66ae0f576c%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F6da10929-689e-4671-b1ce-f0a6ea5be2da%252FUntitled.png%3Ftable%3Dblock%26id%3D9e12abd5-6b0a-4b99-96ab-2a6e9f831dd0%26cache%3Dv2&w=3840&q=75)
그리고 퍼블릭 서브넷을 이 퍼블릭 라우팅 테이블에 연동시켜줍니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F311cc204-765b-4033-9a5a-ff61a6905916%252FUntitled.png%3Ftable%3Dblock%26id%3D7a2acbf6-ad86-4185-8b95-85eebccd2cc6%26cache%3Dv2&w=3840&q=75)
그리고 이제, Private routing table도 생성합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fce969fa8-5339-4b35-9fb8-19cf9a91c788%252FUntitled.png%3Ftable%3Dblock%26id%3D3a602ae1-1574-4f2a-8ed9-146aed3da285%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F38e00bbd-6bbe-4da2-8805-5989ff6c7361%252FUntitled.png%3Ftable%3Dblock%26id%3Df3a0aaa0-9880-49e2-9fa1-41081b45f096%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F49096dd5-7a28-47ef-83c4-0d6395a24154%252FNAT_3.png%3Ftable%3Dblock%26id%3De55e0a24-5cc0-4a3d-81d4-93999ffb8d6a%26cache%3Dv2&w=3840&q=75)
Private Routing Table은
NAT gateway
를 연결한뒤, Private subnet을 연결합니다. 여기까지 완료 했다면, 기본적인 VPC 설정이 완료된 것 입니다.
VPC와 Application (EC2 와 연결)
이제 위에서 생성한 VPC와 Application을 연결해줘야 합니다.
Private EC2 생성
EC2는 Ubuntu 22.04 LTS 버전이나 20.XX LTS 버전으로 생성합니다.
키페어를 생성하고, Private ec2는 아래와 같이 생성합니다.
아래로 내리다보면, 네트워크 설정이 나오는데 위에 편집버튼을 눌러야 VPC를 편집할 수 있습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fe54bb805-0887-4d66-94f1-594b0fe25a0c%252FUntitled.png%3Ftable%3Dblock%26id%3D637250c8-386e-48ad-a8f2-b99e54299a61%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fa9bbf374-db0e-4ac9-8f48-63003e513a8a%252FUntitled.png%3Ftable%3Dblock%26id%3D7c1a71e4-1a58-40fe-9865-7ebece15926b%26cache%3Dv2&w=3840&q=75)
편집버튼을 누르면 위와 같이 네트워크 환경을 편집할 수 있게되는데, VPC와 서브넷 그리고 퍼블릭 IP 자동 할당 등 위와 같이 설정하면 됩니다.
Bastion Host 생성
Bastion Host EC2를 생성하면 되는데, VPC는 똑같은 것을 고르고 서브넷은 public1을 골라줍니다. 여기서 퍼블릭 IP 자동 할당을 선택해주고나서, 소스 유형을 내IP로 선택후 생성합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252Fd79eafe1-8ead-454d-a6e1-d03ca4a4d873%252FUntitled.png%3Ftable%3Dblock%26id%3Da2b7d87d-c092-45ed-8177-82ee3c11c793%26cache%3Dv2&w=3840&q=75)
여기까지 완료 하셧다면, 이제 EC2와 위에서 생성한 VPC를 연결해 가장 처음에 나왔던,
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Ff02ca0c9-9279-4cd3-bf61-49a4adc12473%252F2d3a10f3-9662-42d8-b2df-8c58dd9951bc%252FFrame_26.png%3Ftable%3Dblock%26id%3D32d88299-f028-437b-80d8-99c011ee24cb%26cache%3Dv2&w=3840&q=75)
위 구조에 ALB와 Auto Scale Group을 제외한 인프라 구성이 완료된 것 입니다.
이제 Bastion Host를 통해 Private Subnet에 위치한 EC2에 접속하여 Node.js를 설치해보면 설치될 것 입니다. 만약 NAT Gateway가 빠져있다면 설치가 안될 것이고, IGW가 연결이 안됐다면 요청이 가지 않을 것 입니다.
혹은 다른 문제가 발생했다면 Routing Table을 다시 한 번 가이드대로 잘 진행했는지 확인 하시면 좋을 것 같습니다.
간단한 실습을 위해 구체적인 설정값들은 대부분 제외 됐지만, 위 작업을 통해 AWS의 VPC를 통한 3-tier 인프라 구성에 대해 기본적인 개념을 이해하셧길 바랍니다.
만약, VPC 기본지식에 대한 추가적인 정보가 필요하다면 링크를 통해 학습하면 좋습니다. ⇒ Link
Share article