이 실습에서는 기존 EC2 인스턴스에서 새로운 Amazon Machine Image(AMI)를 생성하고, 해당 머신을 로드 증가 시 규모가 자동으로 확장되는 시스템을 정의하는 기반으로 사용합니다.
소요 시간
이 실습은 완료하는 데 약 45분이 소요됩니다.
시나리오
이 실습에서는 아래 다이어그램에 표시된 확장 가능한 웹 서버 시스템을 생성합니다.
목표 이 실습을 완료하면 다음을 할 수 있게 됩니다.
다음은 실습 환경의 일부로 수강생을 위해 미리 생성해 둔 구성 요소입니다.
다음은 이 실습을 위해 수강생이 생성할 구성 요소입니다.
지침의 맨 위에서 실습 시작(Start Lab)을 클릭하여 실습을 시작합니다.
팁: 실습을 완료하는 데 시간이 더 필요한 경우 실습 시작(Start Lab) 버튼을 다시 선택합니다.
실습 리소스가 왼쪽 상단 모서리에 표시됩니다.
예:
진행하기 전에 실습이 준비될 때까지 기다립니다.
지침의 맨 위에서 AWS를 클릭합니다.
그러면 새 브라우저 탭에서 AWS Management Console이 열립니다. 자동으로 로그인됩니다.
팁: 새 브라우저 탭이 열리지 않는 경우 일반적으로 브라우저에서 팝업 창을 열 수 없음을 나타내는 배너 또는 아이콘이 브라우저 상단에 표시됩니다. 배너 또는 아이콘을 클릭하고 “팝업 허용(Allow pop ups”’를 선택합니다.
이 지침과 함께 표시되도록 AWS Management Console 탭을 정렬합니다. 두 브라우저 탭이 동시에 표시되어 실습 단계를 보다 쉽게 수행할 수 있게 됩니다.
특별한 지시가 없는 한 실습 리전을 변경하지 마십시오.
이 과제에서는 새 EC2 인스턴스를 시작한 다음 실행 중인 해당 인스턴스에 기반하여 새 AMI를 만듭니다. 이 모든 작업은 Command Host에서 AWS CLI 도구를 사용하여 수행합니다.
다음의 지침은 Windows를 사용 중인지 Mac/Linux를 사용 중인지에 따라 약간 달라집니다.
이 지침은 Windows 사용자에게 적용됩니다. macOS 또는 Linux를 사용하는 경우 다음 섹션으로 건너뛰십시오.
현재 읽고 있는 지침 위에 있는 세부 정보(Details) 메뉴를 클릭합니다.
PPK 다운로드(Download PPK) 버튼을 선택하고 labsuser.ppk 파일을 저장합니다. 브라우저에서 이 파일은 일반적으로 다운로드(Downloads) 디렉터리에 저장됩니다.
Command Host 주소를 기록해둡니다.
X를 선택하여 세부 정보(Details) 패널을 닫습니다.
SSH에 대한 PuTTY를 Amazon EC2 인스턴스에 다운로드합니다. 컴퓨터에 PuTTY가 설치되어 있지 않은 경우 여기에서 다운로드하십시오.
putty.exe를 엽니다.
PuTTY 세션을 더 오래 열어두도록 PuTTY 제한 시간을 구성합니다.
30
으로 설정합니다.다음과 같이 PuTTY 세션을 구성합니다.
호스트를 신뢰하고 호스트에 연결하려면 예(Yes)를 선택합니다.
로그인(login as) 메시지가 나타나면 ec2-user
를 입력합니다.
그러면 EC2 인스턴스에 연결됩니다.
Windows 사용자: 여기를 선택하여 다음 과제로 건너뜁니다.
이 지침은 Mac/Linux 사용자에게만 적용됩니다. Windows 사용자인 경우 다음 과제로 건너뜁니다.
현재 읽고 있는 지침 위에 있는 세부 정보(Details) 메뉴를 클릭합니다. 보안 인증(Credentials) 창이 나타납니다.
PEM 다운로드(Download PEM) 버튼을 선택하고 labsuser.pem 파일을 저장합니다.
Command Host \ Bastion Host 주소가 표시되면 기록해둡니다.
X를 선택하여 세부 정보(Details) 패널을 닫습니다.
터미널 창을 열고 디렉터리를 labsuser.pem 파일이 다운로드 된 디렉터리로 변경(cd
)합니다.
예를 들어 labuser.pem 파일을 다운로드(Downloads) 디렉터리에 저장한 경우 다음 명령을 실행합니다.
cd ~/Downloads
다음 명령을 실행하여 키에 대한 권한을 읽기 전용으로 변경합니다.
xxxxxxxxxx
chmod 400 labsuser.pem
아래 명령을 실행합니다(<public-ip>를 앞서 복사한 Command Host \ Bastion Host 주소로 바꿈). 또는 EC2 Console로 돌아가 인스턴스(Instances)를 선택합니다. 연결하려는 인스턴스 옆의 확인란을 선택하고 설명(Description) 탭에서 IPv4 퍼블릭 IP(IPv4 Public IP) 값을 복사합니다.
xxxxxxxxxx
ssh -i labsuser.pem ec2-user@<public-ip>
이 원격 SSH 서버에 대한 첫 번째 연결을 허용할 것인지 묻는 메시지가 나타나면 yes
를 입력합니다.
인증에 키 페어를 사용 중이므로 암호를 묻는 메시지는 나타나지 않습니다.
다음 방법으로 명령 호스트 인스턴스가 실행 중인 리전을 찾습니다.
xxxxxxxxxx
curl http://169.254.169.254/latest/dynamic/instance-identity/document | grep region
다음 단계에 이 정보가 필요합니다.
보안 인증을 사용하여 AWS CLI 소프트웨어를 업데이트합니다.
xxxxxxxxxx
aws configure
메시지가 나타나면 다음 정보를 입력합니다.
us-east-1
또는 eu-west-2
를 입력합니다.json
이제 아래 연습에 설명된 스크립트에 액세스하고 실행할 준비가 되었습니다. 이러한 스크립트에 액세스하려면 먼저 다음 명령을 실행하여 해당 디렉터리로 이동해야 합니다.
xxxxxxxxxx
cd /home/ec2-user/
이제 CommandHost에 로그인했으므로 AWS CLI를 사용하여 웹 서버를 호스팅하는 새로운 인스턴스를 생성합니다.
CommandHost의 일부로 수강생을 위해 미리 설치된 스크립트 UserData.txt를 살펴봅니다.
xxxxxxxxxx
more UserData.txt
이 스크립트는 내장 설치된 소프트웨어 업데이트, 인스턴스의 높은 CPU 로드를 시뮬레이션하는 데 사용할 수 있는 소규모 PHP 웹 애플리케이션 설치 등과 같은 수많은 초기화 작업을 수행하는 스크립트입니다. 스크립트 하단에서 다음 행을 확인할 수 있습니다.
xxxxxxxxxx
find -wholename /root/.*history -wholename /home/*/.*history -exec rm -f {} \;
find / -name 'authorized_keys' -exec rm -f {} \;
rm -rf /var/lib/cloud/data/scripts/*
이 행은 이미지를 캡처할 때 인스턴스에 실수로 남아 있을 수 있는 기록 또는 보안 정보를 지워줍니다.
AWS Management Console 액세스 섹션에서 기록한 KEYNAME, AMIID, SUBNETID, HTTPACCESS 값을 아래 스크립트의 적절한 부분에 붙여넣습니다. 지침 위에 있는 세부 정보(Details) 드롭다운 메뉴를 클릭하고 보기(Show) 버튼을 눌러 이러한 값을 쿼리할 수 있습니다.
xxxxxxxxxx
aws ec2 run-instances --key-name KEYNAME --instance-type t3.micro --image-id AMIID --user-data file:///home/ec2-user/UserData.txt --security-group-ids HTTPACCESS --subnet-id SUBNETID --associate-public-ip-address --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServerBaseImage}]' --output text --query 'Instances[*].InstanceId'
명령의 출력 결과는 InstanceId를 제공합니다. 이 값은 이후 단계에서 new-instance-id라고 하며, 적절히 바꿔야 합니다.
이 인스턴스의 상태를 모니터링하려면 aws ec2 wait instance-running 명령을 사용하십시오. NEW-INSTANCE-ID를 앞서 복사한 값으로 바꿉니다.
xxxxxxxxxx
aws ec2 wait instance-running --instance-ids NEW-INSTANCE-ID
다음 단계로 가기 전에 명령이 프롬프트로 돌아갈 때까지 기다리십시오.
인스턴스가 새로운 웹 서버를 시작했어야 합니다. 웹 서버가 제대로 설치되었는지 테스트하려면 퍼블릭 DNS 이름을 가져옵니다. 이 값의 출력을 복사합니다(느낌표 제외). 이후의 절차에서는 이 값을 public-dns-address라고 부릅니다. NEW-INSTANCE-ID를 앞서 복사한 값으로 바꿉니다.
xxxxxxxxxx
aws ec2 describe-instances --instance-id NEW-INSTANCE-ID --query 'Reservations[0].Instances[0].NetworkInterfaces[0].Association.PublicDnsName'
웹 브라우저를 사용하여 위의 명령이 반환한 주소로 이동합니다.
xxxxxxxxxx
http://PUBLIC-DNS-ADDRESS/index.php
웹 서버가 실행되지 않는다고 생각되면 강사에게 문의하십시오.
이 절차에서는 방금 만든 인스턴스를 기반으로 새 AMI를 만듭니다.
aws ec2 create-image 명령을 사용하여 이 인스턴스를 기반으로 새로운 AMI를 생성합니다. NEW-INSTANCE-ID를 앞서 복사한 값으로 바꿉니다.
xxxxxxxxxx
aws ec2 create-image --name WebServer --instance-id NEW-INSTANCE-ID
기본적으로 create-image는 파일 시스템에서 이미지의 무결성을 보장하기 위해 AMI를 생성하기 전에 현재 인스턴스를 다시 시작합니다. AMI가 생성되는 동안 다음 섹션을 진행합니다.
이 섹션에서는 단일 DNS 주소 아래에 EC2 인스턴스 그룹 풀을 생성하는 로드 밸런서를 생성합니다. Auto Scaling을 사용하여 이전 섹션에서 생성한 이미지를 기반으로 EC2 인스턴스의 동적 확장 가능 풀을 생성합니다. 마지막으로, 그룹 내 머신의 CPU 성능이 지정된 임계값 세트보다 높거나 낮을 때마다 로드 밸런서 그룹의 인스턴스 수를 확장하거나 축소할 경보 세트를 생성합니다.
다음 과제는 AWS CLI나 Management Console을 사용하여 수행할 수 있습니다. 간편히 하기 위해 실습에서는 Management Console을 사용하여 이 과제를 구현합니다.
서비스(Services) 메뉴에서 EC2를 클릭합니다.
먼저 대상 그룹(Target Groups)를 생성합니다. 대상 그룹(Target Groups)은 로드 밸런서로 들어오는 트래픽을 전송할 위치를 정의합니다. Application Load Balancer는 수신 요청 URL을 기반으로 여러 대상 그룹에 트래픽을 보낼 수 있습니다. 예를 들어, 다른 서버로 모바일 앱의 요청을 보낼 수 있습니다. 웹 애플리케이션은 하나의 대상 그룹만 사용합니다.
왼쪽 탐색 창에서 대상 그룹(Target Groups)를 클릭 후 Create target group를 선택하여 다음을 구성합니다.
webserver-app
/index.php
Advanced health check settings (고급 상태 확인 설정)을 확장합니다.
Application Load Balancer는 모든 인스턴스에서 상태 검사 를 자동으로 수행하여 요청에 응답하는지 확인합니다. 기본 설정이 권장되지만 이 실습에서 사용할 때는 약간 더 빠르게 설정하게 됩니다.
다음 값을 구성합니다.
2
10
이는 상태 확인이 10초마다 수행되고 인스턴스가 연속으로 두 번 올바르게 응답하면 상태가 양호한 것으로 간주합니다. Next를 클릭합니다.
Register targets 구성 페이지에서 실제 요청이 전달될 대상을 등록할 수 있습니다. 지금은 대상을 등록하지 않고 Crate target group을 클릭합니다. (추후에 Auto Scaling Group으로 생성된 인스턴스들이 해당 Target group에 등록되도록 구성할 것입니다.)
다음으로 로드 밸런서를 생성합니다. 왼쪽 탐색 창에서 로드 밸런서(Load Balancers)를 클릭합니다
로드 밸런서 생성(Create load balancer)을 클릭합니다.
여러 유형의 로드 밸런서가 표시됩니다. 이 과제에서는 요청 수준(계층 7)에서 작동하는 Application Load Balancer를 사용하여 요청 내용에 따라 트래픽을 대상(EC2 인스턴스, 컨테이너, IP 주소 및 Lambda 함수)으로 라우팅합니다. 자세한 내용은 로드 밸런서 비교를 참조하십시오.
Application Load Balancer 아래에서 생성(Create)을 클릭하고 다음을 구성합니다.
webserverloadbalancer
이렇게 하면 로드 밸런서가 여러 가용 영역에서 작동하도록 구성됩니다.
Security groups 섹션에서 보안 그룹을 구성합니다. 기본으로 선택되어 있는 default 보안 그룹은 x을 클릭하여 제거합니다. Security groups 드롭다운에서 HTTPAccess을 선택합니다. Listeners and routing 섹션에서 로드 밸런서로 전송되는 요청을 보낼 위치를 구성합니다. Default action에 앞에서 생성한 Target Group인 webserver-app을 선택합니다. Summary 섹션에서 설정된 내용들을 검토합니다. 문제가 없다면 Create load balancer을 클릭합니다.
Viw load balancer를 클릭합니다.
로드 밸런서의 상태가 프로비저닝 중(provisioning)으로 표시됩니다. 준비가 될 때까지 기다리지 않아도 됩니다. 다음 과제를 진행하십시오.
시작 구성은 새로운 EC2 인스턴스를 생성하는 데 사용할 AMI를 지정할 때 Auto Scaling 그룹에서 사용하는 구성입니다. 이 예에서는 이전에 생성한 AMI를 시작합니다. 이 AMI는 시작되면 자신을 웹 서버로 자동 구성합니다.
왼쪽 탐색 창에서 시작 구성(Launch Configurations)을 클릭합니다.
시작 구성 생성(Create launch configuration)을 클릭합니다.
시작 구성 생성(Create Launch Configuration) 페이지에서 다음 세부 정보를 입력합니다.
WebServerLaunchConfiguration
WebServer
t3.micro
을 차례로 선택합니다.Auto Scaling 그룹은 로드 밸런서 뒤에 놓을 수 있는 최소 개수의 Amazon EC2 인스턴스를 생성합니다. 이후의 절차에서는 Amazon CloudWatch에 의해 트리거되는 경보에 반응하여 실행 중인 인스턴스의 수를 늘리거나 줄이는 확장 및 축소 정책도 추가해보겠습니다.
시작 구성(Launch configurations) 페이지를 보고 있어야 합니다.
WebServerLaunchConfiguration을 선택하고 작업(Actions), Auto Scaling 그룹 설정(Create Auto Scaling group)을 차례로 클릭합니다.
아래 설정을 구성합니다.
Auto Scaling 그룹(Auto Scaling group) 이름에 WebServersASGroup
을 입력하고 다음(Next)을 클릭합니다.
VPC에서 실습 VPC(Lab VPC)를 선택합니다.
서브넷(Subnets): 프라이빗 서브넷 1(Private Subnet 1) 및 프라이빗 서브넷 2(Private Subnet 2)
다음(Next)을 클릭합니다.
로드 밸런싱(Load balancing) - 선택 사항(optional) 섹션에서 기존 로드 밸런서에 연결 옵션(Attach to an existing load balancer option)을 선택합니다.
대상 그룹 선택(Select target groups)에서 webserver-app을 선택합니다.
모니터링(Monitoring): CloudWatch 내에서 그룹 지표 컬렉션 활성화(Enable group metrics collection within CloudWatch)를 선택합니다.
다음(Next)을 클릭하여 그룹 크기 및 스케일링 정책 구성(Configure group size and scaling policies) 페이지로 이동합니다.
그룹 크기 및 스케일링 정책 구성(Configure group size and scaling policies) 페이지에서 다음을 구성합니다.
2
2
4
Target tracking scaling policy 선택 후 대상 값(Target value)에 40
을 입력합니다.
다음(Next)을 클릭한 후 알림 페이지 추가(Add notifications page)에서 다음(Next)을 다시 클릭합니다.
태그 추가(Add tags) 페이지에서 태그 추가(Add tag)를 클릭한 다음 키(Key) 아래에 Name
을, 값(Value) 아래에는 WebApp
을 입력합니다.
다음(Next)을 클릭합니다.
구성을 검토한 다음 Auto Scaling 그룹 생성(Create Auto Scaling group)을 클릭합니다.
이 과제에서는 CPU 주기를 사용하는 서버 중 하나에 사전 설치된 스크립트에 액세스하여 확장 경보를 트리거함으로써 Auto Scaling 구성과 로드 밸런서가 모두 작동하고 있는지 확인합니다.
왼쪽 탐색 창에서 인스턴스(Instances)를 클릭합니다.
WebApp 레이블이 지정된 2개의 새 인스턴스가 Auto Scaling 그룹의 일부로 생성되는지 확인합니다.
두 개의 새로운 인스턴스에 대한 초기화 과정이 완료될 때까지 기다렸다가 다음 단계를 계속합니다. 인스턴스의 상태 확인(Status Checks) 필드를 관찰하여 두 상태 검사가 모두 성공적으로 완료되었다고 표시되는지 확인합니다.
탐색 창에서 대상 그룹(Target Groups)을 클릭한 다음 대상 그룹(webserver-app)을 선택합니다.
화면 하단의 대상(Targets) 탭에서 2개의 인스턴스가 생성되는지 확인합니다. 이러한 인스턴스의 상태(Status)가 정상(healthy)으로 변경될 때까지 이 목록을 계속 새로 고칩니다.
이제 로드 밸런서를 통해 액세스하여 웹 애플리케이션을 테스트할 수 있습니다.
왼쪽 탐색 창에서 로드 밸런서(Load Balancers)를 클릭한 다음 webserverloadbalancer를 선택합니다.
아래의 설명(Description) 탭에서 DNS 이름(DNS name) 값(예: webserverloadbalancer-xxxxxxxxx.xx-xxxx-x.elb.amazonaws.com)을 복사합니다. 다음 단계에서는 이 값을 load-balancer-url이라고 부릅니다.
새 웹 브라우저 탭을 열고 URL을 주소 표시줄에 붙여 넣은 다음 Enter 키를 누릅니다.
웹 페이지에서 스트레스 시작(Start Stress)을 클릭합니다.
그러면 백그라운드에서 애플리케이션 스트레스(stress)가 호출되어 이 요청을 받은 인스턴스의 CPU 사용률이 100%까지 급등하게 됩니다.
Management Console의 왼쪽 탐색 창에서 Auto Scaling 그룹(Auto Scaling Groups)을 클릭합니다.
WebServerASGroup을 선택합니다.
Auto Scaling 그룹의 활동(Activity) 탭을 선택합니다. 잠시 후에 Auto Scaling 그룹에 새 인스턴스가 추가되는 것을 볼 수 있습니다.
이는 Auto Scaling 그룹의 평균 CPU 사용률이 45%를 초과함을 CloudWatch에서 탐지하여 이에 따라 규모 확장 정책이 트리거되었기 때문입니다.
이 페이지의 상단에서 실습 종료(End Lab)를 선택한 다음 예(Yes)를 선택하여 실습 종료를 확인합니다.
삭제가 시작되었습니다.(DELETE has been initiated...) 이제 이 메시지 상자를 닫아도 됩니다.(You may close this message box now.)라는 내용의 패널이 표시됩니다.
AWS 실습이 종료되었습니다.(Ended AWS Lab Successfully)라는 메시지가 잠시 표시되어 실습이 종료되었음을 나타냅니다.
AWS Training and Certification에 대한 자세한 내용은 https://aws.amazon.com/training/을 참조하십시오.
여러분의 피드백을 환영합니다. 제안이나 수정 사항을 공유하려면 AWS Training and Certification 연락처 양식에서 세부 정보를 제공해 주십시오.
© 2022 Amazon Web Services, Inc. and its affiliates. All rights reserved. 본 내용은 Amazon Web Services, Inc.의 사전 서면 허가 없이 전체 또는 일부를 복제하거나 재배포할 수 없습니다. 상업적인 복제, 대여 또는 판매는 금지됩니다.