본문 바로가기

데브코스/TIL

[TIL] 7주차_Day29: AWS 클라우드 실습 (4)

💡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로 접속 시 서브 도메인 이용 가능함'의 의미? 이유?

 

 
반응형