DAY73. [Deploy] Amazon Web Service

Davina·2022년 12월 6일
0

Cloud Computing

기존 방식의 한계

  • 주기적인 유지 관리가 필요함
  • 공간의 한계

⇒ 데이터 센터의 등장(온프레미스) && 유휴자원 대여

물리적인 컴퓨터가 아닌, 가상 컴퓨터를 대여!

클라우드의 단점

  • 클라우드 제공자에게 종속되어버림
  • 서비스에 영향을 미침

클라우드 서비스의 형태

  • SaaS (Software as a Service)
    • 클라우드 제공자가 당장 사용 가능한 소프트웨어를 제공하는 경우
  • PaaS (Platform as a Service)
    • 클라우드 제공자가 데이터베이스, 개발 플랫폼까지 제공하는 경우
  • IaaS (Infrasctucture as a Service)
    • 클라우드 제공자가 가상 컴퓨터까지 제공하는 경우
    • ex) AWS

Deployment

배포란? - 개발한 서비스를 사용자가 이용 가능하게 하는 과정

배포를 위한 다양한 플랫폼

ex) AWS, heroku, DigitalOcean, Microsoft Azure, Firebase …

배포에서는, 환경의 차이를 이해하고 환경 설정을 코드와 분리하는 것이 중요!!

작성한 코드가 다른 환경에서 정상 작동할 수 있게 하려면?

  • 절대 경로 대신 상대 경로를 사용합니다.
  • 환경에 따라 포트를 분기할 수 있도록 환경 변수 설정!
    • envvars or env 설정
  • Docker와 같은 개발 환경 자체를 통일시키는 솔루션 사용

EC2 (Elastic Compute Cloud)

  • AWS(아마존 웹 서비스)에서 제공하는 클라우드 컴퓨팅 서비스

클라우드 컴퓨팅 - 인터넷(클라우드)를 통해 서버, 스토리지, 데이터베이스 등의 컴퓨팅 서비스를 제공하는 서비스

  • AWS에서 원격으로 제어할 수 있는 가상의 컴퓨터를 한 대 빌리는 것
  • PC방과 같이 사용한 만큼 비용을 지불! ⇒ 필요에 따라 성능, 용량 자유롭게 조절 가능

장점

  • 구성하는데 필요한 시간이 짧다.

  • AMI를 통해 필요한 용도에 따라 다양한 운영체제에 대한 선택이 가능하다. (운영체제 뿐만 아니라, CPU와 RAM, 용량까지도 손쉽게 구성 가능)

AMI (Amazon Machine Image)

AWS에서 빌리는 컴퓨터를 Instance라고 한다.

AMI는 소프트웨어 구성이 기재된 템플릿입니다. 이미지 종류로는 단순히 운영체제(윈도우, 우분투 리눅스 등)만 깔려있는 템플릿을 선택할 수도 있고, 아예 특정 런타임이 설치되어 있는 템플릿이 제공되는 경우도 있습니다. (우분투 + node.js, 윈도우 + JVM 등)

AMI를 토대로 운영체제, CPU, RAM 혹은 런타임 등이 구성된 컴퓨터를 빌린다!


RDS (Relational Database Service)

AWS에서 제공하는 관계형 데이터 베이스 서비스

Why using RDS?

  • RDS를 이용하면 데이터베이스 유지 보수와 관련된 일들을 RDS에서 전적으로 자동 관리!

  • 데이터베이스 엔진마다 제공하는 기능이 조금씩 다르기에 필요와 목적에 맞게 데이터베이스 엔진을 선택하여 효율성을 높일 수 있습니다.


S3 (Simple Storage Service)

