[SK shieldus Rookies 16기][AWS] AWS 웹 서비스 환경 구성 실습

Jina·2023년 12월 1일
0

SK shieldus Rookies 16기

목록 보기
29/59
post-custom-banner

1. VPC생성

  1. VPC > VPC 생성
  2. VPC 설정
- 생성할 리소스 VPC만
- 이름 : TestVPC-020
- IPv4 CIDR : 10.0.0.0/16

2. 서브넷 생성

VPC > 서브넷 > 서브넷 생성

  1. VPC ID : 1번에서 생성한 TestVPC-020 선택

  2. 서브넷 설정

- 서브넷 이름 : public-subnet-a-041
- 가용 영역 : 리전에서 첫번째 영역 선택
- IPv4 VPC CIDR block : 10.0.0.0/16
- IPv4 subnet CIDR block : 10.0.10.0/24

  1. 서브넷 추가
  2. 서브넷 설정
- 서브넷 이름 : public-subnet-c-041
- 가용 영역 : 리전에서 세번째 영역 선택
- IPv4 VPC CIDR block : 10.0.0.0/16
- IPv4 subnet CIDR block : 10.0.30.0/24

3. 인터넷 게이트웨이 생성

  1. VPC > 인터넷 게이트웨이 > 인터넷 게이트웨이 생성
  2. 인터넷 게이트웨이 설정
- 이름 : TestIGW020
  1. IGW와 VPC 연결
    3-2. VPC > 인터넷 게이트웨이 > VPC에 연결
    3-3. 아까 생성했던 VPC 선택 > 인터넷 게이트웨이 연결
  2. 인터넷 게이트웨이 상태 Attached 확인

4. 라우팅 테이블에서 인터넷 편집

  1. VPC > 라우팅 테이블 > VPC가 TestVpC-020으로 된 것 체크
  2. 라우팅 탭 > 라우팅 편집 > 라우팅 추가
  3. 라우팅 설정
- 대상 : 0.0.0.0/0
- 대상 : 인터넷 게이트웨이 / igw-xxx..
  1. 변경 사항 저장 버튼 클릭

  1. public-subnet-a 서브넷을 퍼블릭 서브넷으로 설정(또는 변경)
    VPC > 서브넷 > public-subnet-a-020 선택 > 라우팅 테이블 탭 > IGW가 제대로 연결됐는지 확인

  1. public-subnet-c-020 도 같은 방식으로 확인

5. 보안 그룹 생성

  1. VPC > 보안 그룹 > 보안 그룹 생성
[기본 세부 정보]
  - 보안 그룹 이름 : WebServerSG-020
  - 설명 : Web Server Security Group for 020 user
  - VPC : TestVPC-020으로 변경
[인바운드 규칙]
  - 규칙 2개 추가
  - 유형 : HTTP
  - 프로토콜 : TCP
  - 포트범위 : 80
  - 소스 : Anywhere-IPv4
  - 설명-선택사항 : Web Server Port
  - 유형 : SSH
  - 프로토콜 : TCP
  - 포트범위 : 22
  - 소스 : Anywhere-IPv4
  - 설명-선택사항 : Secure Telnet Port
  1. 보안그룹 생성 버튼 클릭

6. 웹 서버 인스턴스 생성

  1. EC2 > 인스턴스 시작
[이름 및 태그]
  - 이름 : webserver
[Application and OS Images (Amazon Machine Image)]
  - Amazon Linux
  - Amazon Machine Image(AMI) : Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
[인스턴스 유형]
  - t2.micro
[키 페어(로그인)]
  - 키 페어 이름 : MyKeyPair-020 ⇒ 전날 만들어둔 키페어
[네트워크 설정]
  - VPC : TestVPC-020 선택
  - 서브넷 : puvlic-subnet-a-020 선택
  - 퍼블릭 IP 자동 할당 : 활성화
  - 방화벽(보안그룹) : 기존 보안 그룹 선택
  - 일반 보안 그룹 : WebServerSG-020 선택
[고급 세부정보]
#!/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
# PHP 용 SDK 설치
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

2. 나머지 설정은 변경하지 않고 그대로 유지한 상태로 인스턴스 생성

7. 인스턴스에 SSH 접속 후 웹 서버 설치

  1. EC2 > 인스턴스 > 생성한 인스턴스 확인
    퍼블릭 IPv4주소는 SSH 접속 시 필요하므로 기억해두자.

  2. cmd창

# 어제 다운로드 받은 pem 파일이 존재하는 디렉터리로 이동
C:\>cd C:\Users\USER\Desktop

# pem 파일 
C:\Users\USER\Desktop>dir *.pem
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 7CA3-675B

 C:\Users\USER\Desktop 디렉터리

2023-11-30  오후 04:56             1,678 MyKeyPair-020.pem
               1개 파일               1,678 바이트
               0개 디렉터리  82,107,662,336 바이트 남음
# 키 파일 업로드
C:\Users\USER\Desktop>ssh -i MyKeyPair-020.pem ec2-user@54.218.49.195
The authenticity of host '54.218.49.195 (54.218.49.195)' can't be established.
ECDSA key fingerprint is SHA256:MI0JrtfD6aVItptN4INL5IyrLgX8AJQY6FLS8isLco0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '54.218.49.195' (ECDSA) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

[ec2-user@ip-10-0-10-230 ~]$

8. 웹 서버 구동 확인

인터넷 브라우저 주소창에 퍼블릭 IPv4 주소 입력

9. 웹 서버 설정이 끝난 상태에서 AMI를 생성

  1. EC2 > 인스턴스 > 인스턴스 선택 > 작업 > 이미지 생성
