Amazon VPC 인프라 구축

Public subnet Private subnet 분리형 웹서버 구축

AWS 해결과제 : 한 회사가 전자 상거래 웹 사이트에 대한 다중 계층 응용 프로그램을 만들었습니다. 이 웹 사이트는 퍼블릭 서브넷에 상주하는 Application Load Balancer, 퍼블릭 서브넷에 상주하는 웹 티어 및 프라이빗 서브넷의 Amazon EC2 인스턴스에서 호스팅되는 MySQL 클러스터를 사용합니다. MySQL 데이터베이스는 타사 공급자가 인터넷에서 호스팅하는 제품 카탈로그 및 가격 정보를 검색해야 합니다. 솔루션 아키텍트는 운영 오버헤드를 늘리지 않고 보안을 극대화하는 전략을 고안해야 합니다.

AWS_infra

해결책 : public subnet 과 private subnet 을 각각 생성 MYSQL EC2는 NAT GATEWAY 를 통해 인터넷을 사용하면서 외부와 연결되면서 public subnet을 반드시 거치는 보안상의 이점을 누릴 수 있다. 실습을 통해 구성을 하면서 MYSQL클러스터는 간단하게 EC2로 대체할 것입니다.

  1. VPC 생성

일단 vpc 패널로 들어가 vpc only로 CIDR은 10.0.0.0/16 이름은 Lap VPC로 생성하였습니다. Edit VPC settings 에서 Enable DNS hostnames를 설정합니다.

p1

  1. 퍼블릭 서브넷 프라이빗 서브넷 생성

퍼블릭 서브넷을 먼저 생성 앞서 생성한 vpc 안에서 Public subnet1으로 이름짓고 A 가용영역을 기준으로 CIDR 10.0.0.0/24 로 만들었고 actions 에서 Edit subnet settings에서 auto assign public ipv4 address를 활성화해주면 앞으로 이 서브넷에서 만들어지는 리소스들은 자동으로 CIDR 규칙에 맞춰서 공개 아이피주소를 할당해줄 것입니다. 똑같이 프라이빗 서브넷을 같은 vpc 같은 가용영역에서 만들고 Private Subnet1으로 이름짓고 CIDR은 10.0.2.0/23으로 만들어줍니다. 이것은 10.0.2.x 10.0.3.x영역을 배정해줄 것입니다. 프라이빗 서브넷은 외부에 공개되면 안되므로 auto assign public ipv4를 활성화 해주면 안됩니다.

Untitled

  1. 인터넷 게이트웨이를 vpc에 연결

이제 본격적으로 인터넷이 vpc에 직접 연결이 되도록 인터넷 게이트웨이를 연결할 것입니다. 이것은 외부에서 vpc로 들어올 수도 있다는 뜻입니다. 만약 내부적인 네트워크로만 서로 연결된다면 인터넷 게이트웨이를 붙이면 안됩니다. 현재는 공개 웹 서버를 만들것이므로 인터넷 게이트웨이를 생성 이름을 Lab IGW로 vpc에 직접 Attach 해주면 됩니다.

Untitled

  1. 라우트 테이블을 생성해 라우팅 규칙 설정

이제 vpc 내부 서브넷에 인터넷의 라우팅 규칙을 생성해 vpc 외부로 인터넷 게이트웨이를 타고 라우팅이 될 수 있도록 해줍니다. 이 과정을 거치면 vpc 내부에서 로컬에서 못 찾은 네트워크는 외부 인터넷 게이트웨이를 통해 찾게 됩니다. 라우팅 테이블로 들어가 라우팅 테이블을 생성 후 Edit Routes에서 목적지를 0.0.0.0/0를 연결해둔 인터넷 게이트웨이로 찾아 등록 해주면 됩니다. 맞아 만들어둔 인터넷 게이트웨이가 안보이신다면 인터넷 게이트웨이가 vpc에 연결되어있는지 한번 확인해봅시다.

Untitled

마지막으로 우리가 외부로 보낼 서브넷은 퍼블릭 서브넷이므로 Edit subnet associations에서 퍼블릭 서브넷에 이 규칙을 연결합니다. 이렇게 하면 vpc 내부 퍼블릭 서브넷은 앞으로 로컬에서 주소를 찾고 그 외에는 인터넷을 통해 찾게 됩니다.

Untitled

  1. 퍼블릭 보안 그룹 생성

이제 인터넷이 연결되기 때문에 보안규칙을 생성해야 할 때입니다. EC2가 생성될때 이 보안 규칙을 담은 보안그룹을 연결하여 사용하실 수 있습니다. 보안 그룹으로 가서 새 보안 그룹생성에서 이름을 Public SG로 하고 inbound rules에서 http를 Anywhere로 허용해주도록 합시다. 이 보안 그룹이 EC2에 붙으면 EC2의 http 80번 포트를 통한 네트워크 연결을 허용해줄 것입니다. Tags-optional에서 키값 밸류를 통해 Tag를 지정하면 나중에 Tag를 통한 관리에서 좀 더 유용하게 관리가 가능합니다.

Untitled

  1. Public EC2 시작

이제 마지막으로 퍼블릭 서브넷의 라우팅 규칙과 네트워크를 모두 설정하였고 이제 EC2의 보안 규칙을 담은 보안 그룹도 이미 생성해두었으니 EC2를 만들어 공개 웹 서버로 만들 차례입니다. VPC 콘솔에서 벗어나 EC2 콘솔로 이동해 Launch instances를 눌러 EC2를 생성해줍니다. AMI를 선택하고 (저는 기본 Amazone linux를 골랐습니다.) 인스턴스 유형을 골라줍니다. (저는 t3.micro를 선택하였습니다. -주의 무료 아님)