S3 사용 시 이점

  • 확장성 : 데이터를 무한히 저장 가능하다
    • 사용한 만큼만 비용을 지불하면 되기 때문에 비용적인 측면에서 매우 효율적!
  • 강력한 내구성
  • 99.99%의 가용성 보장 : 스토리지에 저장된 파일들을 정상적으로 사용할 수 있는 시간이 길어짐
  • 다양한 스토리지 클래스 제공
    • S3 Standard & Glacier 클래스
    • Standard 클래스는 범용적인 목적으로 사용하기 좋습니다. 데이터에 빠른 속도로 접근할 수 있고, 데이터 액세스 요청에 대한 처리 속도가 빠릅니다. 대신 보관 비용이 높게 발생하기 때문에 데이터를 오래 보관하는 목적으로는 효율적인 선택지가 아닙니다.
    • Glacier은 저장된 데이터에 액세스하는 속도는 느리지만, 데이터를 보관하는 비용이 매우 저렴하여 장기 보관에 목적에 효율적!
  • 정적 웹 호스팅이 가능
    • 정적 파일: 서버의 개입 없이 클라이언트에 제공될 수 있는 파일
    • 웹 호스팅: 서버의 한 공간을 빌려주어 웹 사이트의 배포, 운영이 가능하게 만들어주는 서비스
    • 버킷: 사용자들이 정적 웹 사이트를 배포할 수 있는 공간을 제공
    • ⇒ S3에서는 버킷이라는 저장 공간에 정적 파일을 업로드하고 버킷을 정적 웹 사이트 호스팅 용도로 구성하면 정적 웹 사이트 배포 가능!

이때, 파일은 키-값 페어 형식으로 데이터를 저장 → 파일의 값에는 실제 데이터 저장 (최대 크기 5TB), 파일의 키는 각각의 객체를 고유하게 만들어주는 식별자 역할

메타 데이터는 객체의 생성일, 크기, 유형과 같은 객체에 대한 정보가 담긴 데이터


Deploy Strategy

AWS 서비스 중 하나인 S3를 이용해서 사용자에게 client application을 제공할 수 있다. (EC2 인스턴스 사용할 필요 X)

빌드란?

  • 불필요한 데이터를 없애고, 여러 갈래로 퍼져있는 데이터들을 통합/압축하여 배포하기에 최적화된 상태를 만드는 것
  • 빌드 과정 진행 전과 비교했을 때, 데이터의 용량이 줄어들고, 웹 사이트의 로딩 속도가 빨라진다.

CloudFront를 통해 각지의 데이터 센터에 데이터를 분산시켜서 저장해 뒀다가 가까운 지역에서 데이터를 주는 방식으로 사용자에게 더 빠르게 서비스 제공 가능

사용자들이 Client Application을 통해 요청을 전달할 Server Application은 어떻게 배포?

DNS

S3, EC2를 이용해서 배포된 서비스는 IP 주소 혹은 AWS에서 제공하는 나의 서비스와는 전혀 상관 없는 긴 도메인 주소를 통해 접근하게 됨

이때, AWS에서 제공하는 Route 53서비스를 이용하면 직관적인 도메인 주소를 통해서 서비스에 접근 가능


백앤드 배포 실습

Create & Access EC2 Instance (EC2 인스턴스 연결)

  1. AWS 메뉴에서 EC2 서비스 검색 및 접속 → 인스턴스 시작 버튼 클릭
  2. 프리 티어 사용 가능 태그를 확인하여 과금 되지 않도록 유의! 용도에 맞게 AMI 선택 ( Ubuntu 인스턴스를 생성할 때에는 18버전 권장)

  1. 인스턴스 유형 선택 (생성하는 인스턴스의 CPU, RAM, 용량에 대한 선택 가능) → 검토 및 시작 버튼 클릭

  1. 생선되는 인스턴스를 원격으로 제어하기 위해서는 SSH 연결을 통한 원격 접속이 필요! (key 생성 및 다운로드)

🫥 SSH 프로토콜을 통한 원격접속과 키 페어 (.pem파일)

SSH(Secure Shell) Protocol은 PC와 PC가 인터넷과 같은 Public Network를 통해 보안상 안전하게 통신하기 위한 통신 규약입니다.
주고받는 데이터를 암호화해서 해당 키 페어를 가지지 않은 사람은 통신되는 데이터를 알아볼 수 없기 때문에 보안상 안전합니다.

