Amazon S3
(Simple Storage Service)Amazon CloudFront
① (us-east-1) S3 Bucket 생성
② Object(File) 업로드
③ 정적 웹 사이트 호스팅 기능 활성화
속성부분에서 호스팅 설정을 한다. 인덱스 문서는 S3버킷으로 웹사이트 호스팅이 되었을 때 보여주는 기본 페이지이다.
④ Bucket과 Object에 대한 액세스 정책 설정 (먼저 활성화되어있는 모든 퍼블릭 엑세스 차단을 비활성화 해야한다.)
S3버킷에 대한 엑세스 차단을 수정한다. 그리고 버킷 정책에서 정책 생성기를 눌러서 정책을 설정한다.
(권한 -> 버킷정책 편집 -> 정책 생성기)
타입
은 S3 Bucket Policy로 설정.Effect
: Allow,Principal
: *
,Actions
: GetObject(조회만 가능하다)ARN
은 arn:aws:s3:::버킷이름/* 으로 설정해준다./*
을 추가해야 한다는 것이다.arn:aws:s3:::lab-s3-web-hosting-inflean/*
arn:aws:s3:::studyprojects3/*
생성된 정책을 복붙하고 저장한다.
⑤ 웹 브라우저에서 웹 사이트 작동 확인
https://d1g40qtzup6h2g.cloudfront.net/
X-Cache: Hit from cloudfront
vpc
: 우리끼리 사용하는 독립된 아이피 주소로 vpc별로 네트워크를 구성할 수 있다.
CIDR(Class Inter Domain Routing)
: CIDR 블록은 VPC 내의 인스턴스 및 리소스에 할당되는 IP 주소를 결정합니다. CIDR 블록을 AWS 인프라에 따라 서브넷으로 나누어서 사용하게 됩니다. CIDR 블록에서 '/16'의 의미는 IP의 길이를 나타내는 프리픽스로 CIDR의 범위는 /16에서 /28까지 가능합니다.
서브넷
: vpc를 쪼갠다. 서브넷을 나누는 이유는 더 많은 네트워크망을 만들기 위해서이다. 인터넷과 연결이 되어 있느냐 아니냐에 따라서 public, private 서블릿으로 나뉜다.
라우트 및 라우트테이블
: 네트워크 요청이 발생하면, 데이터는 라우트테이블에서 정한 라우트로 향한다. 즉, 라우트는 데이터의 목적지이다.
인터넷 게이트웨이
: VPC와 인터넷을 연결해주는 하나의 관문이다.
EC2
: AWS에서 원격으로 제어할 수 있는 가상의 컴퓨터를 한 대 빌리는 것
NAT 게이트웨이
: 프라이빗서브넷이 인터넷과 통신하기위한 아웃바운드 인스턴스입니다. 프라이빗 네트워크가 외부에서 요청되는 인바운드는 필요없더라도 인스턴스의 펌웨어나 혹은 주기적인 업데이트가 필요하여 아웃바운드 트래픽만 허용되야할 경우가 있습니다.
(private 서브넷 -> NAT 게이트웨이 -> 인터넷 게이트웨이 -> 인터넷)
vpc가 나누어 놓은 하위 네트워크인 6개의 서브넷 구성
트래픽이 이동하여 외부인터넷과 통신이 가능하도록 인터넷게이트웨이와 라우트테이블 생성 그리고 라우트 설정
(생성된 인터넷 게이트 웨이는 어떤 // 라우트 테이블 : 데이트 패킷
아마존 머신 이미지(AMI)를 사용해서 동일한 ec2를 추가 생성
외부 인터넷과 인터넷 게이트워이를 통해 직접 통신이 가능한 퍼블릭 서브넷
EC2 인스턴스에 필요한 소프트웨어를 설치하면 웹서버로 활용가능
efs는 각 서브넷에 마운트타겟을 통해 ec2인스턴스와 연결되고 파일을 공유
브라이븟 ec2에 접근하기위해 퍼블릭에 위치한 ec2를 이용한다. 이러한 ec2를 Bastion이라고 한다
트래픽 증가 등 문제에 대비하기 위해 프라이빗에 복수의 웹서버를 구성하고 이 인스턴스들을 로드밸런스에 연결
vpc에서 사용하는 ec2들이 호스트 네임을 사용할지 말지 결정하는 설정이다.
서브넷의 CIDR은 VPC의 CIDR보다 작아야한다.
public-subnet-a1
10.1.1.0/24
트래픽이 이동하여 외부인터넷과 통신이 가능하도록 인터넷게이트웨이와 라우트테이블 생성 그리고 라우트 설정
생성된 인터넷게이트웨이는 어떤 vpc의 게이트웨이 역할을 하는지 알아야 하기 때문에 VPC에 연결
라우팅 테이블 생성 : 라우트 테이블은 VPC 에 존재하는 서브넷들이 특정한 범위의 IP 목적지를 향할 때, Target 을 정해주는 역할을 한다.
생성한 라우트테이블과 서브넷을 연결한다. 지금은 public 서브넷은 IGA와 연결하고 private 서브넷은 NAT과 연결했다.
public 서브넷의 요청은 IGA로 가게되고, private 서브넷의 요청은 NAT로 간다.
public 라우트 테이블과 인터넷게이트웨이를 연결한다. 이것으로 트래픽이 설정된 인터넷게이트웨이를 통해 외부로 나가게 된다. private 라우트 테이블은 외부와 직접 연결하지 않는다.
서브넷별로 반복한다.
EC2 생성시 이전에 만들었던 vpc와 서브넷을 적용한다.
웹서버로 사용하기 때문에 보안그룹은 HTTP, HTTPS를 추가한다. 여기서 소스 유형
은 어디에서 오는 트래픽을 받을 것인지 결정하는 것이다.
사용자 데이터는 아래와 같다
#!/bin/bash
yum update -y
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum install -y httpd mariadb-server
systemctl start httpd
systemctl enable httpd
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
그리고 인스턴스 생성시 발급받은 key pair를 putty를 사용해서 ppk확장자로 변환한다. 만들어진 ppk파일로 서버에 접속할 수 있다.
시큐리티 그룹을 통해 나오는 nfs트래픽을 efs의 마운트 타겟(EC2)에 마운트 한다.
2. 마운트할 EC2 인스턴스가 위치하는 VPC, 가용 영역, 서브넷을 선택한다. 서브넷 아이디는 a1, c1을 선택하고 보안그룹은 efs를 위해 만든 시큐리티 그룹을 적용한다
yum install amazon-efs-utils -y
cd /var/www/html
mkdir efs
그 다음 마운트를 위해 마운트 포인트를 생성한다. 어디에 생성하든 위치는 상관없다. 지금 포인트는 efs 폴더로 적용했다.
efs서비스의 연결에 들어가서
지금은 마운트 헬퍼를 사용하기 때문에 해당하는 부분을 복사해서 putty에서 적용한다.
sudo mount -t efs -o tls fs-0e64e6805b8494d11:/ efs
df -h
이 명령어를 사용해서 확인해보면
/var/www/html/efs
가 마운트 포인트로 적용된 것을 확인할 수 있다.
S3에 들어가서 저장된 파일을 가져와보자. 원하는 파일의 객체 url을 복사해서 putty에 아래처럼 적용한다. 이 과정을 진행하는 폴더는 마운트 포인트가 적용된 폴더여야한다.(지금은 efs폴더이다)
wget https://lab-s3-web-hosting-inflean.s3.amazonaws.com/car.jpg
그리고 마운트 된 EC2의 ip를 가져와서 적용해보자(지금은 a1이다)
http://43.202.31.40/efs/mycar.html
다음에 c1에 적용할 때는 s3에서 파일을 가져오는 과정이 필요없다. efs는 인스턴스들이 공유하고 있고 a1에서 이미 파일을 가져와서 s3에 존재하기 때문이다.
인스턴스 메뉴에서 AMI를 사용해서 private-ec2-a1 서브넷을 생성한다. public을 생성할 때와 거의 같다.
public-ec2-a1(Bastion Host)
을 통해 private-ec2-a1에 접속 가능하도록 설정한다.
먼저 public-ec2-a1에 접속한다. 여기서 private-ec2-a1를 생성할 때 만들었던 키페어(.pem)파일을 편집해야한다.
vi ec2-private-seoul.pem
private-ec2-a1의 키페어 파일을 메모장으로 열고 내용을 모두 복사한 후 새로 생성하는 ec2-private-seoul.pem
파일에 붙여넣기한다.
3. ec2-private-seoul.pem파일에 대한 접근권한을 설정한다.
chmod 400 ec2-private-seoul.pem
ssh -i ec2-private-seoul.pem ec2-user@private-ec2-a1의 private ip
mysql -h RDS Endpoint -P 3306 -u admin -p
Read replica를 생성 후 원본 DB와 직접 연결되어 있는 인스턴스를 Read replica에 연결하는 것으로 수정한다.
원본 DB의 엔드포인트를 rrDB의 엔드포인트롤 수정하면된다.
원본 DB의 데이터를 수정하고 rrDB로 확인했을 때 수정되었는지 확인해본다.
dig lab-vpc-rds.chjqyckes5pk.ap-northeast-2.rds.amazonaws.comdig lab-vpc-rds.chjqyckes5pk.ap-northeast-2.rds.amazonaws.com
위의 명령어는 마스터 DB의 엔드포인트를 입력한 것이다. ip를 확인해본다.
그리고 장애 조치로 재부팅을 누르고 재부팅을 한 후 저 명령어를 입력하면 ip주소가 바뀐 것을 확인할 수 있다. 이유는 마스터 DB가 장애로 재부팅되면서 standBy DB가 실행됐기때문이다. 변경된 ip주소는 standBy DB의 ip주소이다.
private ec2에 대한 ami 이미지를 생성한다.
EC2 -> 시작 템플릿 -> 시작 템플릿 생성에서 템플릿을 생성한다.
target group 생성
인스턴스를 추가하지 않고 그냥 타겟그룹을 생성한다. 오토스케일링 그룹에 연결되는 로드밸런서의 타겟그룹이기 때문에 오토스케일링을 통해 생성되는 인스턴스들이 이 타겟그룹에 자동으로 등록이 된다.
로드 밸런서 생성
오토스케일링 그룹에 연결된 로드밸런서가 사용할 security group를 생성한다
원하는 크기
: 평상시에 유지하고 있을 인스턴스 수원하는 최소용량, 최대용량
: 말 그대로 최소, 최대로 유지할 인스턴스의 수ab -n 20000 -c 1000 http://lab-vpc-alb-asg-711088071.ap-northeast-2.elb.amazonaws.com/
ab -n 20000 -c 1000 http://lab-vpc-alb-asg-711088071.ap-northeast-2.elb.amazonaws.com/
이 요청이 다 끝나고 시간이 지나서 CPU 사용량이 감소하면 자동으로 Scale-In되어서 생성된 인스턴스가 삭제된다.
Auto Scaling 활동내역에 들어가서 확인해보자.
-참고
aws 참고 블로그