Reference
컴파일, 빌드, 배포의 개념 및 차이
Prerequisite
- 일반적인 블로그 서비스의 시스템 아키텍쳐를 간단하게나마 그릴 수 있다.(클라이언트, 서버, 데이터베이스 추상화)
⭐️ Web Application Architecture: Definition, Models, Types
⭐️ The Fundamentals of Web Application Architecture
Keywords
1. Cloud
[AWS] 클라우드 컴퓨팅은 IT 리소스를 인터넷을 통해 on-demand(요구하는 즉시)로 제공하고 사용한 만큼만 비용을 지불하는 것
※ 물리적 데이터 센터와 서버를 구입, 소유 및 유지 관리하는 대신, Amazon Web Services(AWS)와 같은 클라우드 공급자로부터 필요에 따라 컴퓨팅 파워, 스토리지, 데이터베이스와 같은 기술 서비스에 액세스할 수 있습니다.
2. Deploy
빌드가 완성된 실행 가능한 파일을 사용자가 접근할 수 있는 환경에 배치시키는 일
- local host가 아니라 누구나 어디서든 접속할 수 있는 public link로 만드는 것
3. S3
- Simple Storage Service의 약자로 파일 서버의 역할을 하는 서비스
4. EC2
- Elastic Compute Cloud의 약자
- 한대의 컴퓨터를 임대해주는 것
- 여기에 자신이 선호하는 운영체제를 설치하고, 웹서비스를 위한 프로그램들(웹서버, 데이터베이스 등)을 설치
- EC2
5. RDS
- Relational Database Service의 약자로 아마존 웹서비스에서 제공하는 데이터베이스 전용 서비스
- 데이터베이스를 운영 하기 위해서 필요한 복제, 백업, 장애복구와 같은 작업을 대행
- 지원되는 데이터베이스
: MySQL, Oracle, SQL Server
Sprint - Deploy
Achievement Goals
- Cloud와 Deployment의 의미를 각 각 알고, 내 코드를 남에게 배포할 수 있다.
- 최소 AWS 서비스 블럭 에서 3개 이상의 서비스를 활용 하고, 설명 할 수 있다.(S3, EC2, RDS)
- ssh를 무엇을 위해 활용 하는지 알고, 다른 컴퓨터에 원격 접속 한다는 것의 의미를 설명할 수 있다.
- 보안을 위하여 github에 올리지 말아야 할 코드를 gitignore로 따로 분류 할 수 있다.
1. Practice Deploy Shortly Express to Cloud
: Shortly Express AWS 서비스 블락을 활용해서 배포
Client - Shortly Express React Client 빌드 파일을 S3에 배포
- React Build
CLI에서
1) cd client
2) yarn start
3) yarn build: js, html 파일을 webpack을 통해 합쳐서 하나의 정적파일로 제공
- Create Bucket
AWS Management Console에서
1) 버킷 만들기
2) 설정 - 버킷 public으로 만들기
정적 웹사이트 호스팅: 이 버킷을 사용하여 웹사이트를 호스팅
- 인덱스 문서: index.html(endpoint)
- 오류 문서: index.html
- Public Access
What is ARN?
What is principal in policy?
1) 권한 - 퍼블릭 엑세스 설정 - 기존 설정 제거
2) 버킷 정책 - 정책 생성기: S3 bucket policy
3) Principal: *, Actions: GetObject, ARN: 특정한 형식에 맞추어 저장
4) 생성된 json 타입의 정책 => 버킷 정책에 붙여넣기
5) 빌드해 두었던 정적 파일 복사하여 S3 버킷에 업로드
- Server Application - Shortly Express API server application을 EC2에 올려서 구동
- Create Server Application
배포에 사용하기 위한 기본 server application 생성
1) npm project => install express
localhost:5000 => deploy ?
2) (gitHub에 해당 서버 어플리케이션 업로드) gitHub 원격저장소 활용해서 서버 어플리케이션 EC2 업로드
- Start Instance
실제로 AWS 클라우드 컴퓨터인 EC2를 사용
=> 임대할 클라우드 컴퓨터 EC2 셋업
AWS Management Console에서
1) EC2 - instance 시작
Ubuntu Server 18.04 이용(프리티어 사용가능)
2) 원격 컴퓨터에 접속하기 위한 프라이빗 키 작성
-
새 키페어 생성
-
키 페어 이름(변경불가능=>주의해서 작성)
-
키 페어 다운로드
3) 인스턴스 시작(헷갈리지 않게 Name 작성)
4) 연결 - 인스턴스에 연결
5) CLI에서
(linux기반) root directory에 .ssh 폴더열기
※ 만약 .ssh 폴더 없을 경우, mkdir .ssh로 파일 생성
6) 다운로드 받았던 pem키를 ssh 폴더로 이동
7) 키 파일 chmod로 권한 부여
chmod 400 practice-server-deploy.pem
8) 퍼블릭 DNS을(를) 사용하여 인스턴스에 연결
- pem key & IPv4 퍼블릭 IP
필요
ssh -i "practice-server-deploy.pem" ubuntu@ec2-18-216-123-32
=> ubuntu에 접속
(node, npm 설치안됨, git 만 설치된 상태, runtime이 없음)
-
Environment Settings
EC2에서 우리가 작성한 server Application을 구동할 수 있도록 환경을 셋팅
1) ubuntu node, npm 설치(https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-16-04)
(https://velog.io/@loakick/AWS-EC2-Ubuntu-18.04%EC%97%90-NodeJS-Github-Mysql-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0)
sudo apt update
sudo apt install nodejs
sudo apt npm
2) gitHub에서 shortly-express repo를 EC2 서버에 git clone
-
git clone <repo 주소>
-
dependency 설치: npm install
-
서버 start 예시: node index.js
※ EC2 접속: public IP:port
예시) 18.216.123.32:5000
3) 퍼블릭 접속위한 보안 설정 필요!
- Security Group
외부에서 우리 서버어플리케이션으로 접속 할 수 있도록 보안 설정
1) 보안그룹 인바운드 편집
- PM2
터미널을 종료해도 서버가 계속 켜져 있을 수 있도록하는 proccess manager tool인 PM2
1) pm2 global 설치
npm install -g pm2
sudo npm install -g pm2
2) 서버 시작: pm2 start ()
3) 어플리케이션 정상작동 확인: pm2 list
pm2를 이용한 Node 프로세스 관리
- Database - 로컬 mysql을 RDS로 대체하여, server application과 연결
Install MySQL Server on the Ubuntu operating system
※ EC2 서버 시작
cd .ssh
.ssh hongyounglan$ ssh -i shortly-express.pem ubuntu@3.14.88.41
- mysql 접속
mysql -u <master username> --host <endpoint> -P <port number> -p
// password 입력
2. Bare Minimum Requirement
1) Deploy SPA(single page application) with Aws S3
2) Deploy Node API server Application with AWS EC2
- EC2에 Sever Application을 배포
3) Use database cloud service RDS and can connect on some client tool or CLI
- Cloudservice RDS를 이용하여 데이터베이스를 구축하고, 클라이언트 툴 혹은 cli에서 외부접속 가능