EC2 프라이빗 키파일 (.pem파일)

인스턴스 생성 마지막 단계에서 다운로드 한 파일은 SSH 통신을 위한 키 페어 중 프라이빗 키가 기록된 파일입니다. (.pem 확장자를 가짐) ⇒ 관리에 유의 필요!

  1. EC2 Instance 생성
    → 많은 인스턴스가 있을 경우, 인스턴스 ID를 통해 구분 가능하지만, 인스턴스 name을 설정하여 구분을 보다 더 용이하게 가능

  2. EC2 Instance 연결
    연결 버튼 클릭→ 해당 3가지의 연결 방법들이 나옴

  • Session Manager 연결일 경우, 연결 버튼 클릭 후 터미널 창 나오면 터미널은 bash로 변경하여 진행 가능
$ bash
$ cd ~
  • SSH 클라이언트 연결일 경우, 다운로드 했던 키 페어 파일 (.pem)의 권한을 수정하기

chmod란?
Linux의 기본 명령어로 change mode의 축약어입니다.
4 (소유자=나) / 0 (그룹) / 0 (전체) ⇒ chmod 뒤 3개의 숫자의 의미
권한은 읽기(4), 쓰기(2), 실행(1) 세가지 숫자의 조합으로 권한 부여
ex) chmod 700 → 소유자에게 (4+2+1) 읽기, 쓰기, 사용 권한 부여함
ex) chmod 400 AWS_Deploy_Practice.pem = 나에게만 읽기 권한이 있도록 권한 부여

  • .pem의 권한을 수정하지 않은 경우, 권한이 너무 open되었다는 경고 메시지와 함께 접속이 거절됨

  • 이 때, chmod 400 [다운로드한 키 페어 파일(.pem)의 경로] 명령어를 입력하여 키 페어 파일(.pem)의 권한을 수정합니다.

  • 파일 권한을 설정했다면, ssh 명령어를 통해 인스턴스에 접속 가능

  • OR ssh 접속을 위한 주소는 인스턴스를 클릭하면 보이는 세부 정보 탭에서도 확인 가능

  1. EC2 Instance 연결

EC2 인스턴스 상에서 서버 실행

  1. 인스턴스에 개발 환경 구축하기
    EC2 Instance = 가상 PC 한 대를 임대 ⇒ 패키지 매니저가 관리하는 최신 상태로 업데이트 위한 명령어 실행
    nvm 사이트
$ sudo apt update //업데이트 진행

//nvm 설치 
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
//or
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
//nvm 설치가 정상적으로 끝났는지 확인
nvm --version

//node.js 설치
$ nvm install node

//npm 명령어가 정상적으로 입력되지 않는 상황 방지
$ sudo apt install npm
  1. git을 통해 서버 코드 클론 받기
    git clone을 위해 SSH 등록하기
//가상 EC2 인스턴스 터미널 창에서 키 페어 생성
ssh-keygen

//공개키 복사 한 뒤 github에서 ssh key 생성해주기
cat ~/.ssh/id_rsa.pub
// 홈 디렉토리로 이동
ubuntu@ip-172-31-41-164:~$ cd ~

// git clone (SSH code 복사해서 가져오기)
ubuntu@ip-172-31-41-164:~$ git clone https://github.com/codestates-seb/fe-sprint-practice-deploy.git
Cloning into 'fe-sprint-practice-deploy'...
...

//정상적으로 클론했는지 확인?
ls

//server 폴더로 이동한 뒤 npm install 
cd fe-sprint-practice-deploy/server/
  1. EC2 인스턴스에서 서버 실행하기
    sudo npm start 명령어로 서버 실행

    npm start 로 하면 에러가 뜨는 이유는, 관리자 권한이 필요하기 때문!

퍼블릭 IPv4 주소와 퍼블릭 IPv4 DNS는 형태만 다를 뿐 같은 주소입니다. 둘 중 어떤 주소를 사용하셔도 문제가 없습니다.

Security Group

