09
16

안그래도 쫄아서 빨리 껐읍니다.

1. 문제의 발단

  • 만드는 것만큼 배포도 중요하다.
  • 내 불쌍한 컴퓨터로 서버를 돌리는 것은 너무하다.
  • 그래서 우리는 돈을 주고 안 보이는 서버를 사서 사용할 수 있다!

2. AWS

  • Amazon Web Services를 줄인 것이다.
  • 개인의 온 프레미스 환경(직접 컴퓨터에 서버를 열어 관리함)의 서버는 많은 응답을 처리하기 위해 수많은 비용과 인력이 엄청나게 들어간다.
  • 그것을 대신 클라우드 서비스를 이용해 대신 가상의 컴퓨터로 대신 서버를 관리해주는 서비스이다.

3. 클라우드 서비스의 종류

  1. SaaS(Software as a Service): 네트워크, 하드웨어, 운영체제, 플랫폼/데이터베이스, 어플리케이션을 제공함
  2. PaaS(Platform as a Service): 네트워크, 하드웨어, 운영체제, 플렛폼/데이터 베이스를 제공함
  3. IaaS(Infrastructure as a Service): 네트워크, 하드웨어를 제공함

4. AWS가 하는 서비스

 EC2(Elastic Compute Cloud)

  • 가상의 컴퓨터를 제공한다.
  • 나처럼 우분투와 씨름하지 않고 클릭 몇 번으로 OS가 완벽하게 돌아가는 컴퓨터를 사용할 수 있게 된다.

 RDS(Relational Database Service)

  • 데이터베이스를 내가 관리할 필요 없이 대신 만들고 관리해준다.
  • 규모를 확장시키기도 편하고, 내구성도 완벽하며, 데이터도 안전하다. 백업도 쉽게 가능하다.

S3(Simple Storage Service)

  • 우리가 자주 사용하는 네이버 클라우드, OneDrive같은 클라우드 서비스라고 생각하면 편하다.
  • 역시나 데이터를 무한하게 저장할 수 있으며, 매우 안전하게 보관된다.
  • AWS는 이러한 서비스를 제공하기 위해서 전 세계에 각국, 각 도시에 진짜 서버를 가지고 있다. 그 장소를 '리전(Region)'이라고 하고, 그렇기 때문에 이러한 서비스를 전 세계인에게 제공할 수 있게 된다.

