(#이전회차)
1. AWS 리소스로 서버리스 웹 애플리케이션 구현



장점 : 문제를 겪는 사용자가 적다
단점 : 많은 양의 하드웨어 필요







#!/bin/sh
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum -y install httpd php-mbstring
# Start the web server
chkconfig httpd on
systemctl start httpd
# Install the web pages for our lab
if [ ! -f /var/www/html/immersion-day-app-php7.tar.gz ]; then
cd /var/www/html
wget https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz
tar xvfz immersion-day-app-php7.tar.gz
fi
#
cat <<EOF > /var/www/html/get-index-meta-data.php
<?php
\$hostname = gethostname();
\$results = explode(".", \$hostname);
echo "<table style='width:100%'>";
echo "<tr><th style='width:30%'>Meta-Data</th><th style='width:70%'>Value</th></tr>";
echo "<tr><td>Private IP DNS Name</td><td>".\$hostname."</td></tr>";
echo "<tr><td>Private IP</td><td>".getHostByName(\$hostname)."</td></tr>";
echo "<tr><td>Region</td><td>".\$results[1]."</td></tr>";
echo "</table>";
?>
EOF
# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
cd /var/www/html
mkdir vendor
cd vendor
wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
unzip aws.zip
fi
# Update existing packages
yum -y update
[ec2-user@ip-172-31-12-248 ~]$ ls /var/www/html
[ec2-user@ip-172-31-12-248 ~]$ sudo rm -rf /var/www/html/*
[ec2-user@ip-172-31-12-248 ~]$ ls /var/www/html

https://bucket-name.s3.region-identifier.amazonaws.com/latest/install

https://aws-codedeploy-ap-southeast-1.s3.ap-southeast-1.amazonaws.com/latest/install
[ec2-user@ip-172-31-12-248 ~]$ sudo yum update
[ec2-user@ip-172-31-12-248 ~]$ sudo yum install ruby
[ec2-user@ip-172-31-12-248 ~]$ sudo yum install wget
[ec2-user@ip-172-31-12-248 ~]$ cd /home/ec2-user
[ec2-user@ip-172-31-12-248 ~]$ wget https://aws-codedeploy-ap-southeast-1.s3.ap-southeast-1.amazonaws.com/latest/install
[ec2-user@ip-172-31-12-248 ~]$ ls
install
[ec2-user@ip-172-31-12-248 ~]$ chmod +x ./install
[ec2-user@ip-172-31-12-248 ~]$ ls -l
total 20
-rwxr-xr-x. 1 ec2-user ec2-user 17892 Apr 4 2023 install
[ec2-user@ip-172-31-12-248 ~]$ sudo ./install auto
[ec2-user@ip-172-31-12-248 ~]$ sudo service codedeploy-agent status
[ec2-user@ip-172-31-12-248 ~]$ systemctl status codedeploy-agent



EC2 좌측 메뉴에서 시작 템플릿 - 시작 템플릿 생성을 누른다
시작 템플릿 이름 : MyWebServerTemplate-015

시작 템플릿 콘텐츠는 이전 단계에서 만든 EC2 AMI 를 사용한다.

인스턴스 유형 : t2.micro, 키 페어 : MyKeyPair-015
네트워크 설정 :




싱가포르 리전
t2.micro 인스턴스 유형이 지원하는 가용영역은 아래와 같다.
ap-southeast-1b, ap-southeast-1a, ap-southeast-1c



원하는 최소 용량/ 원하는 최대 용량 : 2/2개
AutoScaling : 크기 조정 정책 없음 (Auto Scaling 그룹에서는 2개의 인스턴스만 사용하겠다.)
이후 디폴트 설정을 사용해 Auto Scaling 그룹을 생성한다.

생성한 Auto Scaling 그룹의 인스턴스 관리로 이동해 인스턴스를 확인하자.

위 그림에서는 2개의 인스턴스가 InService 상태이다.
"InService" 상태의 인스턴스는 사용 가능한 상태이며, 요청된 서비스에 대한 트래픽을 수용할 수 있습니다.
[ec2-user@ip-172-31-9-83 ~]$ echo "<h1>18.143.91.236</h1>" > /var/www/html/index.html
[ec2-user@ip-172-31-9-83 ~]$ echo "<h1>13.250.60.196</h1>" > /var/www/html/index.html


처음 로드밸런스 생성시 , 로드밸런스 DNS 주소를 너무 오래 불러는 오류가 발생했다. 로드밸런스 생성 시, 디폴트 보안 규칙이 아닌 ( HTTP 80/ SSH 22 를 사용하는 SG를 사용해야 한다)
인프라가 완성되었다.
이제 여기서 ?? 를 하면 ?? 한다.
이제 코드 배포 자동 수행되도록 만들어 보자.
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<script>
var text = "I told you so!";
</script>
</head>
<body>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<msup><mi>a</mi><mn>2</mn></msup>
<mo>+</mo>
<msup><mi>b</mi><mn>2</mn></msup>
<mo>=</mo>
<msup><mi>c</mi><mn>2</mn></msup>
</mrow>
</math>
<!-- embed svg elements directly in HTML5 -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
<polygon points="100,10 40,180 190,60 10,60 160,180"
style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;">
</svg>
<script>
document.write("<p>"+text+"</p>");
document.write("<p>"+text+"</p>");
document.write("<p>"+text+"</p>");
</script>
</body>
</html>
같은 위치에 appspec.yml 파일을 생성해준다.
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html
hooks:
AfterInstall:
- location: scripts/set_owner
timeout: 5
runas: root

/Scripts/set_owner 를 파일 제목에 입력하고 아래와 같은 코드를 입력해 set_owner을 생성한다
echo 'Running set_owner'
chown -R ec2-user /var/www/html


배포 그룹 생성해보자. 배포 그룹은 배포 대상, 배포 방법을 정의한다.
배포 대상 : 개발계, 테스트계, 운영계, 등
배포 방법 : 한번에 배포, 반반씩 배포, 단계적으로 등
생성한 애플리케이션에 들어가 - 배포 그룹 - 배포그룹 생성을 누른다
배포 그룹 이름 : MyWebServerCodeDeployAppDG-015
서비스 역할 : CodeDeployRole-015

이제 배포 설정을 해 보자.
이전 단계에서 생성한 배포 그룹으로 설정하고, 개정 유형에서 애플리케이션을 GitHub에 저장한다고 체크한다.
GitHub 토큰 이름에 내 깃허브 계정을 누른 후, 연결 버튼을 누른다.

아래 그림처럼 GitHub 계정 연결 페이지가 나온다. Authorize aws-codesuite 버튼을 눌러 계정을 연결해주자.

계정이 연결되었다고 나왔다.
리포지토리 이름에는 리포지토리 URL 입력
커밋 ID는 가장 최근의 커밋 ID를 입력
배포 생성 버튼을 눌러 배포를 생성하자.

생성한 배포를 확인해보자.


-배포 수명 주기 이벤트에 실패 라고 나온다. 해당 이벤트로 들어가 보자.



sudo systemctl restart codedeploy-agent # 2개 인스턴스에서 실행.


배포과정이 끝났다.

두 인스턴스에 배포 완료되었다.
로드밸런서 DNS 주소로 접근해보자

계속 새로고침을 해도 배포된 화면이 보인다. 이는, 인스턴스 두개 모두 배포된 내용을 포함하고 있다.

EC2 - 시작 템플릿 - 작업 - 템플릿 수정(새 버전 생성)

고급 세부 정보 - IAM 인스턴스 프로파일 - EC2 인스턴스 정책을 추가
템플릿 버전 생성

시작 템플릿 - 버전 - 방금 수정한 시작 템플릿 버전 2 선택 - 기본 버전 설정

템플릿 버전 2 선택 후 기본 버전으로 설정

이제 수정한 시작 템플릿을 ASG 에 적용해보자.

동일한 시작 템플릿이 선택 되어있다.
버전을 클릭해 2버전으로 변경 해 준다. - 업데이트

이제 다시 코드 배포를 한다면 EC2 인스턴스에 정책을 추가하지 않아도 된다.
애플리케이션을 삭제 후, AGS 그룹 크기 변경, 애플리케이션 재생성
배포 그룹 생성 시, 로드 밸런서 기능 활성화를 체크하지 않고 생성
배포 실시한다.

배포 시, EC2 인스턴스 정책이 부여되어 있기 때문에 오류가 발생하지 않는다.
로드밸런서 DNS 접속



=> 배포 재시도를 하지 않아도, AGS 크기 변경된다.