보안그룹이란 AWS에서 임대한 인스턴스의 가상 방화벽입니다. (인바운드 & 아웃바운드에 대한 규칙 설정)

  • 인바운드 = 인스턴스로 들어가는 트래픽

    • EC2 인스턴스를 생성하면 기본적으로 SSH 접속을 위한 SSH 규칙만 생성되어 있음 (모든 트래픽이 막혀있음)
  • 아웃바운드 = 인스턴스에서 나가는 트래픽

    • EC2 인스턴스를 생성하면 기본적으로 나가는 모든 트래픽을 허용합니다.

보안 그룹 탭에서 인스턴스 탭에서 확인한 보안 그룹을 클릭하면 해당 보안 그룹의 규칙을 설정 가능

  • 인바운드 규칙 → 인바운드 규칙 편집 → 규칙 추가 / 규칙 제거 (허락하는 포트 범위 지정)
  • 보안 그룹은 소스에 따라 인바운드/아웃바운드 요청을 허락할 수도, 거절할 수도 있습니다.

PM2

SSH나 서비스 매니저로 프로세스를 따로 켜놓지 않아도 백그라운드에서 프로세스를 작동시킬 수 있는 프로세스 매니지먼트 도구입니다.

✪ 프로세스란?
컴퓨터 프로그램이 실행될 때 프로그램 실행에 필요한 내용이 컴퓨터 메모리에 적재된다는 의미, 즉 “실행 중인 프로그램”

  • 프로세스를 보는 방법 ⇒ 작업 관리자, 활성 상태 보기, “ps” 명령어
  • SSH에서 EC2 접속 후 강제 종료 시 생기는 일
    • 로컬의 ssh 프로세스가 강제 종료된다.
    • (ssh 프로세스가 종료되면) EC2상의 node 프로세스가 강제 종료된다.
    • (node 프로레스가 종료되면) node로 작동중인 웹 서버가 종료된다.

이 때, node 프로세스가 ssh 접속 여부와는 상관없이 늘 실행되게 하려면?
linux/unix 계열 운영체제에서는 “&”라는 키워드를 명령 뒤에 붙여 백그라운드 실행으로 만들어준다.
ex) PID(Process ID) = 29364 , fg = 실행중인 프로그램을 포어그라운드로 불러오기, kill = 백그라운드에서 실행 중인 프로세스 종료
node index.js & ⇒ output으로 PID가 나옴

상기 방법 대신 프로세스를 전문적으로 관리해주는 PM2

npm install pm2 -g

pm2 start [파일이름] //터미널을 종료해도 프로세스로 실행됨

//이외의 명령어들
"pm2 stop" 프로세스 중지
"pm2 restart"  프로세스 재시작
"pm2 ls"   프로세스 목록 보기
"pm2 log" 프로세스 로그 보기

pm2 start ⇒ error 발생 시, 관리자 권한으로 실행하지 못해서 생긴 문제일 가능성이 있음

이 때, authbind라는 패키지를 추가적으로 설치해야 함!

//authbind 패키지 설치 방법
sudo apt-get update
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown ubuntu /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80
authbind --deep pm2 update

authbind의 설치를 완료한 뒤, 'pm2 ls' 명령어를 통해 어떤 프로그램이 PM2의 프로세스 리스트에 등록되어 있는지 확인!

'app' 프로세스가 리스트에 있다면 'pm2 delete app.js' 명령어를 통해 프로세스를 삭제합니다. authbind 설치 전에 실행되고 있던 프로세스에는 관리자 권한을 부여하지 못하기 때문입니다.

PM2에 관리자 권한을 부여하기 위해서는 'authbind --deep' 명령어를 앞에 추가해야 합니다.

'authbind --deep pm2 start app.js' 명령어를 통해 서버를 다시 실행하면 이번에는 문제없이 작동할 것!


프론트앤드 배포 실습

S3 호스팅 튜토리얼 1 - 코드스테이츠에서 제공하는 내 버킷 사용하기

  1. AWS 콘솔에서 S3 검색
  2. 배포 과제 → client 속 .env 파일 작성
