2. AWS 아키텍처 설계 기본

 

1. AWS 아키텍팅 하기 전에 알아야 할 것들

1) AWS Well-Architecture Framework (5개 pillar)

Alt text

1. 운영 우수성

Alt text

2. 보안

Alt text

Alt text

  • 물리보안: AWS가 담당
  • 이외는 고객이 담당

3. 안정성 (가장 중요)

Alt text

  • Immutable 아키텍처를 설계하여 시스템 장애 발생 시 빠르게 복구할 수 있도록 해야 함
  • 수평 확장 설계: auto scaling

4. 성능 효율성

Alt text

5. 비용 최적화

Alt text

2) AWS 서버 인프라의 확장 과정

Alt text

  • EC2 하나에 application, DB 엔진이 설치되어 있음

Alt text

  • EC2를 이중화하여 서버의 가용성을 확보
  • DB를 RDS에 단일형으로 분리/관리
  • DB가 단일화되어 비교적 안정성이 떨어짐

Alt text

  • RDS의 multi-AZ 기능을 사용하여 DB를 이중화
    • Master DB에 장애가 생겨도 slave DB에서 failover 할 수 있어 DB의 안정성 확보 가능

Alt text

  • Load balancer(ELB)를 통한 부하분산이 추가된 설계
  • ELB를 EC2 앞단에 배치하여 EC2를 외부에서 직접 접근이 불가능
    • Health check, monitoring 기능 사용 가능

Alt text

  • EC2의 auto scaling 기능을 사용하여 서버의 수평 확장이 가능
  • 트래픽 증가 시, EC2 수평 확장으로 인해 DB에 예상치못한 부하가 발생 가능
    따라서, DB도 부하를 감당할 수 있게 설계할 필요가 있음

Alt text

  • EC2에 있던 정적 컨텐츠를 S3로 위임
    • EC2의 부하를 줄일 수 있음
    • S3의 다양한 기능을 통해 컨텐츠 접근 관리, 형상 관리 가능

Alt text

  • 정적 컨텐츠를 빠르게 배포하기 위해 Cloudfront를 활용
  • 각 지역에 존재하고 있는 edge location에 S3의 정적 컨텐츠가 캐시되어 서비스의 성능 향상 가능

Alt text

  • 정적 컨텐츠뿐만 아니라, 모든 트래픽을 Cloudfront로 서비스하는 설계
  • 동적 컨텐츠에 대해서도 캐시 기능을 사용

Alt text

  • 글로벌 인프라 확장

3) AWS 리소스 네이밍 컨벤션

  1. 리소스 태그
    • VPC, EC2, subnet 등 모든 리소스
    • 상시 변경 가능
  2. 리소스 자체
    • ELB, RDS, Elasticache 등
    • 변경 불가 (리소스 재생성)

Alt text

Alt text

2. 네트워크 기초

1) 네트워크 CIDR에 대한 설명

CIDR(Classless Inter-Domain Routing)
클래스 없는 도메인간 라우팅 기법

Alt text

1. CIDR 주소 표기법

Alt text

  • 사용할 수 있는 IP의 범위를 표시

2. CIDR 주소 계산

Alt text

  • /26: Subnet mask B (앞에서부터 1의 개수)
  • https://www.ipaddressguide.com/cidr
  • $ ipcalc 10.10.1.2/26

2) 네트워크 트래픽과 대역폭

Alt text

3) HTTP, SSL, TLS 개념

Alt text

4) 웹브라우저에서 도메인 URL을 입력하면 일어나는 일들

Alt text

  1. 웹브라우저가 URL을 분석
  2. HSTS 목록 확인
    1. HSTS 목록에 존재하면, HTTPS로 보내기
    2. 없으면, HTTP로 보내기
  3. 웹브라우저에 캐시되어 있는 도메인인지 확인
    1. 캐시가 되어 있으면 해당 화면 보여주기
    2. 아니면 다음 단계
  4. OS 내에 캐시되어 있는 도메인인지 확인
    1. 캐시가 되어 있으면 해당 화면 보여주기
    2. 아니면 다음 단계
  5. 로컬 PC의 hosts 설정 확인
    1. 호스트 설정이 되어 있으면, 해당 도메인 보여주기
  6. DHCP & ARP의 라우터 확인하여 도메인을 쿼리? …

