1. AWS 아키텍팅 하기 전에 알아야 할 것들
1) AWS Well-Architecture Framework (5개 pillar)
1. 운영 우수성
2. 보안
- 물리보안: AWS가 담당
- 이외는 고객이 담당
3. 안정성 (가장 중요)
- Immutable 아키텍처를 설계하여 시스템 장애 발생 시 빠르게 복구할 수 있도록 해야 함
- 수평 확장 설계: auto scaling
4. 성능 효율성
5. 비용 최적화
2) AWS 서버 인프라의 확장 과정
- EC2 하나에 application, DB 엔진이 설치되어 있음
- EC2를 이중화하여 서버의 가용성을 확보
- DB를 RDS에 단일형으로 분리/관리
- DB가 단일화되어 비교적 안정성이 떨어짐
- RDS의 multi-AZ 기능을 사용하여 DB를 이중화
- Master DB에 장애가 생겨도 slave DB에서 failover 할 수 있어 DB의 안정성 확보 가능
- Load balancer(ELB)를 통한 부하분산이 추가된 설계
- ELB를 EC2 앞단에 배치하여 EC2를 외부에서 직접 접근이 불가능
- Health check, monitoring 기능 사용 가능
- EC2의 auto scaling 기능을 사용하여 서버의 수평 확장이 가능
- 트래픽 증가 시, EC2 수평 확장으로 인해 DB에 예상치못한 부하가 발생 가능
따라서, DB도 부하를 감당할 수 있게 설계할 필요가 있음
- EC2에 있던 정적 컨텐츠를 S3로 위임
- EC2의 부하를 줄일 수 있음
- S3의 다양한 기능을 통해 컨텐츠 접근 관리, 형상 관리 가능
- 정적 컨텐츠를 빠르게 배포하기 위해 Cloudfront를 활용
- 각 지역에 존재하고 있는 edge location에 S3의 정적 컨텐츠가 캐시되어 서비스의 성능 향상 가능
- 정적 컨텐츠뿐만 아니라, 모든 트래픽을 Cloudfront로 서비스하는 설계
- 동적 컨텐츠에 대해서도 캐시 기능을 사용
- 글로벌 인프라 확장
3) AWS 리소스 네이밍 컨벤션
- 리소스 태그
- VPC, EC2, subnet 등 모든 리소스
- 상시 변경 가능
- 리소스 자체
- ELB, RDS, Elasticache 등
- 변경 불가 (리소스 재생성)
2. 네트워크 기초
1) 네트워크 CIDR에 대한 설명
CIDR(Classless Inter-Domain Routing)
클래스 없는 도메인간 라우팅 기법
1. CIDR 주소 표기법
- 사용할 수 있는 IP의 범위를 표시
2. CIDR 주소 계산
/26
: Subnet maskB
(앞에서부터 1의 개수)- https://www.ipaddressguide.com/cidr
$ ipcalc 10.10.1.2/26
2) 네트워크 트래픽과 대역폭
3) HTTP, SSL, TLS 개념
4) 웹브라우저에서 도메인 URL을 입력하면 일어나는 일들
- 웹브라우저가 URL을 분석
- HSTS 목록 확인
- HSTS 목록에 존재하면, HTTPS로 보내기
- 없으면, HTTP로 보내기
- 웹브라우저에 캐시되어 있는 도메인인지 확인
- 캐시가 되어 있으면 해당 화면 보여주기
- 아니면 다음 단계
- OS 내에 캐시되어 있는 도메인인지 확인
- 캐시가 되어 있으면 해당 화면 보여주기
- 아니면 다음 단계
- 로컬 PC의 hosts 설정 확인
- 호스트 설정이 되어 있으면, 해당 도메인 보여주기
- DHCP & ARP의 라우터 확인하여 도메인을 쿼리? …
5) AWS에서 네트워크 설계하기
6) NACL과 security group (stateless vs statefull)
3. VPC 실습하기
1) 목표 네트워크 아키텍처 설명
2) VPC 생성하기 (vpc, subnet, routetable)
- VPC/VPC 생성
- IPv4 CIDR:
10.1.0.0/16
- IPv4 CIDR:
- VPC/서브넷/서브넷 생성
- 인터넷 게이트웨이 생성
- 이름:
my-igw
- VPC에 연결 (
my-vpc
)
- 이름:
- 라우팅 테이블/라우팅 테이블 생성
- 이름:
my-public-route
- 이름:
my-private-route
- 이름:
- NAT 게이트웨이
- 이름:
my-natgateway
- 서브넷:
my-public-subnet-a
- 탄력적 IP 할당
- 이름:
- 라우팅 테이블
my-public-route
- 라우팅/라우팅 편집
- 대상:
0.0.0.0/0
- 대상:
인터넷 게이트웨이
-igw-...
- 대상:
- 서브넷 연결/서브넷 연결 편집
my-public-...
- 라우팅/라우팅 편집
my-private-route
- 라우팅/라우팅 편집
- 대상:
0.0.0.0/0
- 대상:
NAT 게이트웨이
-nat-...
- 대상:
- 서브넷 연결/서브넷 연결 편집
my-private-...
- 라우팅/라우팅 편집
3) Bastion host 구성 및 NAT, GW 실습 구성
- EC2/보안 그룹/보안 그룹 생성
- 이름:
my-bastion-host-sg
- VPC:
my-vpc
- 인바운드 규칙
- 유형: SSH
- 대상: 내 IP
- VPC:
- 이름:
my-private-ec2-sg
- VPC:
my-vpc
- 인바운드 규칙
- 유형: SSH
- 대상:
my-bastion-host-sg
- VPC:
- 이름:
- EC2/인스턴스/인스턴스 시작
- 이름:
my-bastion-host
- 키 페어:
my-ec2-keypair
- 네트워크
- VPC:
my-vpc
- 서브넷:
my-public-subnet-a
- 기존 보안 그룹 선택:
my-bastion-host-sg
- VPC:
- 이름:
- EC2/탄력적 IP
- 탄력적 IP 주소 할당
- 탄력적 IP 주소 연결
my-bastion-host
my-bastion-host
퍼블릭 IPv4 주소 확인
- EC2/인스턴스/인스턴스 시작
- 이름:
my-private-ec2
- 키 페어:
my-ec2-keypair
- 네트워크
- VPC:
my-vpc
- 서브넷:
my-private-subnet-app-a
- 기존 보안 그룹 선택:
my-private-ec2-sg
- VPC:
- 이름:
4) OpenVPN 구성 및 NAT Gateway 실습
- EC2/인스턴스 생성
- 이름:
my-openvpn-ec2
- AMI 선택
openvpn
검색OpenVPN Access Server
선택
- 네트워크
my-vpc
,my-public-subnet-a
- 보안 그룹 생성
- 인바운드 보안 그룹 규칙
- 소스 유형(전체):
내 IP
- 소스 유형(전체):
- 인바운드 보안 그룹 규칙
- 이름:
my-private-ec2-sg
- 인바운드 규칙에
my-openvpn-ec2
SSH 열어두기
- 인바운드 규칙에
- 탄력적 IP 주소 할당/인스턴스 연결
- Admin UI 접속
Admin UI: https://43.200.141.126:943/admin Client UI: https://43.200.141.126:943/
- USER MANAGEMENT/USER Permissions
- 유저 추가
- Username:
my-private-ec2
- Allow Auto-login
- Password 설정
- Save settings
- Username:
- 유저 추가
- Client UI 에서 프로그램 설치
- VPN 연결 후, private 인스턴스에 접속 가능
5) VPC Peering 실습
- 도쿄 region에서 VPC 생성
- 생성할 리소스: VPC 등
- 이름 태그 자동 생성:
my-tokyo
- IPv4 CIDR 블록:
192.168.10.0/24
서울 region과 겹치지 않아야함 - NAT 게이트웨이, VPC 엔드포인트: 없음
- 인스턴스 생성
- 이름:
my-tokyo-private-ec2
- 키 페어: 키 페어 없이 계속 진행
직접 접근할 것이 아니기 때문에 선택 X - VPC:
my-tokyo-vpc
- 서브넷:
my-tokyo-subnet-private1-ap-northeast-1a
- 인바운드 규칙 편집/추가
- 유형: 모든 ICMP - IPv4
- 소스:
10.1.0.0/16
(서울 region)
- 이름:
- VPC/Peering connections
- 피어링 연결 생성
- 이름:
my-peer-tokyo-to-seoul
- VPC(요청자):
my-tokyo-vpc
- 계정: 내 계정
- 리전: 다른 리전
- VPC ID(수락자): 서울 region vpc id
- 이름:
- 서울 region으로 와서
요청 수락
- 이름 변경:
my-peer-tokyo-to-seoul
- 피어링 연결 생성
- 서울 region/VPC/라우팅 테이블
my-private-route
/라우팅 편집/라우팅 추가- 대상:
192.168.10.0/24
- 대상: 피어링 연결,
my-peer-tokyo-to-seoul
- 도쿄 region도 마찬가지 step 1-3 수행 (
my-tokyo-rtb-private1-ap-northeast-1a
)
- 서울 private ec2에서 도쿄 ec2로 ping test
ping 192.168.10.142
4. 소규모 서비스 구축해보기
1) 목표 아키텍처 및 개발 환경 설명
2) Route53 및 ACM 생성하기
- Route53/등록된 도메인
- 도메인 등록
- Certificate Manager
- 인증서 요청
- 완전히 정규화된 도메인 이름
alchemine.link
*.alchemine.link
- 인증서/Route 53에서 레코드 생성
- 인증서 나열에서
발급됨
상태 확인
3) 보안 그룹 생성하기 (ALB/EC2/RDS)
- 보안 그룹 생성 (ALB)
- 이름:
my-app-alb-sg
- VPC:
my-vpc
- 인바운드 규칙
- HTTP, HTTPS: Anywhere-IPv4
- 태그
- Name:
my-app-alb-sg
- Name:
- 이름:
- 보안 그룹 생성 (EC2)
- 이름:
my-app-ec2-sg
- VPC:
my-vpc
- 인바운드 규칙
- SSH:
OpenVPN-sg
- 포트 3000:
OpenVPN-sg
- 포트 8080:
OpenVPN-sg
- 포트 80:
my-app-alb-sg
- 포트 443:
my-app-alb-sg
- 포트 8080:
my-app-alb-sg
- SSH:
- 이름:
- 보안 그룹 생성 (RDS)
- 이름:
my-app-rds-sg
- VPC:
my-vpc
- 인바운드 규칙
- MYSQL(3306):
OpenVPN-sg
- MYSQL(3306):
my-app-alb-sg
- MYSQL(3306):
- 이름:
4) EC2/RDS/ELB 생성하기
- 인스턴스 생성 (EC2)
- 이름:
my-alchemine-app-ec2
- 서브넷:
my-private-subnet-app-a
- 보안 그룹:
my-app-ec2-sg
- 스토리지: 20GB
- 이름:
- RDS 생성
- 서브넷 그룹/DB 서브넷 그룹 생성
- 이름:
my-alchemine-app-sbg
- VPC 설정
- 가용 영역:
a
,c
- 서브넷: DB 서브넷만 선택
- 이름:
- 데이터베이스 생성
- 엔진 유형:
MySQL
- 템플릿:
개발/테스트
- 배포 옵션:
단일 DB 인스턴스
- DB 인스턴스 식별자:
my-alchemine-app-rds
- 마스터 사용자 이름:
root
- 마스터 암호: 설정
- DB 인스턴스 클래스:
버스터블 클래스
db.t3.micro
- 연결/컴퓨팅 리소스:
연결 안 함
- VPC:
my-vpc
- DB 서브넷 그룹:
my-alchemine-app-sbg
- 퍼블릭 액세스:
아니요
- VPC 보안 그룹(방화벽):
기존 항목 선택
- 기존 VPC 보안 그룹
default
제거my-app-rds-sg
추가
- 가용 영역:
a
- 엔진 유형:
- 서브넷 그룹/DB 서브넷 그룹 생성
- ELB 생성
- EC2/대상 그룹/대상 그룹 생성
- 대상 유형 선택:
인스턴스
- 대상 그룹 이름:
my-alchemine-app-tg-80
- VPC:
my-vpc
- 고급 상태검사 설정
- 재정의:
80
- 재정의:
- 사용 가능한 인스턴스에서
my-alchemine-app-ec2
를아래에 보류 중인 것으로 포함
(포트:80
)
- 대상 유형 선택:
- 대상 그룹 이름:
my-alchemine-app-tg-8080
- 8080 포트로 나머지 동일하게 생성
- 로드밸런서/로드밸런서 생성
- ALB 생성
- 이름:
my-alchemine-app-alb
- 네트워크 매핑/매핑: a, c 모두 선택
- 서브넷:
my-public-subnet-a
,my-public-subnet-c
선택
- 서브넷:
- 보안 그룹:
my-app-alb-sg
(default
제거) - 리스터: HTTP:80, HTTPS:443 추가 (대상 그룹:
my-alchemine-app-tg-80
) - Certificate (from ACM): 선택 (8080 패스)
- 로드 밸런서/리스너 규칙/규칙 편집
- 기본 작업:
URL로 리디렉션
- 프로토콜: HTTPS
- 포트: 443
- (그러나, ACM을 못 받아서 패스)
- 기본 작업:
- EC2/대상 그룹/대상 그룹 생성
…
5. AWS Autoscaling Group 개요
1) Autoscaling Group이란
2) Launch template과 Golden AMI
- Launch template
- Instance 정보, keypair, AMI 정보, VPC 정보 등을 미리 저장해놓은 template
- Autoscaling group을 만들 때 launch template을 사용
- Launch template에서 사용되는 가상머신 이미지(OS + 필수 프로그램 등이 설치됨)를 golden AMI라 부름
3) Autoscaling Group의 policy
4) Autoscaling Group의 Lifecycle
- Pending
- Wait
- Procceed
- In service
- Terminate
- Wait
- Procceed
- Terminated
6. Autoscaling Group 실습
1) Autoscaling Group을 사용한 목표 아키텍처 설명
2) 실습환경 VPC 확인하기
3) 보안그룹 생성하기(EC2, ELB)
- ALB 보안그룹
- 이름:
my-asg-alb-sg
- 인바운드 규칙:
80
,Anywhere-IPv4
- 이름:
- EC2 보안그룹
- 이름:
my-ec2-alb-sg
- 인바운드 규칙
- 22: openvpn
- 80: openvpn
- 80:
my-asg-alb-sg
- 이름:
4) EC2 생성하여 AMI 이미지 만들기
- 인스턴스 시작
- 이름:
my-asg-ec2
- AMI:
amazon/al2023-ami-2023.2.20231016.0-kernel-6.1-x86_64
- 서브넷:
my-private-subnet-app-a
- 보안 그룹: 생성한 거 사용
- 이름:
- 패키지 설치
- 이미지 생성
- 작업/이미지 및 템플릿/이미지 생성
- 이름:
my-asg-ec2-ami-1210
- 재부팅 안 함:
활성화
체크
- 이름:
- 작업/이미지 및 템플릿/이미지 생성
5) Launch template 생성하기
- 시작 템플릿 생성
- 이름:
my-asg-lt
- 시작 템플릿 콘텐츠/애플리케이션 및 OS 이미지
- 내 AMI/내 소유:
my-asg-ec2-ami-1210
- 내 AMI/내 소유:
- 인스턴스 유형:
t2.micro
- 키 페어 선택
- 서브넷:
my-private-subnet-app-a
- 보안 그룹 선택:
my-asg-ec2-sg
- 이름:
6) ELB 생성하기
- 로드 밸런서 생성
- 로드 밸런서 유형: ALB
- 이름:
my-asg-alb
- 네트워크 매핑
- VPC:
my-vpc
- 매핑:
my-public-subnet-a
,my-public-subnet-c
- VPC:
- 보안 그룹:
my-asg-alb-sg
- 리스너 및 라우팅 설정
- 리스너 HTTP:80
- 대상 그룹 생성
- 이름:
my-asg-ec2-tg
- 상태 검사/상태 검사 경로:
/ec2meta-webpage/index.php
my-asg-ec2
를 보류 중인 것으로 포함
- 이름:
my-asg-ec2-tg
선택
- 대상 그룹 생성
- 리스너 HTTP:80
- Route53
- 호스팅 영역/도메인 선택/레코드 생성
- 레코드 이름:
asg-ec2
- 별칭
- ALB에 대한 별칭
- 생성한 로드밸런서 선택
- 레코드 이름:
- 타겟 그룹에 healthy 상태를 확인
- 호스팅 영역/도메인 선택/레코드 생성
http://asg-ec2.alchemine.link/ec2meta-webpage/index.php
확인
7) Autoscaling Group 생성하기
- EC2/Auto Scaling Groups/Auto Scaling 그룹 생성
- 이름:
my-asg-ec2
- 시작 템플릿:
my-asg-lt
- 네트워크
- 가용 영역 및 서브넷:
my-private-subnet-app-a
,my-private-subnet-app-c
- 가용 영역 및 서브넷:
- 로드 밸런싱: 기존 로드 밸런서에 연결
- 기존 로드 밸런서 대상 그룹:
my-asg-ec2-tg
- 기존 로드 밸런서 대상 그룹:
- 상태 확인
- 상태 확인 유예 시간: 300초 -> 10초
- 이름:
- 생성된 Auto Scaling 그룹/선택
- 그룹 세부 정보/편집
- 최대 용량: 1 -> 3
- Auto Scaling/동적 크기 조정 정책 생성
- 지표 유형:
평균 CPU 사용률
- 대상 값: 50 -> 70
- 인스턴스 워밍업: 10초
- 지표 유형:
- 그룹 세부 정보/편집
- 대상 그룹/대상
- 등록된 대상에서 하나는 등록 취소
- 대상 그룹/속성
- 등록 취소 지연(드레이닝 간격): 300초 -> 10초
8) Autoscaling Group Scale Out 테스트하기
- 등록 취소 지연(드레이닝 간격): 300초 -> 10초
my-asg-ec2
접속- CPU stress 추가
sudo -s amazon-linux-extras install epel yum install stress stress -c 1& top
- Cloudwatch가 CPU 부하를 확인
- Autoscaling Group이 CPU 부하를 확인하고
활동/활동 알림
탭에 auto scaling 결과를 보여줌 모니터링/Auto Scaling
- Auto Scaling 그룹 지표 수집:
활성화
체크
- Auto Scaling 그룹 지표 수집:
PREVIOUSEtc