다음으로 ec2로 원격 접속을 할때 필요한 key pair를 생성해줍니다. 저는 생성을 하지않았습니다.
(키 생성은 외부에서 ssh 접속을 하거나 할때 보안상 필요한 부분입니다. 만약 ssh 접속을 원한다면 ssh 연결규칙도 만들어둔 보안그룹에 추가하여 22번 포트를 허용해야 합니다.)

예전에는 이러한 ssh 접속방법을 많이들 사용하였으나 앞으로는 IAM 역할을 통해 세션 매니저를 통해 EC2에 직접 원격으로 접속하는 것이 더 보안적으로 강력하고 AWS에서도 권장하는 방법입니다.

네트워크 구성에서 vpc로 만들어둔 vpc를 서브넷을 퍼블릭 서브넷 그리고 마지막으로 auto assign public ip 를 허용해줍니다. 인스턴스 보안 그룹 구성은 만들어둔 보안 그룹을 ec2에 연결해줍니다. 스토리지는 필요한 만큼을 사용하고 저는 적은 비용을 위해 기본 설정으로 하였습니다.

마지막으로 Advanced details 에서 User Data - optional 에 다음 코드를 붙여 넣습니다. User Data EC2 부팅시에 root 권한으로 실행되는 스크립트 코드를 미리 설정해줄 수 있습니다.

#!/bin/bash

httpd와 php를 통해 웹 서버를 생성하고 실행시켜 80번 포트로 웹페이지를 띄웁니다. 띄워질 html과 php 파일은 미리 만들어진 압축파일을 wget으로 가져와 압축해재해 /var/www/html에서 httpd가 압축해재된 파일을 통해 웹 서버를 구성해줄 것입니다. 만들어둔 압축파일이 없다면 생략하셔도 됩니다.

yum update -y
yum install -y httpd php8.1
systemctl enable httpd.service
systemctl start httpd
cd /var/www/html
wget <미리 만들어둔 php html 코드들을 압축해놓은 깃허브 주소 등등>
unzip instanceData.zip
  1. HTTP 80번 포트를 통해 웹 서버가 정상적으로 잘 작동하는지 확인해보자.

Instances로 가 만들어둔 EC2 의 status가 2/2 checks passed 인지 확인하고 ipv4 address를 카피하여 인터넷 주소창에서 http://<ipv4-address>를 직접입력해준다. 지금은 80번 포트 http보안 규칙만 허용하였기 때문에 반드시 https가 아닌 http로 연결이 되는지 확인해야 한다. 확인이 된다면 html에 작성한 파일에 따른 웹서버가 제대로 만들어졌는지 확인하자.

  1. NAT 게이트웨이를 생성하고 프라이빗 서브넷에서 라우팅 구성

NAT 게이트웨이를 생성한 다음 라우팅 테이블을 생성하여 비로컬 트래픽을 NAT 게이트웨이로 라우팅합니다. 그런 다음 라우팅 테이블을 프라이빗 서브넷에 연결합니다. NAT 게이트웨이를 사용하여 프라이빗 서브넷의 인스턴스를 인터넷 또는 기타 AWS 서비스에 연결하는 한편, 인터넷에서 해당 인스턴스와의 연결을 시작하지 못하도록 할 수 있습니다. 따라서 private subnet에서 외부에서의 접속을 차단하면서 private subnet은 public subnet을 통해 외부 인터넷과 접속할 수 있습니다.

Untitled

다시 VPC 콘솔로 가 NAT 게이트웨이를 만들어줍니다. 퍼블릭 서브넷을 선택하고 Elastic IP 할당을 선택하여 NAT GATEWAY를 생성해줍니다. 이제 프라이빗 서브넷의 라우팅 규칙을 생성하기 위해 라이팅 테이블을 지정해줍니다. 라우팅 테이블을 생성하여 Destination을 0.0.0.0/0을 선택하고 NAT GATEWAY를 찾아 선택하여 줍니다. 그리고 라우팅 테이블이 작동할 프라이빗 서브넷에 부착하기 위해서 Edit subnet associations를 선택하고 프라이빗 서브넷을 선택해 라이팅 규칙으로 등록해 줍니다.

  1. 프라이빗 EC2를 생성

앞서 만들었던 퍼블릭 EC2 처럼 EC2를 만들어준다. 이름은 Private Instance로 유형과 AMI를 적절히 선택하고 (나는 퍼블릭 인스턴스와 같은 구성으로 만들었다) 네트워크 구성에서 앞서 만들어둔 vpc 서브넷은 프라이빗 공개 ip할당은 비활성 처리한다.

  1. 확인 및 연결

세션 매니저를 통해 프라이빗 인스턴스가 직접 yum 명령어를 통해 외부 인터넷과 연결이 가능한지 확인한다. wget curl 등 다양한 명령어를 통해 가능하다. 다음으로는 퍼블릭 인스턴스에서 프라이빗 인스턴스로 연결이 가능한지 확인해 볼 수 있다. 여기서 중요한 점은 지금 보안 그룹은 http 프로토콜 80번 포트만 연결해놨기 때문에 퍼블릭 인스턴스와 연결될려면 http를 통한 연결만 허용된다. 따라서 sql 규칙으로 데이터베이스로 연결하고 싶다면 3306 sql protocol을 연결하고 직접적인 연결을 모두 허용하고 싶다면 Custom ICMP로 연결하면 직접적으로 ping을 보낼 수 있다. 나는 ICMP를 연결하여 Source 대상을 퍼블릭 보안그룹으로 하여 직접적으로 연결해 ping을 확인하였다.