5) AWS에서 네트워크 설계하기

Alt text

Alt text

Alt text

6) NACL과 security group (stateless vs statefull)

Alt text

3. VPC 실습하기

1) 목표 네트워크 아키텍처 설명

Alt text

Alt text

2) VPC 생성하기 (vpc, subnet, routetable)

  1. VPC/VPC 생성
    1. IPv4 CIDR: 10.1.0.0/16
  2. VPC/서브넷/서브넷 생성
    Alt text
  3. 인터넷 게이트웨이 생성
    1. 이름: my-igw
    2. VPC에 연결 (my-vpc)
  4. 라우팅 테이블/라우팅 테이블 생성
    1. 이름: my-public-route
    2. 이름: my-private-route
  5. NAT 게이트웨이
    1. 이름: my-natgateway
    2. 서브넷: my-public-subnet-a
    3. 탄력적 IP 할당
  6. 라우팅 테이블
    1. my-public-route
      1. 라우팅/라우팅 편집
        1. 대상: 0.0.0.0/0
        2. 대상: 인터넷 게이트웨이 - igw-...
      2. 서브넷 연결/서브넷 연결 편집
        1. my-public-...
    2. my-private-route
      1. 라우팅/라우팅 편집
        1. 대상: 0.0.0.0/0
        2. 대상: NAT 게이트웨이 - nat-...
      2. 서브넷 연결/서브넷 연결 편집
        1. my-private-...

3) Bastion host 구성 및 NAT, GW 실습 구성

Alt text

  1. EC2/보안 그룹/보안 그룹 생성
    1. 이름: my-bastion-host-sg
      1. VPC: my-vpc
      2. 인바운드 규칙
        1. 유형: SSH
        2. 대상: 내 IP
    2. 이름: my-private-ec2-sg
      1. VPC: my-vpc
      2. 인바운드 규칙
        1. 유형: SSH
        2. 대상: my-bastion-host-sg
  2. EC2/인스턴스/인스턴스 시작
    1. 이름: my-bastion-host
    2. 키 페어: my-ec2-keypair
    3. 네트워크
      1. VPC: my-vpc
      2. 서브넷: my-public-subnet-a
      3. 기존 보안 그룹 선택: my-bastion-host-sg
  3. EC2/탄력적 IP
    1. 탄력적 IP 주소 할당
    2. 탄력적 IP 주소 연결
      1. my-bastion-host
    3. my-bastion-host 퍼블릭 IPv4 주소 확인
  4. EC2/인스턴스/인스턴스 시작
    1. 이름: my-private-ec2
    2. 키 페어: my-ec2-keypair
    3. 네트워크
      1. VPC: my-vpc
      2. 서브넷: my-private-subnet-app-a
      3. 기존 보안 그룹 선택: my-private-ec2-sg

4) OpenVPN 구성 및 NAT Gateway 실습

Alt text

  1. EC2/인스턴스 생성
    1. 이름: my-openvpn-ec2
    2. AMI 선택
      1. openvpn 검색
      2. OpenVPN Access Server 선택
    3. 네트워크
      • my-vpc, my-public-subnet-a
    4. 보안 그룹 생성
      1. 인바운드 보안 그룹 규칙
        • 소스 유형(전체): 내 IP
  2. my-private-ec2-sg
    1. 인바운드 규칙에 my-openvpn-ec2 SSH 열어두기
  3. 탄력적 IP 주소 할당/인스턴스 연결
  4. Admin UI 접속
     Admin  UI: https://43.200.141.126:943/admin
     Client UI: https://43.200.141.126:943/
    
  5. USER MANAGEMENT/USER Permissions
    1. 유저 추가
      1. Username: my-private-ec2
      2. Allow Auto-login
      3. Password 설정
      4. Save settings
  6. Client UI 에서 프로그램 설치
  7. VPN 연결 후, private 인스턴스에 접속 가능