//.env
REACT_APP_API_UTL=http://ec2-13-125-236-22.ap-northeast-2.compute.amazonaws.com
  1. npm install, npm run build 스크립트 실행
  2. client/build 폴더 안의 모든 파일을 내 버킷에 업로드하기
  3. index.html의 객체URL로 배포된 모습 확인 가능

S3 호스팅 튜토리얼 2 - 내가 S3 직접 제어하기

🔅 정적 웹 사이트 호스팅 과정
1. 정적 웹 페이지 빌드
2. 버킷 생성 및 정적 웹 사이트 호스팅 용으로 구성
3. 빌드된 정적 웹 페이즈 업로드
4. 퍼블릭 액세스 차단 해제 및 정책 생성

1. 정적 웹 페이지 빌드

빌드 전, 환경 변수를 담은 .env 파일 확인하기 (.env 파일의 파일명이 제대로 적혀있는지, 환경 변수에 담긴 서버의 주소는 문제가 없는지 확인하기. 요청을 보내는 서버의 주소를 환경 변수에 담을 때는 필히 'http://' 나 'https://'를 포함해야 함)

client directory로 이동 후 npm run build 명령어 입력 ⇒ “Compiled Successfully” 문구 나오면 끝!

2. 버킷 생성 및 정적 웹 사이트 호스팅 용으로 구성

AWS 콜솔에서 S3 검색 후 메인 화면 접속

“버킷 만들기” 버튼 클릭 → “일반 구성” 옵션 → 각 리전에서 고유한 버킷 이름 작성 → “버킷 만들기” 버튼 클릭

만들어진 버킷 클릭 → “속성” 메뉴 이동 → 정적 웹 사이트 호스팅 “편집” → “활성화” 옵션 선택 → (optional) 혹시 모를 오류 발생 시 메인 페이지를 반환하기 위해 인덱스 문서 “index.html” 기입 후 “저장” → 앤드포인트 생성

에러 메세지 확인 (403 Forbidden: 버킷에 정적 웹 페이지 파일을 아직 업로드하지 않았고, 퍼블릭 액세스 설정 변경과 정책 생성을 하지 않았기 때문)

3. 빌드된 정적 웹 페이즈 업로드

“객체” 메뉴로 이동 → client/build 안의 파일들 모두 드래그 하여 업로드, NOT build 폴더 그 자체 (항상 drag&drop 형식으로!)

4. 퍼블릭 액세스 차단 해제 및 정책 생성

S3의 생성한 버킷 클릭 → “권한” 메뉴로 이동 → '퍼블릭 액세스 차단(버킷 설정)’ “편집” 버큰 클릭 → '모든 퍼블릭 액세스 차단' 옵션의 체크 박스를 해제 → “변경 사항 저장” 버튼 클릭

”권한” 메뉴 → “버킷 정책” 옵션에서 “편집” 버튼 클릭 → “정책 생성기” 버튼 클릭 →

'Select Type of Policy' 옵션에서는 'S3 Bucket Policy'를 선택!

'Principal' 옵션은 권한을 적용할 사용자를 정합니다. 우리는 모두에게 공개할 것이므로 *(별표)를 입력!

'Actions' 옵션에서는 'GetObject'를 선택합니다. GetObject 옵션을 선택하게 되면, 버킷에 접근하는 모든 사용자가 버킷 내에 저장된 객체 데이터를 읽을 수 있게 됩니다. 버킷을 웹 사이트 용도로 구성할 때 선택해 주시면 좋습니다.

→ 'Generate Policy' 버튼을 누르면 정책이 생성됩니다 → 생성된 JSON 형태의 정책 복사 후 “close”→ 버킷 정책 편집 페이지로 돌아가서 생성한 버킷 정책을 붙여 넣기

“속성” 메뉴에서 앤드 포인트 주소를 클릭하여 테스트 진행!

profile
[많을 (다) 빛날 (빈)] 빛이나는 사람이 되고 싶습니다

0개의 댓글