5. 그래서 어떻게 배포할까요?

  1. EC2를 이용해 인스턴스를 생성한다.
    • '프리티어 사용가능' 이라고 적힌 인스턴스는 돈이 들지 않는다. 연습용으로 사용하자.
    • 인스턴스 유형(CPU나 램 등)도 프리티어가 있는 것을 선택하자.
    • 원격으로 인스턴스에 접속해서 조작할 것이기 때문에 'Key'를 생성하게 된다. 'SSH 프로토콜'로 '.pem' 확장자인 파일을 이용해 조작 권한을 얻을 수 있다.
  2. EC2로 생성한 인스턴스를 로컬에 연결한다.
    • 아까 만든 인스턴스를 클릭하고 우측 상단에 '연결'을 눌러 준비한다.
    • SSH접속을 하기 위해 pem키의 권한을 수정한다. 'chmod 400' 명령어(복사할 수 있게 되어 있다)로 소유자 만이 읽기 권한 만을 소유자에게 부여한다.
    • ssh 명령어(ssh -i"키 이름"사용자 이름(OS 이름이 될 것이다)@가상 PC 주소)로 가상 PC와 로컬 상황이 연결되어서 사용할 수 있게 되었다.
  3. EC2로 생성하고 연결한 가상 PC를 세팅한다.
    • 가상 PC는 방금 포맷하고 나온 컴퓨터 마냥 깨끗하다. nvm과 node.js를 설치해 주자.
    • VS Code를 다운로드한다던지 하는 이상한 짓은 하지 말자. 그래픽은 지원해 주지 않는다. 깔리기는 한다. 하지만 볼 수 없을 것이다. 볼 수 있는 부분은 CLI상황인 '터미널' 뿐이다.
    • 서버도 실행시켜 보자. 물론, 접속은 아직 안된다.
  4. EC2로 생성하고 연결한 가상 PC의 보안 그룹(Security Group)의 설정을 바꿔준다.
    • 들어오는 트래픽은 '인바운드', 나가는 트래픽은 '아웃바운드'라고 한다.
    • 아웃바운드 규칙은 상관없다. 나가는 트래픽을 막을 필요가 없다. 이미 모든 규칙이 허용되고 있을 것이다.
    • 인바운드 규칙이 중요하다. 그러므로 권한을 수정해서 우리의 요청을 받아 줄 수 있게 만들자.
    • 인스턴스에 설정되어 있는 보안 그룹으로 가서 인바운드 규칙을 추가한다. 설정한 포드 번호를 설정해 주고 어떤 프로토콜, 소스(IP)를 허용할 것인지를 설정한다.
    • 혼자서 연습할 때는 모든 접속을 허용하면 된다. 나 아니면 들어올 사람이 없다.
    • 원래 각각 클라이언트, 서버, 데이터 베이스가 사용하는 지정된 포트번호가 있다. 예를들어, http는 80번, https는 443번, 데이터 베이스는 3306번이다. 이러한 몇가지 지정된 포트번호가 있기 때문에 이러한 포트 번호를 설정해 주면 될 것이다.
  5. PM2를 설치해 백그라운드에서 서버가 실행된 상태로 존재하게 만든다.
    •  관리자 권한으로 실행시켜야 한다. 그러기 위해서 'authbind'를 설치해야 한다.
    • 만약, 그전에 서버를 켜서 프로세스가 이미 존 제한 다면 'pm2 ls'로 확인하고 있다면 지워라. authbind가 설치되고 난 후에 다시 authbind를 이용해 서버를 실행시켜야 관리자 권한이 있는 프로세스가 생긴다.
  6. S3를 이용해 호스팅 한다.
    • 정적 웹 페이지를 빌드(build)한다.
    • 내 로컬 상황에서 .env파일을 열어서 환경변수를 수정한다. 꼭 http://나 https://를 포함한 주소 'ec2로 생성한 퍼블릭 IPv4 DNS 주소'를 적어줘야 하고, 마지막에 '/'는 넣어서는 안 된다.
    • 이후 npm run build 명령어로 build폴더를 만들어 놓는다.
    • S3에서 버킷을 만들어 정적 웹 사이트의 호스팅을 활성화한다. 이때, '인덱스 문서'와 '오류 문서'에 index.html을 입력해 준다. 안 하면 접속 안된다.
    • 만든 버킷에 객체를 업로드한다. 아까 만들어 놓은 build 폴더 안에 있는 내용물들을 업로드하면 된다. build 폴더 자체를 업로드 하면 안 된다. 안의 내용물만 업로드한다.
    • 권한 탭에서 퍼블릭 액세스 차단을 전부 푼다. 권한도 생성기로 만들어서 알맞게 넣어준다.
  7. RDS로 DB 생성해서 서버와 연결한다.
    • RDS로 가서 데이터베이스를 생성한다.
    • 제발 마스터 암호 좀 쉬운 걸로 해라. 계속 틀리지 말고. 아직은 연습 단계이다.
    • 이후, 로컬 상황에서 알맞은 클라이언트(나는 mySql을 이용했다)로 DB 인스턴스에 접속한다.
    • 만약, 명령어를 입력하고 한참 아무런 반응이 없는 상황이 나온다면, 보안 그룹을 확인하자. 이것도 마찬가지 아까 인바운드 설정을 바꿔준 보안 그룹의 설정으로 바꿔줘야 한다. 아니면 한참 이후 오류 메시지를 볼 수 있다.
    • 이것도 위의 정해진 포트 번호라면 3306을 열어 놔야 할 것이다.
    • 데이터베이스에 연결된 후 만든 database를 확인한다.
  8. EC2로 만든 가상 컴퓨터에 환경변수 설정을 한다.
    • 먼저 서버 끄고 시작한다.
    • nano나 vim으로 직접 수정한다.
    • 좀 전에 RDS로 만든 데이터 베이스를 보면서 HOST에 데이터 베이스의 엔드포인트, USER, PASSWORD, PORT까지 알 맞게 설정한다.

6. HTTPS 설정 하기

  1. 도메인을 만든다. 잘 찾아보면 무료로 도메인을 만들어 주는 곳도 있다! 아니면 과금해 보는 것도 좋은 경험이 되지 않을까?
  2. S3부분(작은 번호 6번)을 보고 다시 버킷을 만들어 준다. 이 부분은 거의 똑같다.
    • 빌드할 때 굳이 build 폴더를 삭제하고 하지 않아도 된다. npm run build 하면 매번 build 폴더는 삭제되고 다시 만들어진다.
    • 빌드를 새롭게 했다면 당연히 서버도 다시 껐다 켜줘야 한다.
  3. Route53으로 DNS를 설정한다.
    • 네임 서버 리스트를 도메인을 받은 사이트에 등록한다.
    • 라우팅 설정할 때 꼭 리전을 '미국 동부(버지니아 북부)'로 해야 한다.
    • CloudFront의 도메인 주소를 확인해서 잘 넣고, 사용할 주소 개수만큼 레코드를 정의한다.
  4. AWS Certificatuon을 이용해 인증서를 받아 적용한다.
    • AWS Certificatuon에 접속하자마자 리전을 '미국 동부(버지니아 북부)'로 바꿔준다. 그 이후 인증서를 요청해야 한다.
    • 인증은 꽤 걸린다. 가끔 새로고침을 누르면서 차분하게 기다린다. 다 발급이 완료된 후에 다음 단계를 할 수 있다.
  5. 이제 S3에서 지원하지 않는 https 형식의 배포를 위해 CloudFront를 이용한다.
    • S3에서 받아온 URL로 스택을 생성하고 '원본 도메인 이름'에 방금 만든 버킷의 정적 웹사이트 주소를 넣어준다.
    • CNAME에 받아온 도메인 주소들을 넣어준다.
    • 위에서 발급한 SSL 인증서를 선택해 준다.
    • React로 프로젝트를 만들었다면 에러 페이지 설정도 해준다. 404, 403 두 번 에러 페이지를 설정해 준다.
COMMENT