5) VPC Peering 실습

Alt text

  1. 도쿄 region에서 VPC 생성
    1. 생성할 리소스: VPC 등
    2. 이름 태그 자동 생성: my-tokyo
    3. IPv4 CIDR 블록: 192.168.10.0/24
      서울 region과 겹치지 않아야함
    4. NAT 게이트웨이, VPC 엔드포인트: 없음
  2. 인스턴스 생성
    1. 이름: my-tokyo-private-ec2
    2. 키 페어: 키 페어 없이 계속 진행
      직접 접근할 것이 아니기 때문에 선택 X
    3. VPC: my-tokyo-vpc
    4. 서브넷: my-tokyo-subnet-private1-ap-northeast-1a
    5. 인바운드 규칙 편집/추가
      1. 유형: 모든 ICMP - IPv4
      2. 소스: 10.1.0.0/16 (서울 region)
  3. VPC/Peering connections
    1. 피어링 연결 생성
      1. 이름: my-peer-tokyo-to-seoul
      2. VPC(요청자): my-tokyo-vpc
      3. 계정: 내 계정
      4. 리전: 다른 리전
      5. VPC ID(수락자): 서울 region vpc id
    2. 서울 region으로 와서 요청 수락
    3. 이름 변경: my-peer-tokyo-to-seoul
  4. 서울 region/VPC/라우팅 테이블
    1. my-private-route/라우팅 편집/라우팅 추가
    2. 대상: 192.168.10.0/24
    3. 대상: 피어링 연결, my-peer-tokyo-to-seoul
    4. 도쿄 region도 마찬가지 step 1-3 수행 (my-tokyo-rtb-private1-ap-northeast-1a)
  5. 서울 private ec2에서 도쿄 ec2로 ping test
    ping 192.168.10.142

4. 소규모 서비스 구축해보기

1) 목표 아키텍처 및 개발 환경 설명

Alt text

2) Route53 및 ACM 생성하기

  1. Route53/등록된 도메인
    1. 도메인 등록
  2. Certificate Manager
    1. 인증서 요청
    2. 완전히 정규화된 도메인 이름
      • alchemine.link
      • *.alchemine.link
    3. 인증서/Route 53에서 레코드 생성
    4. 인증서 나열에서 발급됨 상태 확인

3) 보안 그룹 생성하기 (ALB/EC2/RDS)

Alt text

  1. 보안 그룹 생성 (ALB)
    1. 이름: my-app-alb-sg
    2. VPC: my-vpc
    3. 인바운드 규칙
      1. HTTP, HTTPS: Anywhere-IPv4
    4. 태그
      1. Name: my-app-alb-sg
  2. 보안 그룹 생성 (EC2)
    1. 이름: my-app-ec2-sg
    2. VPC: my-vpc
    3. 인바운드 규칙
      1. SSH: OpenVPN-sg
      2. 포트 3000: OpenVPN-sg
      3. 포트 8080: OpenVPN-sg
      4. 포트 80: my-app-alb-sg
      5. 포트 443: my-app-alb-sg
      6. 포트 8080: my-app-alb-sg
  3. 보안 그룹 생성 (RDS)
    1. 이름: my-app-rds-sg
    2. VPC: my-vpc
    3. 인바운드 규칙
      1. MYSQL(3306): OpenVPN-sg
      2. MYSQL(3306): my-app-alb-sg

