1. CloudFormation을 통한 기본 인프라 배포
이번 실습의 기본 인프라 구성을 CloudFormation을 통해 스택을 생성하고 자원을 배포할 것입니다.
CloudFormation 템플릿 다운로드
•
아래 CloudFormation 템플릿 파일을 다운로드합니다.
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
InstanceType:
Description: Enter t2.nano, t2.micro Default is t2.micro.
Type: String
Default: t2.micro
AllowedValues:
- t2.nano
- t2.micro
LatestAmiId:
Description: (DO NOT CHANGE)
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64'
AllowedValues:
- /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.5.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: LAB5-VPC
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: LAB5-IGW
MyIGWAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref MyIGW
VpcId: !Ref MyVPC
MyPublicRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: LAB5-PUBLIC-RT
MyDefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: MyIGWAttachment
Properties:
RouteTableId: !Ref MyPublicRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
MyPublicSN1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs '' ]
CidrBlock: 10.5.1.0/24
Tags:
- Key: Name
Value: LAB5-PUBLIC-SN-1
MyPublicSN2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 2, !GetAZs '' ]
CidrBlock: 10.5.2.0/24
Tags:
- Key: Name
Value: LAB5-PUBLIC-SN-2
MyPublicSNRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN1
MyPublicSNRouteTableAssociation2:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN2
WEBSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: WEB-SG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: 0.0.0.0/0
- IpProtocol: icmp
FromPort: -1
ToPort: -1
CidrIp: 0.0.0.0/0
MYEC21:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: LAB5-WEB-1
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref MyPublicSN1
GroupSet:
- !Ref WEBSG
AssociatePublicIpAddress: true
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
hostnamectl --static set-hostname LAB5-WEB-1
dnf install httpd -y
systemctl start httpd && systemctl enable httpd
echo "<h1>[인프런] CloudNet@ LAB5-WEB-1 Server</h1>" > /var/www/html/index.html
MYEC22:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: LAB5-WEB-2
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref MyPublicSN2
GroupSet:
- !Ref WEBSG
AssociatePublicIpAddress: true
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
hostnamectl --static set-hostname LAB5-WEB-2
dnf install httpd -y
systemctl start httpd && systemctl enable httpd
echo "<h1>[인프런] CloudNet@ LAB5-WEB-2 Server</h1>" > /var/www/html/index.html
MyEIP1:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
MyEIP1Assoc:
Type: AWS::EC2::EIPAssociation
Properties:
InstanceId: !Ref MYEC21
AllocationId: !GetAtt MyEIP1.AllocationId
MyEIP2:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
MyEIP2Assoc:
Type: AWS::EC2::EIPAssociation
Properties:
InstanceId: !Ref MYEC22
AllocationId: !GetAtt MyEIP2.AllocationId
ALBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: LAB5-ALB-TG
Port: 80
Protocol: HTTP
VpcId: !Ref MyVPC
Targets:
- Id: !Ref MYEC21
Port: 80
- Id: !Ref MYEC22
Port: 80
ApplicationLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: LAB5-ALB
Scheme: internet-facing
SecurityGroups:
- !Ref WEBSG
Subnets:
- !Ref MyPublicSN1
- !Ref MyPublicSN2
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref ALBTargetGroup
LoadBalancerArn: !Ref ApplicationLoadBalancer
Port: 80
Protocol: HTTP
Outputs:
Web1:
Value: !GetAtt MYEC21.PublicIp
Web2:
Value: !GetAtt MYEC22.PublicIp
YAML
복사
# CH5_LAB2.yaml 파일 내용
CloudFormation 스택 생성 설정
•
CloudFormation 서비스 → 스택 (메뉴 진입) → 스택 생성 (버튼 클릭)
1단계 - 스택 생성
•
템플릿 준비: 기존 템플릿 선택 (선택)
•
템플릿 소스: 템플릿 파일 업로드 (선택)
◦
파일 선택 → 템플릿 파일 선택 (CH5_LAB2.yaml) → 열기
•
다음 (버튼 클릭)
2단계 - 스택 세부 정보 지정
•
스택 이름: LAB5-CF-2 (입력)
•
InstanceType: t2.micro or t2.nano
•
KeyName: 각자 생성한 키 페어 (선택)
•
다음 (버튼 클릭)
3단계 - 스택 옵션 구성
•
다음 (버튼 클릭)
4단계 - 검토 및 작성
•
전송 (버튼 클릭)
생성 자원 확인
VPC
•
VPC 서비스 → VPC (메뉴 진입) → 대상 VPC (선택)
◦
리소스 맵 (탭 진입)
EC2 인스턴스
•
EC2 서비스 → 인스턴스 (메뉴 진입) → 대상 인스턴스 (선택)
보안 그룹
•
EC2 서비스 → 보안 그룹 (메뉴 진입) → 대상 보안 그룹 (선택)
◦
인바운드 규칙 (탭 진입)
탄력적 IP
•
EC2 서비스 → 탄력적 IP (메뉴 진입)
대상 그룹
•
EC2 서비스 → 대상 그룹 (메뉴 진입) → 대상 그룹 (선택)
◦
대상 (탭 진입)
로드 밸런서
•
EC2 서비스 → 로드 밸런서 (메뉴 진입) → LAB5-ALB (선택)
◦
세부 정보 (탭 진입) → DNS 이름 (복사)
◦
리스너 및 규칙 (탭 진입)
◦
리소스 맵 (탭 진입)
이전 실습의 CloudFormation 스택(LAB5-CF-1)에서 생성한 MY-EC2 인스턴스에 접근해서 작업합니다.
대상 인스턴스는 인스턴스 중지 → 인스턴스 시작으로 전환합니다.
기본 통신 확인
ALB_DNS=[ALB_DNS_ADDRESS]
Bash
복사
# ALB 도메인 주소 변수 지정
dig +short $ALB_DNS
Bash
복사
# ALB 도메인 주소 해석
dig +trace $ALB_DNS
Shell
복사
# ALB 도메인 주소 해석 과정 확인
curl $ALB_DNS
Bash
복사
# HTTP 1회 접근
for i in {1..20}; do curl $ALB_DNS --silent ; done | sort | uniq -c | sort -nr
Shell
복사
# HTTP 20회 접근 (반복문)
2. Amazon Route 53 라우팅 정책 확인
Amazon Route 53의 라우팅 정책 중 “단순 라우팅 정책”, “가중치 기반 라우팅 정책”, “장애 조치 라우팅 정책”에 대해 실습을 진행합니다.
LAB5-CF-2 스택에서 출력 탭으로 진입해서, 웹 서버-1과 웹 서버-2의 퍼블릭 IP 주소를 기록해 둡니다.
2.1. 단순 라우팅 정책 확인
단순 라우팅 레코드 생성 - 1
•
Route 53 서비스 → 호스팅 영역 (메뉴 진입) → 대상 호스팅 영역 (클릭)
◦
레코드 생성 (버튼 클릭)
▪
레코드 이름: test
▪
레코드 유형: A
▪
값: (아래)
[웹 서버-1 퍼블릭 IP]
[웹 서버-2 퍼블릭 IP]
Plain Text
복사
▪
TTL: 60
▪
라우팅 정책: 단순 라우팅
◦
레코드 생성 (버튼 클릭)
단순 라우팅 정책 검증 - 1
MyDomain=[각자의 도메인]
Shell
복사
# 각자의 도메인 주소를 변수에 선언
curl test.$MyDomain
Shell
복사
# test.$MyDomain의 HTTP 1회 접근
dig +short test.$MyDomain
dig +trace test.$MyDomain
Shell
복사
# test.$MyDomain의 dig 명령어 활용
while true; do curl test.$MyDomain \
&& date && echo; sleep 30; done
Shell
복사
# test.$MyDomain의 HTTP로 30초 간격으로 무한 접근
단순 라우팅 레코드 생성 - 2
•
Route 53 서비스 → 호스팅 영역 (메뉴 진입) → 대상 호스팅 영역 (클릭)
◦
레코드 생성 (버튼 클릭)
▪
레코드 이름: alb
▪
레코드 유형: A
▪
별칭: 활성
•
엔드포인트 선택: Application/Classic Load Balancer에 대한 별칭
•
리전: 아시아 태평양(서울)
•
로드 밸런서 선택: LAB5-ALB
▪
라우팅 정책: 단순 라우팅
◦
레코드 생성 (버튼 클릭)
단순 라우팅 정책 검증 - 2
curl alb.$MyDomain
Shell
복사
# alb.$MyDomain의 HTTP 1회 접근
for i in {1..20}; do curl alb.$MyDomain --silent ; done | sort | uniq -c | sort -nr
Shell
복사
# alb.$MyDomain의 HTTP 20회 접근
2.2. 가중치 기반 라우팅 정책 확인
가중치 기반 라우팅 레코드 생성
•
Route 53 서비스 → 호스팅 영역 (메뉴 진입) → 대상 호스팅 영역 (클릭)
◦
레코드 생성 (버튼 클릭)
▪
레코드 이름: weight
▪
레코드 유형: A
▪
값: (아래)
[웹 서버-1 퍼블릭 IP]
Plain Text
복사
▪
TTL: 60
▪
라우팅 정책: 가중치 기반
•
가중치: 8
•
레코드 ID: WEB1
◦
다른 레코드 추가 (버튼 클릭)
▪
레코드 이름: weight
▪
레코드 유형: A
▪
값: (아래)
[웹 서버-2 퍼블릭 IP]
Plain Text
복사
▪
TTL: 60
▪
라우팅 정책: 가중치 기반
•
가중치: 2
•
레코드 ID: WEB2
◦
레코드 생성 (버튼 클릭)
가중치 기반 라우팅 정책 검증
curl weight.$MyDomain
Shell
복사
# weight.$MyDomain의 HTTP 1회 접근
for i in {1..10}; do curl weight.$MyDomain --silent ; sleep 60 ; done | sort | uniq -c | sort -nr
Shell
복사
# weight.$MyDomain의 HTTP 10회 접근 (60초 간격)
60초 간격으로 HTTP 10회 접근을 모두 마친 후에 결과가 출력됩니다.
명령어를 입력 후 10분 정도 대기해 주세요.
2.3. 장애 조치 라우팅 정책 확인
상태 검사 생성
Primary-Check
•
Route 53 서비스 → 상태 검사(확인) (메뉴 진입) → 상태 확인 생성 (버튼 클릭)
◦
이름: Primary-Check
◦
리소스: 엔드포인트 (선택)
◦
엔드포인트 지정 기준: IP 주소 (선택)
◦
IP 주소: HTTP, [웹 서버-1 퍼블릭 IP]:80
◦
고급 구성 (확장)
▪
요청 간격: 빠름(10초) (선택)
▪
실패 임계값: 2
◦
상태 확인 생성 (버튼 클릭)
Secondary-Check
•
Route 53 서비스 → 상태 검사(확인) (메뉴 진입) → 상태 확인 생성 (버튼 클릭)
◦
이름: Secondary-Check
◦
리소스: 엔드포인트 (선택)
◦
엔드포인트 지정 기준: IP 주소 (선택)
◦
IP 주소: HTTP, [웹 서버-2 퍼블릭 IP]:80
◦
고급 구성 (확장)
▪
요청 간격: 빠름(10초) (선택)
▪
실패 임계값: 2
◦
상태 확인 생성 (버튼 클릭)
장애 조치 라우팅 레코드 생성
•
Route 53 서비스 → 호스팅 영역 (메뉴 진입) → 대상 호스팅 영역 (클릭)
◦
레코드 생성 (버튼 클릭)
▪
레코드 이름: failover
▪
레코드 유형: A
▪
값: (아래)
[웹 서버-1 퍼블릭 IP]
Plain Text
복사
▪
TTL: 60
▪
라우팅 정책: 장애 조치
•
장애 조치 레코드 유형: 기본
•
상태 확인 ID: Primary-Check (선택)
•
레코드 ID: Primary-WEB
◦
다른 레코드 추가 (버튼 클릭)
▪
레코드 이름: failover
▪
레코드 유형: A
▪
값: (아래)
[웹 서버-2 퍼블릭 IP]
Plain Text
복사
▪
TTL: 60
▪
라우팅 정책: 장애 조치
•
장애 조치 레코드 유형: 보조
•
상태 확인 ID: Secondary-Check (선택)
•
레코드 ID: Secondary-WEB
◦
레코드 생성 (버튼 클릭)
장애 조치 라우팅 정책 검증
curl failover.$MyDomain
Shell
복사
# failover.$MyDomain의 HTTP 1회 접근
while true; do curl failover.$MyDomain --connect-timeout 5 \
&& date && echo; sleep 5; done
Shell
복사
# failover.$MyDomain의 HTTP로 5초 간격으로 무한 접근
3. 생성 자원 삭제
Route 53 상태 검사 삭제
•
Route 53 서비스 → 상태 검사 (메뉴 진입) → 대상 상태 검사 (선택)
◦
작업 → 삭제 (클릭)
Route 53 호스팅 영역 - 레코드 삭제
•
Route 53 서비스 → 호스팅 영역 (메뉴 진입) → 대상 호스팅 영역 (클릭)
◦
실습에 사용한 A 레코드 (모두 선택) → 레코드 삭제 (버튼 클릭)
▪
삭제 (버튼 클릭)
Route 53 호스팅 영역 삭제
•
Route 53 서비스 → 호스팅 영역 (메뉴 진입) → 대상 호스팅 영역 (선택) → 삭제 (버튼 클릭)
◦
삭제 (입력) → 삭제 (버튼 클릭)
CloudFormation 스택 삭제
•
CloudFormation 서비스 → 스택 (메뉴 진입)
◦
대상 스택 선택 → 삭제 (버튼 클릭)
▪
약 5분 내외 시간 소요
여기까지 5장 실습 - Amazon Route 53 구성 및 라우팅 정책 확인 실습을 마칩니다.
수고하셨습니다 :)