AWS 콘솔로 Application Load Balancer를 이용한 퍼블릭 서브넷에 있는 EC2에 부하 분산하는 방법을 알아보겠습니다.
*서울 리전(ap-northeast-2)를 기준으로 진행합니다.
1. VPC 생성
먼저 VPC를 생성하겠습니다.
VPC(virtual private cloud)의 약자로 AWS에서 정의한 가상 네트워크인데 이 안에서 다양한 컴퓨팅 자원의 통신을 가능하게 합니다.
왼쪽 메뉴바 -> VPC -> "VPC 생성" 클릭
VPC 생성에서 "VPC 등"을 선택한 뒤 이름은 "VPC-Lab" IPv4는 10번 대역폭인 10.0.0.0/16을 선택합니다.
(만일 10번 대역폭을 사용 중이라면, IP를 다르게 설정하거나 172, 192번 대역폭으로 수정해서 사용하시면 됩니다.
172번을 사용할 경우 -> 172.16.0.0/16
192번을 사용할 경우 -> 192.168.0.0/16
퍼블릭 서브넷의 수는 1, 프라이빗 서브넷은 0으로 지정한 뒤 서브넷 블록 사용자 지정에서 "10.0.10.0/24"로 CIDR 블록을 지정합니다.
퍼블릭 서브넷 하나에 /24로 지정하여 256개의 IP를 할당할 수 있습니다.
마찬가지로 172, 192번을 사용하신다면, 다음과 같이 설정해 주시면됩니다.
172.16.10.0/24
192.168.10.0/24
NAT 게이트웨이는 설정하지 않음으로 "없음"으로 하고, DNS 옵션에 "DNS 호스트 이름 활성화", "DNS 확인 활성화"는 체크합니다.
VPC 생성을 클릭하면 VPC가 생성됩니다.
VPC-Lab-vpc라고 이름이 되어 있을텐데 VPC-Lab으로 이름을 변경해줍니다(선택사항)
2. 추가 서브넷 생성 후 VPC와 연결
이제 서브넷으로 가시면 방금 생성한 서브넷이 있을텐데 (가용 영역: ap-northeast-2a) 이름을 public subnet A로 변경해줍니다.
이제 새로운 서브넷을 만들겠습니다.
서브넷 생성을 누르고 VPC는 방금 생성한 VPC-Lab을 선택합니다.
서브넷 이름은 public subnet C이고 가용 영역은 ap-northeast-2c를 선택합니다. IPv4 서브넷 CIDR 블록은 10.0.20.0/24로 해주어 public subnet A와 다르게 설정합니다.
이렇게 새로운 서브넷도 생성되었습니다.
3. 라우팅 테이블 편집
이제 라우팅 테이블 편집을 해주어야 합니다. VPC를 생성할 때 같이 만든 public subnet A는 라우팅 테이블 설정까지 되어 있습니다. 하지만 따로 생성한 public subnet C는 그렇지 않습니다. 라우팅 테이블 연결을 해주어야 서브넷에 인터넷이 연결될 수 있으니 "라우팅 테이블 연결 편집"을 통해 라우팅 테이블과 public subnet C를 연결해 주도록 합시다.
public subnet C를 선택하고 라우팅 테이블 연결 편집을 클릭
라우팅 테이블 ID를 기존에 생성한 VPC-Lab으로 변경해 주면 아래 라우팅에 대상이 1개였지만 0.0.0.0/0이 추가된 것을 확인할 수 있는데 인터넷과 연결을 해주는 "인터넷 게이트웨이"입니다. 처음 설정되어 있던 기본 라우팅 테이블은 VPC간의 통신만을 지원하기 때문에 대상이 10.0.0.0/16뿐이지만, VPC-Lab을 생성할 때 같이 생성된 public subnet A는 만들 때 서브넷의 종류를 퍼블릭으로 설정했기 때문에 인터넷 연결을 위한 인터넷 게이트웨이도 라우팅 테이블과 함께 생성됩니다.
이렇게 public subnet A, C 모두 인터넷 게이트웨이가 있는 라우팅 테이블에 연결되었습니다.
4. 보안 그룹(security group) 생성, 인바운드 규칙 추가
이제 특정 인터넷 IP만을 허용할지 아닌지 결정하는 보안 그룹(security group)을 생성하겠습니다.
보안 그룹은 초기값은 아무것도 없으며, 아무것도 없다면 모든 접속을 차단(deny)한다는 의미입니다. 허용(Allow)하는 IP만을 프로토콜과 함께 선택해 추가해주어야 접속할 수 있는 방법으로 되어있습니다.
여전히 VPC 메뉴판입니다. 보안 그룹으로 들어가 보안 그룹 생성을 눌러줍시다.
보안 그룹 이름은 webserver-sg, 설명은 security group for web servers, VPC는 VPC-Lab을 선택해줍니다.
이제 중요한데 특정 IP 접속을 위해 인바운드 규칙을 수정해 주어야 합니다.
처음은 이렇게 되어 있습니다. 규칙 추가를 눌러줍니다.
HTTP로 지정합니다. 80번 포트이며, OSI에서 7계층이며 로드 밸런서도 ALB를 사용할 예정이기에 HTTP로 지정합니다.
소스 유형에서 내 IP만 접속 가능하도록 할 수도 있지만 간혹 안되는 경우도 존재하니 Anywhere-IPv4로 지정해 모두 접속 가능하도록 지정합니다.
5. EC2 생성
이제 VPC를 비롯한 네트워크 설정은 끝났습니다.
이제 가상 네트워크인 VPC 위에 컴퓨팅 자원인 EC2를 생성해서 어플리케이션을 띄워보겠습니다.
AWS 서비스 -> EC2 -> 메뉴바 -> 인스턴스 -> 인스턴스 시작
이름은 webserver 1
사진처럼 아마존 리눅스 2 AMI를 선택합니다(프리 티어 사용 가능) 아키텍처는 x86으로 인텔 또는 AMD의 CPU를 사용하는 아키텍처로 선택합니다.
Amazon Linux 2023 AMI를 선택한 경우)
좀 더 최신 버전인 Amazon Linux 2023 AMI를 선택할 수도 있습니다. 그런 경우 뒤에 나오는 사용자 데이터에 넣을 코드를 수정해주어야 합니다.
인스턴스 유형은 t2.micro를 선택하고(프리 티어 사용 가능), 키 페어는 keypair-seoul이라는 이름으로 생성합니다.
네트워크 설정에서 편집을 눌러 기존에 생성한 VPC, 보안그룹을 지정합니다.
"편집"을 누른 뒤 VPC-Lab을 선택하고, 인스턴스를 생성할 서브넷을 선택하는데 public subnet A를 지정합니다. 그리고 꼭 퍼블릭 IP 자동 할당을 "활성화"로 변경합니다. 기존 보안 그룹 선택에서 webserver-sg를 선택합니다.
고급 세부 정보 마크 다운을 클릭해 내려줍니다. 맨 아래에 "사용자 데이터 - 선택 사항" 항목이 있습니다.
#!/bin/sh
# Install a LAMP stack
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo yum -y install httpd php-mbstring
sudo yum -y install git
# Start the web server
sudo chkconfig httpd on
sudo systemctl start httpd
# Install the web pages for our lab
if [ ! -f /var/www/html/aws-boarding-pass-webapp.tar.gz ]; then
cd /var/www/html
wget -O 'techcamp-webapp-2024.zip' 'https://ws-assets-prod-iad-r-icn-ced060f0d38bc0b0.s3.ap-northeast-2.amazonaws.com/600420b7-5c4c-498f-9b80-bc7798963ba3/techcamp-webapp-2024.zip'
unzip techcamp-webapp-2024.zip
sudo mv techcamp-webapp-2024/* .
sudo rm -rf techcamp-webapp-2024
sudo rm -rf techcamp-webapp-2024.zip
fi
# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
cd /var/www/html
sudo mkdir vendor
cd vendor
sudo wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
sudo unzip aws.zip
fi
# Update existing packages
sudo yum -y update
위 코드를 파일 선택에 넣어줍니다.
생성을 누르면 생성이 시작되고 인스턴스 상태는 대기 중이 되는데 실행 중이 될 때 까지 기다립니다.
사용자 데이터 수정)
#!/bin/bash
# Update existing packages
sudo dnf -y update
# Install Apache, PHP, and other necessary packages
sudo dnf install -y httpd php php-mbstring mariadb105-server git unzip wget
# Start and enable the web server
sudo systemctl enable httpd
sudo systemctl start httpd
# Install the web pages for our lab
if [ ! -f /var/www/html/techcamp-webapp-2024.zip ]; then
cd /var/www/html
sudo wget -O 'techcamp-webapp-2024.zip' 'https://ws-assets-prod-iad-r-icn-ced060f0d38bc0b0.s3.ap-northeast-2.amazonaws.com/600420b7-5c4c-498f-9b80-bc7798963ba3/techcamp-webapp-2024.zip'
sudo unzip techcamp-webapp-2024.zip
sudo mv techcamp-webapp-2024/* .
sudo rm -rf techcamp-webapp-2024
sudo rm -rf techcamp-webapp-2024.zip
fi
# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
cd /var/www/html
sudo mkdir -p vendor
cd vendor
sudo wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
sudo unzip aws.zip
fi
# Set correct permissions
sudo chown -R apache:apache /var/www/html
sudo chmod -R 755 /var/www/html
# Restart Apache to apply changes
sudo systemctl restart httpd
운영체제로 Amazon Linux 2023 AMI를 선택한 경우 위의 코드를 사용자 데이터에 넣어야 합니다.
세부 정보에 퍼블릭 IPv4 주소가 있는데 복사해서 브라우저 주소창에 붙여넣기 해줍니다.
이렇게 되면 성공입니다.
6. AMI 생성, AMI 기반 인스턴스 생성
AMI(Amazon Machine Image)는 방금 만든 EC2 인스턴스의 정보를 저장해 같은 인스턴스를 손쉽게 만들기 위한 방법입니다. 동일한 구성의 인스턴스가 여러개 필요할 때 효과적입니다.
이미지 생성 클릭
이름은 webserver-ami로 하고 생성 클릭
왼쪽 메뉴바 -> AMI -> AMI로 인스턴스 시작
이름은 webserver 2
keypair-seoul로 키 페어 설정
네트워크 설정도 비슷한데 서브넷만 public subnet C로 지정해줍니다.
서브넷 C에 생성된 인스턴스이기에 ap-northeast-2c인 것을 확인할 수 있습니다.
7. Application Load Balancer 생성
Application Load Balancer를 사용하여 생성한 2개의 인스턴스에 부하를 나눠주는 것을 확인해 보겠습니다.
EC2 -> 왼쪽 메뉴바 -> 로드 밸런서 생성
왼쪽의 ALB 선택
이름은 web-alb
VPC는 VPC-Lab을 선택하고 가용 영역은 2a, 2c 모두 선택해 줍니다.
로드 밸런서가 부하를 분산할 서브넷을 public subnet A, C로 지정한다는 뜻입니다.
로드 밸런서를 위한 보안 그룹을 새로 생성합니다. 이전에 EC2가 가지는 보안 그룹과 로드 밸런서를 위한 보안 그룹은 서로 다릅니다.
이름은 webalb-sg, 설명은 security group for load balancer, VPC는 VPC-Lab을 선택합니다.
인바운드 규칙을 추가할 건데 똑같이 해주시면 됩니다.
방금 만든 webalb-sg로 로드밸런서의 보안 그룹을 설정합니다.
대상 그룹을 생성해야 합니다. 대상 그룹(Target Group)이란 로드밸런서로 부하를 분산시킬 인스턴스를 묶는 단위입니다. 대상 그룹에 원하는 EC2를 지정합니다.
대상 유형은 인스턴스로 합니다.
대상 그룹 이름은 webserver-tg으로 합니다. tg는 타겟 그룹입니다.
그리고 VPC는 VPC-Lab으로 합니다.
다음으로 넘겨줍니다.
생성한 webserver 1, 2를 선택하고 "아래에 보류 중인 것으로 포함"을 클릭합니다.
포트는 HTTP니까 80을 유지합니다.
대상 그룹이 생성되었습니다.
오른쪽 새로고침 버튼을 한 번 눌러주고 webserver-tg를 선택합니다.
이제 아래로 내려서 로드 밸런서 생성을 누르면 됩니다.
주의)
끝이 아닙니다. 중요한 부분이 남았습니다.
이제 보안 그룹이 기본 보안 그룹을 포함하여 3개가 되는데 로드 밸런서를 포함하는 보안 그룹(webalb-sg)와 인스턴스를 포함하는 보안 그룹(webserver-sg)가 있습니다.
인터넷에서 인터넷 게이트웨이를 거쳐 로드 밸런서로 들어오는 트래픽을 인스턴스로 전달하려면 인스턴스를 포함하는 보안 그룹(webserver-sg)가 로드밸런서의 부하를 받을 수 있도록 인바운드 규칙을 편집해주어야 합니다.
지금 실습 기준으로 인스턴스를 포함하는 webserver-sg는 0.0.0.0/0만을 허용하고 있는데 그것을 가로채서 webalb-sg로 변경하는 겁니다.
"인터넷 -> 인터넷 게이트웨이 -> alb 보안 그룹 -> alb"
"인터넷 -> 인터넷 게이트웨이 -> 인스턴스 보안 그룹 -> 인스턴스"
이 둘을 합쳐서
"인터넷 -> 인터넷 게이트웨이 -> alb 보안 그룹 -> alb -> 인스턴스 보안 그룹 -> 인스턴스" 순서로 만듭니다.
보안 그룹으로 돌아가 webserver-sg를 클릭합니다.
webserver-sg의 인바운드 규칙 편집을 눌러줍니다.
기존에 있던 인바운드 규칙을 삭제합니다.
이제 규칙 추가를 눌러줍니다.
사진을 잘 확인해 주세요. webserver-sg가 소스에 webalb-sg를 추가하는겁니다.
위 사진은 webserver-tg인 대상 그룹을 확인하는 사진입니다. 새로고침을 해서 상태확인 부분에 Healthy가 있는지 확인해주세요.
UnHealthy라면 접속이 되지 않습니다.
이제 web-alb 로드밸런서로 돌아와서 DNS를 복사한 뒤 브라우저에 입력해 줍니다.
영상에서 Availability Zone이 새로고침할 때마다 ap-northeast-2a와 ap-northeast-2c를 왔다갔다 하는 것을 확인할 수 있습니다. 그러면 성공입니다.
부하가 들어올 때마다 2개의 인스턴스에 랜덤으로 나눠주는 모습입니다.
8. 리소스 삭제
이제 순서대로 콘솔에 들어가 리소스를 삭제해주시면 됩니다.
로드 밸런서 삭제 -> 타겟 그룹 삭제 -> EC2 종료 -> 서브넷 삭제 -> VPC 삭제 -> AMI 제거
(VPC 제거하시면 인터넷 게이트웨이도 같이 제거됩니다)
스냅샷은 삭제되지 않을 수도 있으니, 따로 들어가서 삭제를 확인해줍니다
키페어의 경우 다음에도 사용하신다면 남겨두셔도 무방합니다.
'[Cloud] > [AWS]' 카테고리의 다른 글
[AWS] SNS와 Cloudwatch를 이용한 모니터링과 오토스케일링 (0) | 2024.09.07 |
---|---|
[AWS] 서버리스 3-tier 어플리케이션 (1) | 2024.09.04 |
[AWS] EKS에서 트래픽 유발해서 HPA 스케일링 확인하기(with ECR) (1) | 2024.08.30 |
[AWS] AWS CLI로 EKS 클러스터 만들기 (0) | 2024.08.29 |
[AWS] Cloudformation으로 쿠버네티스 클러스터 생성(EKS) (0) | 2024.08.27 |