4) EC2/RDS/ELB 생성하기

  1. 인스턴스 생성 (EC2)
    1. 이름: my-alchemine-app-ec2
    2. 서브넷: my-private-subnet-app-a
    3. 보안 그룹: my-app-ec2-sg
    4. 스토리지: 20GB
  2. RDS 생성
    1. 서브넷 그룹/DB 서브넷 그룹 생성
      1. 이름: my-alchemine-app-sbg
      2. VPC 설정
      3. 가용 영역: a, c
      4. 서브넷: DB 서브넷만 선택
    2. 데이터베이스 생성
      1. 엔진 유형: MySQL
      2. 템플릿: 개발/테스트
      3. 배포 옵션: 단일 DB 인스턴스
      4. DB 인스턴스 식별자: my-alchemine-app-rds
      5. 마스터 사용자 이름: root
      6. 마스터 암호: 설정
      7. DB 인스턴스 클래스: 버스터블 클래스
        • db.t3.micro
      8. 연결/컴퓨팅 리소스: 연결 안 함
      9. VPC: my-vpc
      10. DB 서브넷 그룹: my-alchemine-app-sbg
      11. 퍼블릭 액세스: 아니요
      12. VPC 보안 그룹(방화벽): 기존 항목 선택
      13. 기존 VPC 보안 그룹
        • default 제거
        • my-app-rds-sg 추가
      14. 가용 영역: a
  3. ELB 생성
    1. EC2/대상 그룹/대상 그룹 생성
      1. 대상 유형 선택: 인스턴스
      2. 대상 그룹 이름: my-alchemine-app-tg-80
      3. VPC: my-vpc
      4. 고급 상태검사 설정
        1. 재정의: 80
      5. 사용 가능한 인스턴스에서 my-alchemine-app-ec2아래에 보류 중인 것으로 포함 (포트: 80)
    2. 대상 그룹 이름: my-alchemine-app-tg-8080
      1. 8080 포트로 나머지 동일하게 생성
    3. 로드밸런서/로드밸런서 생성
      1. ALB 생성
      2. 이름: my-alchemine-app-alb
      3. 네트워크 매핑/매핑: a, c 모두 선택
        1. 서브넷: my-public-subnet-a, my-public-subnet-c 선택
      4. 보안 그룹: my-app-alb-sg (default 제거)
      5. 리스터: HTTP:80, HTTPS:443 추가 (대상 그룹: my-alchemine-app-tg-80)
      6. Certificate (from ACM): 선택 (8080 패스)
    4. 로드 밸런서/리스너 규칙/규칙 편집
      1. 기본 작업: URL로 리디렉션
      2. 프로토콜: HTTPS
      3. 포트: 443
      4. (그러나, ACM을 못 받아서 패스)

5. AWS Autoscaling Group 개요

1) Autoscaling Group이란

Alt text

2) Launch template과 Golden AMI

Alt text

  1. Launch template
    • Instance 정보, keypair, AMI 정보, VPC 정보 등을 미리 저장해놓은 template
    • Autoscaling group을 만들 때 launch template을 사용
    • Launch template에서 사용되는 가상머신 이미지(OS + 필수 프로그램 등이 설치됨)를 golden AMI라 부름

3) Autoscaling Group의 policy

Alt text

Alt text

Alt text

4) Autoscaling Group의 Lifecycle

Alt text

  1. Pending
    • Wait
    • Procceed
  2. In service
  3. Terminate
    • Wait
    • Procceed
  4. Terminated

6. Autoscaling Group 실습

1) Autoscaling Group을 사용한 목표 아키텍처 설명

Alt text

2) 실습환경 VPC 확인하기

Alt text

3) 보안그룹 생성하기(EC2, ELB)

  1. ALB 보안그룹
    1. 이름: my-asg-alb-sg
    2. 인바운드 규칙: 80, Anywhere-IPv4
  2. EC2 보안그룹
    1. 이름: my-ec2-alb-sg
    2. 인바운드 규칙
      1. 22: openvpn
      2. 80: openvpn
      3. 80: my-asg-alb-sg