- 이미지 이름 : webserver-ami-020
- 이미지 설명-선택사항 : webserver image for 020
  1. 나머지 설정은 그대로 두고 이미지 생성

생성된 이미지는 EC2 > AMI 에서 확인 가능
⇒ 이미지 생성이 완료되면 상태가 "사용 가능으로" 변경된다.

10. 생성한 webserver-ami 이미지를 이용해서 웹 서버 인스턴스를 public-subnet-c 서브넷에 생성

⇒ 사용자 데이터 항목에 입력했던 스크립트(프로그램 설치 및 설정)의 실행 과정을 생략할 수 있음

  1. EC2 > AMI > webserver-ami-020 선택 > AMI로 인스턴스 시작 클릭
[이름 및 태그]
 - 이름 : webserver2
[인스턴스 유형]
 - t2.micro
[키 페어(로그인)]
 - 키 페어 이름 : MyKeyPair-020
[네트워크 설정]
 - VPC : TestVPC-020
 - 서브넷 : public-subnet-c-020
 - 퍼블릭 IP 자동 할당 : 활성화
 - 방화벽(보안 그룹) : 기존 보안 그룹 선택
 - 일반 보안 그룹 : WebServerSG020 선택
  1. 나머지 설정을 그대로 유지한 상태에서 인스턴스 생성
  2. SSH 로그인
  3. 인터넷 브라우저에 퍼블릭 IPv4 주소 입력
  4. 서버 구동 확인

11. 로드밸런서 구성

동일한 내용의 서비스를 제공하는 인스턴스 두 개가 실행되고 있음
개별 인스턴스의 주소로 접속하는 경우, 이용의 불편과 부하 집중의 문제가 발생할 수 있음
⇒ 로그밸런서를 이용해서 서비스될 수 있도록 수정
⇒ 부하분산과 서비스 편의를 제공

애플리케이션 로드밸런서 생성

  1. EC2 > 로드 밸런서 > 로드 밸런서 생성
  2. 로드 밸런서 유형 : Application Load Balancer 생성 클릭
[기본 구성]
 - 로드 밸런서 이름 : weblb-020
 - 체계 : 인터넷 경계
 - IP 주소 유형 : IPv4
[네트워크 매핑]
  - VPC : TestVPC-020

- us-west-2a (usw2-az1) 체크
- us-west-2c (usw2-az3) 체크

[보안 그룹]
  1. 새 보안 그룹을 생성 클릭
  2. 로드 밸런스용 보안 그룹 생성
     [기본 세부 정보]
       - 보안 그룹 이름 : lbSG-020
       - 설명 : Load Balance Security Group for 020
       - VPC : TestVPC-020 선택
     [인바운드 규칙]
       - 유형 : HTTP
       - 프로토콜 : TCP
       - 포트 범위 :80
       - 소스 : Anywhere
 2-2. 보안그룹 생성 클릭
3. 보안 그룹 lbSG-020 선택

[리스너 및 라우팅]
  1. 대상 그룹 생성 클릭
      [그룹 세부 정보 지정]
        - 대상 유형 : 인스턴스
        - 대상 그룹 이름 : webserver-TG-020
        - 프로토콜:포트 : HTTP  80
        - IP 주소 유형 : IPv4
        - VPC : TestVPC-020
        - 프로코톨 버전 : HTTP1
  2. `다음` 클릭

[대상 등록]
  1. webserver 와 webserver2 선택 > 아래에 보류 중인 것으로 포함 > 대상 그룹 생성
  2. 대상 그룹으로 webserver-TG-020 선택
  3. 로드 밸런서 생성

12. 로드밸런스로 접근

로드 밸런서: weblb-020

- 상태 : 활성
- DNS 이름 : weblb-020-1283113824.us-west-2.elb.amazonaws.com
  1. 웹 브라우저 주소창에 DNS 이름 입력
  2. 새로고침하면 Private IP가 10.0.10.x 또는 10.0.30.x 로 변경되는 것을 확인할 수 있다. ⇒ 두 개의 인스턴스가 번갈아가면서 응답하는 것을 확인

13. 중단

작업 중단 시 EC2 인스턴스인 webserver와 webserver2 중단시키기.

👾 이슈

EC2 퍼블릭 주소로 접근했을 때 화면이 안 나오는 경우

웹 서버 인스턴스 생성 시 사용자 데이터 설정이 되어 있지 않은 경우 발생하는 이슈

EC2 퍼블릭 주소로는 접근되는데 로드밸런서로 접근은 되나 화면이 안 나오는 경우

대상 그룹이 설정되지 않은 경우 또는 대상 그룹에 인스턴스가 등록되지 않은 경우


14. 인스턴스 재시작

퍼블릭 IP로 접근 시 정상적으로 화면이 나오면 재시작된 것이다.

로드밸런서의 DNS주소로 접근 시 IP가 번갈아가며 나오는 것을 확인할 수 있다.


15. 로드밸런서를 통해서만 서비스할 수 있도록 제한

현재는 클라이언트에서 로드밸런서를 이용하지 않고 개별 인스턴스로 직접 접근하는 것이 가능하다.
모든 요청을 로드밸런서를 통해서 처리하도록 제한하고 개별 인스턴스에 로드밸런서로부터 오는 HTTP(80) 요청만 허용하도록 수정한다.

  1. 보안그룹에서 인바운드 규칙 편집

  2. 기존 HTTP 삭제

  1. 새 인바운드 규칙 확인
  1. 별 인스턴스의 퍼블릭 주소로 접근되는지 확인
    브라우저를 이용해서 개별 인스턴스의 퍼블릭 주소로 접근되는지 확인 ⇒ 접근할 수 없음

  1. 로드밸런서 주소로 접근되는지 확인

profile
공부 기록
post-custom-banner

0개의 댓글