💡Today I Learned
- AWS 클라우드 실습에 대한 네 번째 수업을 진행했습니다.
- 어제자 종합 실습 이어서 진행 _ AWS CLI, 콘솔, RDS, Front(React), CI/CD 파이프라인, Route53 도메인 설정 (완료)
1. 종합 실습
- 종합 실습 구성
: 하나의 VPC 안에 서브넷 구성
: 가용 영역(AZ) 2개 안에 각각 private/public 서브넷
: private 서브넷 두 개 (AZ가 2개) → 내부에 인스턴스(Elastic beanstalk), RDBMS(RDS) + AZ 2개 중 1개에만 private 서브넷이 NAT gateway로 외부와 통신
: public 서브넷 → [baston host] 터널링을 통해 접속
: public 서브넷은 internet gateway를 통해 외부와 통신
: 인터넷을 통해 도메인 만들어서 SSL 인증서 적용
: CloudFront 구성
: S3에 정적 웹 호스팅 기능으로 간단한 React 소스 올려서 배포
: 소스코드를 git에다 올렸을 때 CodePipeline을 통해서 자동 배포되도록 구성
- 과정
1) JAVA를 이용해 백엔드 모듈 구성 ☑️ (Gradle, SpringBoot 프로젝트 생성)
2) Elasticbeanstalk 인스턴스 생성 ☑️ → 앞서 만든 Springboot 프로젝트 운영, 웹 서버 관리/배포/실행
- 만들어둔 VPC 설정
- private subnet 영역에 생성
- RDS 선택 (DB)
- beanstalk이 만들어지면 자동적으로 EC2도 만들어짐
3) S3 구성 ✅
4) React(UI, 프론트) 구성 ✅
5) RDS 구성 ✅
6) VPC(AWS 가상 네트워크) 구성 ☑️
7) baston host 역할의 EC2 인스턴스 생성 (서버) ☑️ → public 서브넷에 위치함
7) 가상의 도메인 구성해서 연결 ✅
8) SSL 구성 ✅
9) CI/CD 자동 빌드/배포 구성 ✅
- AWS CLI
: 웹 콘솔 명령어를 shell 인터페이스에서 명령줄로 실행
: pip install해서 사용
$ pip3 install awscli
: CLI 설정 (config)
$ aws configure
AWS Access Key ID [액세스 키]
AWS Secret Access Key [비밀 액세스 키]
Default region name
Default output format
*) IAM에서 key 받기
: 사용자 생성 > 보안 자격 증명 > 액세스 키 > 액세스 키 만들기 > 사용 사례 CLI > 액세스 키 & 비밀 액세스 키 입력
: S3 접속 권한 할당 (사용자에게 관련 정책 추가 _ S3FullAccess)
$ aws s3 ls
$ aws s3 mb s3://[버킷 네임]
: 만들어진 S3 리스트 확인
: S3 내에 버킷 만들기 (mb)
$ aws s3 sync [파일 경로] s3://[버킷 이름]
: 로컬에 있는 파일을 버킷에 업로드
$ aws s3 rm s3://[버킷 이름] --recursive
: 올라간 파일 지우기
: 하위 디렉토리까지 모두 삭제하는 옵션 (--recursive)
- 콘솔 접속
: baston host 접속 (public 서브넷에 위치함)
: beanstalk은 private 서브넷이라 바로 접속 불가 (baston host의 퍼블릭 서버를 통해서 접속할 수 있음)
$ ssh -i ["키 페어 파일명"] ec2-user@[baston host의 IPv4 퍼블릭 IP]
: baston host 접속 (o)
$ ssh -i ["키 페어 파일명"] ec2-user@[beanstalk의 IPv4 퍼블릭 IP]
: beanstalk 접속 (x)
$ vi mykey.pem # 발급받은 키 내용 복사
$ ssh -i ["키 페어 파일명"] ec2-user@[baston host의 IPv4 퍼블릭 IP] # 키를 baston host에 등록
$ mkdir [.pem 키 만들 디렉토리]
$ cd [해당 .pem 키 복붙할 디렉토리로 이동]
$ vi mykey.pem # 복사한 키 내용 붙여넣기
$ chmod 400 mykey.pem # 권한 맞춰주기
: baston host에 접속 > 키 붙여넣을 디렉토리 생성 > vi 명령어로 편집기 열어서 복붙 > 파일 생성 > 키 권한 맞춰주기
: baston host의 .pem 키를 통해 private 서브넷 안의 beanstalk에 접속 가능
: beanstalk (-env) > 보안 편집 > EC2 키 페어 mykey.pem (CLI에서 복붙한 파일 내용) 설정 > 적용
$ # baston host 내에 접속한 상태로 계속 진행
$ ssh -i [.pem 키 파일명] ec2-user@[beanstalk 프라이빗 IP]
$ netstat -an | grep 5000 # 서버가 떠있는지 확인
$ cd /var/log # 로그 확인
: beanstalk의 [프라이빗 IP]로 접속
: beanstalk은 기본적으로 5000번 포트 > 안쪽에 nginx가 80번 포트 (reverse proxy를 통해 연결돼있음)
*) beanstalk 콘솔에서 로그 요청해서 다운받기: elastic beanstalk 콘솔 > 로그 > 로그 요청
*) tail 걸어서 끝 몇줄 로그만 확인할 때는 CLI에서 진행 (ex: $ tail -200f web.stdout.log)
- RDS
: VPC 내 private 서브넷에 위치하도록 설정
: RDS > 서브넷 그룹 (서브넷 그룹 안에 DB 들어갈 수 있도록) > DB 서브넷 그룹 생성 > 이름, VPC(만들어 둔) 설정 > 가용 영역 a, c 2개 지정 > private 서브넷 2개 지정 > 생성
: RDS > 데이터베이스 생성 > 표준 생성 > 엔진 옵션 설정 (MySQL) > 템플릿 설정 (프리티어) > DB 이름, 마스터 이름, 마스터 암호 설정 > 인스턴스 구성 설정 > 연결 = [EC2 컴퓨팅 리소스에 연결 안 함] *) 추후 DB 클라이언트 툴과도 연결해야 함 > VPC 설정 > DB 서브넷 그룹 (앞서 만든) 설정 > 퍼블릭 액세스 Yes > VPC 보안 그룹 설정 > 가용 영역(AZ) 2(a, c) 중 1 선택 > 생성
: RDS > 파라미터 그룹 → 여러 옵션들 설정 가능
*) DB 클라이언트 툴에서 MySQL 접속 설정
: 만든 RDS > VPC 보안 그룹 > 인바운드 규칙 > 3306 포트 범위 존재하는지 확인 (MySQL 접속을 위함)
: DB 클라이언트 툴 > 식별할 수 있는 이름 > RDS 엔드포인트 복붙 > Host에 작성 > Port는 3306 > User, Password에 RDS 생성 시 설정했던 마스터 이름, 마스터 암호 등록 > 접속 > **우리가 만든 RDS는 private 네트워크에 위치함**
*) public에 있는 baston host 서버를 지나가는 터널링 추가 생성
: DB 클라이언트 툴 > SSH/SSL > Host = Use SSH Turnnel > baston host의 퍼블릭 IP > User name = ec2-user > Authentication type = Key pair > Private key file = .pem 키 파일 선택 > Apply (적용) > 이후 최종 접속
: DB 클라이언트 툴에서 스키마, 테이블 생성 ~..
- Front
: (S3 버킷 만들기) S3 > 버킷 생성 > 버킷 이름(호스팅 할 도메인 명), 리전 설정 > 생성
: (Front의 소스를 만든 이 버킷에 올릴 것임) 만든 버킷 > 정적 웹 사이트 호스팅 > 활성화 > 인덱스 문서에 'index.html'(Front) > 저장
*) React 프로젝트 생성 (데모용 간단하게 템플릿만 이용)
: Node.js 설치 (https://nodejs.org/en/ → LTS 버전 설치)
$ npm install npx -g
: Npx 설치 (Node.js 설치된 상태에서 설치)
$ npx create-react-app [앱 이름]
: React 프로젝트 생성
: 생성된 프로젝트 폴더 열기
$ npm start
: React 프로젝트 내 터미널에서 진행
: React 기본 페이지가 생성
: localhost:3000 으로 접속 (로컬에서 작동) → 이걸 S3에 올리기
$ npm run build
$ npm install -g serve
$ serve -s build
: 초기 기본 세팅으로 빌드
: 'build' 폴더 & 안에 'index.html' 파일 생성 → S3에 올려주기
: S3 > 버킷 > 만들어둔 버킷(호스팅할 도메인 명으로 네이밍) > 객체 > 업로드 > 파일 및 폴더 > build 폴더 전체 > 업로드
: S3 > 버킷 > 만들어둔 버킷 > 권한 > 퍼블릭 액세스 차단 편집 > [모든 퍼블릭 액세스 차단] 설정 해제 > 저장
: 권한 > 버킷 정책 > 편집 > 정책 생성기
- Select Type of Pollcy: S3 Bucket Policy
- Principal: * (all)
- Amazon Resouce Name(ARN): '버킷 정책 편집'화면에서의 ARN 복붙 + /* (하위 모든 파일까지)
- Add Statement
- Generate Policy
- JSON 복사
- 정책의 코드 란에 붙여넣기 > 저장
: 버킷 > 속성 > 정적 웹 사이트 호스팅 > 버킷 웹 사이트 엔드포인트 > 접속 (아까 localhost:3000 에서 봤던 화면 확인 가능)
- CI/CD
- CodePipeline 이용 + 만들어 둔 Spring 백엔드 소스를 CI/CD 연동 + 깃허브에 소스가 있다고 가정 + CodeBuild & CodeDeploy로 배포
- Source(Github) - Build(AWS CodeBuild) - Deploy(AWS CodeDeploy) 가 가능한 파이프라인 생성
: Codepipline > 파이프라인 생성 > 이름, 새 서비스 역할 생성 > 소스 공급자 (ex: Github - Github에 연결 - 리포지토리 - 브랜치 > 빌드 선택 (AWS CodeBuild - 리전 설정 - 만들어둔 CodeBuild 프로젝트 or 프로젝트 생성) > 배포 선택 (AWS CodeDeploy - 리전 - 만들어 둔 CodeDeploy 애플리케이션 설정 - 배포 그룹 설정 > 생성
- CodeBuild 생성 시 Buildspec 내에 수정 (build: commands: - ./gradlew build / artifacts: files: - '**/*')
- *) 주의할 점: public이면 beanstalk으로 쉽게 배포 설정 가능, but private 안에 있는 것을 연동하고 private 네트워크 안에 들어가서 배포하기 위해 private 내에 파이프라인을 만들 것임 = AWS CodeDeploy 별도 생성 + ELB를 통해 배포
- CodeDeploy > (미리 생성해놓은) 애플리케이션 > 배포 그룹 이름 설정 > 서비스 역할 설정 > 환경 구성 [Amazon EC2 Auto Scail 그룹] 체크 > 로드 밸런서 [로드 밸런서 활성화], [Application Load Balancer 또는 Network Load Balancer] - 만들어둔 ELB 대상 그룹 (private 서브넷 안의 인스턴스를 연결해주는 ELB → 얘와 연동해서 배포될 수 있도록 설정함)
: CodeDeploy 사용 시 Springboot 'root'안에 'appspec.yml' 파일 추가 (어디로 배포가 될 것인지에 관한 세팅, 배포되는 위치를 읽을 수 있는 파일 → 깃허브에 함께 업로드 → CodeDeploy 문제 없이 동작함)
$ ssh -i [.pem 키 파일명] ec2-user@[baston host 퍼블릭 IP]
$ ssh -i [.pem 키 파일명] ec2-user@[beanstalk 프라이빗 IP]
$ # 서버에 code deploy agent 설치하기
$ wget https://aws.codedeploy-ap-northeast-2.s3.ap-northest-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
$ sudo service codedeploy-agent status # agent 작동 확인
$ sudo service codedeploy-agent start # 실행 안된다면 start
$ # code deploy 잘 돌아가는지 확인
$ less /var/log/aws/codedeploy-agent/codedeploy-agent.log
: 배포 과정 로그 확인(모니터링) → beanstalk으로 확인 → beanstalk은 private, 따라서 baston host에 먼저 접속
: code deploy agent 설치
: 이벤트가 발생할 때마다 자동으로 Souce - Build - Deploy 진행
- Route53
: 도메인 구입 + 도메인으로 서비스할 수 있도록 구성
1) AWS에서 도메인 구입
: Route 53 > 도메인 등록 > 쓸 수 있는 도메인인지 입력 후 확인 > 장바구니에 추가 후 구매..
2) 외부 웹 호스팅 사이트(가비아, 카페24, ...)에서 도메인 구입
: Route 53 > DNS 관리 > 호스팅 영역 생성 > 구입한 도메인 이름 > 생성
: 기본적인 네임 서버 등록됨
: 웹 호스팅 사이트로 가서 네임 서버 등록/수정 (?)
- 도메인 → S3로 직접 찾아가는 것이 아닌 CloudFront(CDN 서비스) 구성
*) CDN이 아닌 다이렉트로 S3를 찾아갈 경우 → ELB에 SSL 인증서 등록하기
: CloudFront > 배포 > 배포 생성 > 원본 도메인(앞서 만든 S3) 설정 > 뷰어 프로토콜 정책 선택 (http and https) > 설정 > (ACM_Amazon Certification Manager 에서 만든 도메인으로 SSL 인증서 발급 or 인증서 생성) 사용자 정의 SSL 인증서 등록 > 생성
: Route53 > 호스팅 영역 > 만든 도메인 > 레코드 생성 > 라우팅 정책 (단순 라우팅) > 단순 레코드 정의 > 레코드 이름 = www, 값/트래픽 라우팅 대상 = CloudFront(CDN 사용 o) / S3(CDN 사용 x), 배포 선택 = 연결할 S3 > 단순 레코드 정의
→ Route53 연결 후에는 'www.우리가 구입한 해당 도메인' 으로 만들어 둔 웹 application으로 연결 가능
- 서브 도메인 등록 (다이렉트로 elastic beanstalk이나 EC2, ELB로 접속 시 서브 도메인 이용 가능)
: Route53 > 호스팅 영역 > 만든 도메인 > 레코드 생성 > 라우팅 정책 (단순 라우팅) > 단순 레코드 정의 > 레코드 이름 = api, 값/트래픽 라우팅 대상 = Elastic Beanstalk > 단순 레코드 정의
→ 프론트에서 백 호출 시 복잡한 url이 아닌 'api.해당 도메인' 로 호출/REST api 전송/연동 가능
💡Furthermore
-
- 설명 부족한 부분 따로 개념 이해
- 리버스 프록시
- nginx
- public이면 왜 beanstalk 바로 끌고와서 배포 설정 가능한지?
- private안에 파이프라인을 구축하는 이유?(→ beanstalk, S3 등 연동할 리소스들이 private 영역 안에 있어서??)
- 네임 서버
- '다이렉트로 elastic beanstalk이나 EC2로 접속 시 서브 도메인 이용 가능함'의 의미? 이유?
- 설명 부족한 부분 따로 개념 이해
'데브코스 > TIL' 카테고리의 다른 글
[TIL] 8주차_Day31: 데이터 웨어하우스 관리, 고급 SQL, BI 대시보드 (1) (2) | 2023.11.27 |
---|---|
[TIL] 7주차_Day30: AWS 클라우드 실습 (5) (1) | 2023.11.25 |
[TIL] 7주차_Day28: AWS 클라우드 실습 (3) (1) | 2023.11.22 |
[TIL] 7주차_Day27: AWS 클라우드 실습 (2) (1) | 2023.11.21 |
[TIL] 7주차_Day26: AWS 클라우드 실습 (1) (1) | 2023.11.20 |