4) EC2 생성하여 AMI 이미지 만들기

  1. 인스턴스 시작
    1. 이름: my-asg-ec2
    2. AMI: amazon/al2023-ami-2023.2.20231016.0-kernel-6.1-x86_64
    3. 서브넷: my-private-subnet-app-a
    4. 보안 그룹: 생성한 거 사용
  2. 패키지 설치
    1. https://github.com/kimdragon50/ec2meta-webpage
    2. http://10.1.1.132/ec2meta-webpage/index.php에서 정보들을 확인할 수 있음
      Alt text
  3. 이미지 생성
    1. 작업/이미지 및 템플릿/이미지 생성
      1. 이름: my-asg-ec2-ami-1210
      2. 재부팅 안 함: 활성화 체크

5) Launch template 생성하기

  1. 시작 템플릿 생성
    1. 이름: my-asg-lt
    2. 시작 템플릿 콘텐츠/애플리케이션 및 OS 이미지
      1. 내 AMI/내 소유: my-asg-ec2-ami-1210
    3. 인스턴스 유형: t2.micro
    4. 키 페어 선택
    5. 서브넷: my-private-subnet-app-a
    6. 보안 그룹 선택: my-asg-ec2-sg

6) ELB 생성하기

  1. 로드 밸런서 생성
    1. 로드 밸런서 유형: ALB
    2. 이름: my-asg-alb
    3. 네트워크 매핑
      1. VPC: my-vpc
      2. 매핑: my-public-subnet-a, my-public-subnet-c
    4. 보안 그룹: my-asg-alb-sg
    5. 리스너 및 라우팅 설정
      1. 리스너 HTTP:80
        1. 대상 그룹 생성
          1. 이름: my-asg-ec2-tg
          2. 상태 검사/상태 검사 경로: /ec2meta-webpage/index.php
          3. my-asg-ec2를 보류 중인 것으로 포함
        2. my-asg-ec2-tg 선택
  2. Route53
    1. 호스팅 영역/도메인 선택/레코드 생성
      1. 레코드 이름: asg-ec2
      2. 별칭
        1. ALB에 대한 별칭
        2. 생성한 로드밸런서 선택
    2. 타겟 그룹에 healthy 상태를 확인
  3. http://asg-ec2.alchemine.link/ec2meta-webpage/index.php 확인

7) Autoscaling Group 생성하기

  1. EC2/Auto Scaling Groups/Auto Scaling 그룹 생성
    1. 이름: my-asg-ec2
    2. 시작 템플릿: my-asg-lt
    3. 네트워크
      1. 가용 영역 및 서브넷: my-private-subnet-app-a, my-private-subnet-app-c
    4. 로드 밸런싱: 기존 로드 밸런서에 연결
      1. 기존 로드 밸런서 대상 그룹: my-asg-ec2-tg
    5. 상태 확인
      1. 상태 확인 유예 시간: 300초 -> 10초
  2. 생성된 Auto Scaling 그룹/선택
    1. 그룹 세부 정보/편집
      1. 최대 용량: 1 -> 3
    2. Auto Scaling/동적 크기 조정 정책 생성
      1. 지표 유형: 평균 CPU 사용률
      2. 대상 값: 50 -> 70
      3. 인스턴스 워밍업: 10초
  3. 대상 그룹/대상
    1. 등록된 대상에서 하나는 등록 취소
  4. 대상 그룹/속성
    1. 등록 취소 지연(드레이닝 간격): 300초 -> 10초

      8) Autoscaling Group Scale Out 테스트하기

  5. my-asg-ec2 접속
  6. CPU stress 추가
     sudo -s
     amazon-linux-extras install epel
     yum install stress
     stress -c 1&
     top
    
    1. Cloudwatch가 CPU 부하를 확인
    2. Autoscaling Group이 CPU 부하를 확인하고 활동/활동 알림 탭에 auto scaling 결과를 보여줌
    3. 모니터링/Auto Scaling
      1. Auto Scaling 그룹 지표 수집: 활성화 체크