Deploy

katsukichi·2021년 4월 21일
1

CodeStates_IM

목록 보기
48/48

Deploy 란.

배포 라는 뜻이다.

배포 즉 남에게 준다.

내가 웹사이트(웹페이지가 모인것)를 남에게 주려면

그걸 무언가 공용네트워크에 올려야할것이다.

쉽게생각하면 내가 홈클라우드 시스템을 구현하려고했을때

우리집 공유기 ip 를주고 또 그때 파일업로드,다운로드등 보안관려 규약때문에 https를 꼭 거쳐야했으므로

ngrok라는 터널링을 통해서 ngrok 고유의 주소로 접속이 가능했다.

서버가 꺼지지않는이상 그 무작위주소? 같은느낌인데 해쉬로구성된 그 주소는 한번 저장해두고 주로 썻던거같다. 물론 인증절차는 없엇으므로 보안상 많이 ㅇ위험하긴 했엇지만..

그래서 결론은 집에서 공유기에 포트포워딩 셋팅하고 막 별의별짓 다하고

컴퓨터 켜놓는거 까지 고려해서

고생할것이 아니라면..

aws라는 클라우드 컴퓨팅을 사용해서

aws초초 국가기업에서 제공하는 free-tier 무료로 써서

제일 많이 쓰는게 EC2 이고, 제공받으면

하나의 인스턴스라고 표현하는데(aws에서는 인스턴스라고 표현함)

할당받는다.

그래서 ssh 포트만 열려있는 컴퓨터를 하나 준다고생각하면 좋다. 물론 셋팅,보안등등 설정은 aws안에서 다 해줄수있다.

이때 인스턴스 하나 생성시 보안키를 준다.

EC2

대표적인 클라우드 컴퓨팅으로 음..

보통은 리눅스 os하나 올려서 (우분투),

떡하니 제공해준다. 물론,

진짜 aws에서 컴퓨터한대를 주는것아니고,

서버돌아가는 서버실에서 하나의 가상환경을 만들어서 나에게 제공해줄 뿐이다.

주로 서버를 돌리는데 사용된다고 보면된다.

나는 실제로 이곳에서 서버,그리고 정적클라이언트 배포까지

하나의 시스템으로 다 구현했었어서,

flask에서 html,css,js 덩어리 내려주는거까지 얼추 했엇다.

그래서 이거하나로 다 되는줄 알았고 이게 맞는거라고 생각했는데. 밑에서 몇가지 더 배우고나니, 그게 정답은 아니였구나 싶었다,

EC2 인스턴스 연결 flow

  1. 인스턴스 생성을하고

  2. Ubuntu server LTS SSD Volume 뭐.. 프리티어 확인까지. ( 이거는 그때그때 내가 어떤 환경으로 돌릴지에 따라서 다를수있다. 만약 윈,맥,우분투 까지 해서 다 잘 돌아가게 하려면 도커는 필수일것이다. )

  3. 마찬가지로 cpu,메모리 선택하는것도 프리티어로 하겟지만, 나중에 내가 직접,혹은 회사에서는 그 규모에 맞는 티어를 사용하므로 변경될수있다.

  4. 키페어 생성, 중요하므로 잘 보관하자.

  5. ssh통신이 유일하게 열린 포트로 인스턴스가 설정되어 나온다.

  6. 그래서 제공받은(4번에서)키로 ssh를 요청할수있다.(원격 제어) -키파일은 .pem이다.

  7. 인스턴스ID 로 인스턴스를 구분할수있고,이름설정이 가능하다.

  8. 인스턴스들 정보창에 상단에 ㅇ연결을 누르면 ssh클라이언트 탭이있다.

  9. 필요한경우 chmod 400 키페어파일이름.pem 으로 (sudo해야할것임) 권한수정을 해준다. 이것은 관리자만 읽을수 있음. 이라는 권한이다. (읽기만 가능함)

  10. 이후 밑에 ssh -i "키페어파일이름.pem" ubuntu@ec2.....(생략) <저기에 우분투도 사실 처음에 생성당시 이름을 정해줄수있는데 기본값이 ubuntu인것이다.

연결에 성공하면

기존에 터미널에서 보여지던 내정보+현재디렉토리를 나타내는 것(?)이 ubuntu@ip .... (생략) : ~$ 으로 바껴있는것을 볼수 있다.

기본적으로 sudo apt update 로 apt를 최신상태로 유지해준다.

여기까지가 연결단계 flow이다.


EC2에서 서버실행까지 flow

  1. 파일을 받아온다. 2가지방법이있다.
    1-1. 파일 직접주기 - 까다로움 ftp포트 열어주는 셋팅을 aws에서 해줘야하고, ftp연결프로그램 (나는 cyberduck?썻엇음) 거기에 뭔가 변화가 있다면, 또 파일로 제어해야한다는점? 정도인데.. 뭐가 더 편하지는 본인나름일꺼같다.
    1-2. git clone하기 - 사실 ssh통신자체가 거부감이 든다면, 일단 깃클론이 제일 쉽다.

  2. 이후 npm install / npm start 를 해주면

  3. 에러가빰, 하고나온다. 이유는 80포트가 안열려있어서. (보안그룹설정이 안되어있어서, 인바운드 들어오는 설정에서 포트설정이 안되어있어서)

  4. 인스턴스 속성을보면 보안그룹 이름이 존재하는데 기억해두었다가.

  5. aws인스턴스 왼쪽에 사이드바밑에 네트워크 및 보안 메뉴에 보안그룹 메뉴로 들어간다.

  6. 거기에 보안그룹 아까 4번에서 봤던 녀석이 있는데 거기에 인바운드 규칙에 -> 인바운드 규칙 편집으로 들어간다.

  7. 규칙추가로 http를 고르면 자동으로 tcp프로토콜에 80포트가 추가되고 소스는 위치무관으로해주면 된다. (모든 IP에 대해서 접속 허용) -> 규칙저장

advanced -> 나중에 https로 열고싶을때에 다시 설정해줄것을 감안해야한다. (그때는 https는 기본 포트번호가 다르기때문이다.) 443이던가

PM2 프로세스 매니지먼트

백그라운드에서 돌리는거 편하게 하려고쓰는 툴이다.

ubuntu aws환경에서 설치해주면되고, 이하생략.

확실한것은 sudo 신경써야한다.

둘째는 편하다. 진짜편하다.

S3

SSS의 줄임으로 뭐더라.
Simple Storage Service
의 약자이다.

즉 스토리지, 저장공간,

근데 그렇다 db를 의미하는 것은아니고,

하나의 정적클라이언트를 내려주기 좋은 서비스이다.

그래서 리액트앱같은경우 빌드한 폴더를 이곳에 주고,

정적웹사이트옵션을 활성하하고 보안조건 몇개 풀면

s3만으로 프론트엔드가 내려간다. (구성된다)

S3 정적 웹페이지 호스팅 flow

4가지 단계로 구분할수있다.


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

  1. 환경변수파일은 꼭 잘 해두도록 하자, npm run build로 빌드 과정을 거치면 build디렉토리가 생성되고 그안에 정적으로 파일이 생성된다.

  2. S3 메인화면에 가서 "버킷 만들기" 를하고 일반구성에 리전에따라서 버킷이름은 고유해야한다.

  3. 버킷을 만들고나면 "속성"탭에 최하단에 정적 웹사이트 호스팅 활성화로 편집해준다. 이때 index.html로 보통해준다 (아마 CRA로 생성한 정적파일이 그렇다)

  4. 버킷의 객체 탭에가서 업로드를 한다.이때 드래그엔드롭을쓰면 좀더 편한거같다. 빌드 폴더안에 내용을 전부 드래그앤 드롭하면된다.

  5. 이후 버킷의 권한 편집을 할것이고, 퍼블릭 액세스 차단부분을 다 체크해제해서 퍼블릭 액세스를 승인하게끔 한다.

  6. 변경사항을 저장하고. 정책을 생성할것이다.

  7. 정책생성기를 누르면 새로운 페이지가 열리며, 여기서는 편하게 작성하고 코드를 복사해서 정책부분에 붙여넣는식으로하게된다.
    7-1. Select Type of Policy는 S3 Bucket Policy로 선택하고
    step2에 add statements에서
    Principal : *
    Actions : GetObject // 선택하면 1 Action(s) Selected
    Amazon Resource Name(ARN) : arn:aws:s3:::<버킷이름>/* //별표까지 잊지말자.
    7-2. add statement하고 generate하면 코드를 주는데 긁어서 복사후 창종료

  8. 버킷정채부분에 붙여넣기하고 변경사항 저장

  9. 속성탭 최하단에 정적 웹사이트 호스팅부분-> 버킷 웹사이트 엔드포인트로 접속해보면 클라이언트가 접속되는것을 볼수있다.

RDS

이름에서 딱봐도 알꺼같은게 relation... ㅇㅋ

대충 데이터베이스 도와주는 시스템이다.

기본적으로 mysql등 다른 관계데이터베이스 언어를 지원하고

나는 Mysql을 배웠으니 mysql로 해볼것이며,

장점으로는 데이터베이스가 자동 확장된다. (이게 제일 큰 장점일꺼같다)

내가 서버를 운영하다가 (그안에서 서버의 로컬환경에 db를 설치하고 관리하고 있다면) 일단 여기서 서버에 부하가 장난아닐것이다. 서버로써의 역할도 하고, db로써의 역할도 할테니,

하지만 rds는 그것을 분리해서 쓸 뿐만아니라,

데이터베이스의 용량이 무한정으로 자동으로 늘어나기 때문에(꽉찰것이라면..) 확장의 걱정이 좀 덜하다. 그리고 데이터 안정성을 무지 높은 확률로 보장한다.

1년의 7시간? 정도만 문제된다고 보면된다던가.. 99.999퍼? 퍼센트였나 그렇다.

RDS 인스턴스 생성/연결 flow

  1. RDS 메인화면

  2. 사이드바 "데이터베이스"

  3. 데이터베이스 생성

  4. 언어선택(Mysql) , 프리티어, 디비클러스터 식별자(즉, 이름), 마스터 사용자이름: 보통 admin / 마스터 암호 /

  5. 퍼블릭 액세스가능 "예" 선택

  6. VPC보안그룹은 default로 두고 추가연결구성을 눌러서 데이터베이스포트를 13306으로 한다. 기본은 3306이지만 포트번호 노출을 방지목적으로 13306을 사용한다.

  7. 추가구성에 데이터베이스 옵션으로 초기데이터베이스 이름을 줄수있다. "test" 라고하자.

  8. 생성되는데 시간이좀 걸린다 약 5~10분사이

  9. 엔드포인트를 복사해서 mysql -u <마스터이름:admin> --host <엔드포인트주소:복붙하고> -ㅖ 13306(포트번호) -p // 정리하면
    mysql -u admin --host (...생략).com -P 13306 -p 를치면 로그인이 뜬다.

  10. 마찬가지로 sudo로 해주면 sudo요청에따른 비밀번호 + admin 비밀번호 두번 입력(한번 sudo해준상태면 바로 admin비밀번호를 요구할수있다.)이때 Enter password라고 나오면 admin(DB의 마스터) 비밀번호를 넣어보자.

  11. 아마 문제를 겪을것이다. 그렇다면

https://velog.io/@yhe228/AWSRDS-DB-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%97%B0%EA%B2%B0-%EC%98%A4%EB%A5%98-ERROR-2003-HY000-Cant-connect-to-MySQL-server

이것을 참조.

  1. AWS의 VPC 콘솔에서 보안그룹을 찾아 클릭
  2. 해당 DB 인스턴스의 보안그룹을 찾아 클릭한다
  3. 하단의 인바운드 규칙 편집 클릭
  4. 소스부분을 무관으로 변경
  5. 다시 터미널로 돌아가 명령어 입력

Route 53

도메인 을 도와주는 aws의 서비스이다.

긴말은 안하겠다. 그냥 aws내부에서 가비아처럼 도와주는거다.

무료 도메인도 있다고함.

프리넘 ?

freenom

HTTPS로 배포

https://velog.io/@seongkyun/AWS-S3-CloudFront-Route53%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A0%95%EC%A0%81-%ED%98%B8%EC%8A%A4%ED%8C%85

https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html

Docker 도커

https://youtu.be/hWPv9LMlme8

https://toycrane.medium.com/docker%EB%8A%94-%EB%8F%84%EB%8C%80%EC%B2%B4-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-e95b0aa18cf6

AWS CLI

aws cli 를 통해서 대부분의 aws서비스를 cli로 제어할수있다.

CDN

aws에서는 클라우드 프론트가 도와준다.

Content Delivery Network

가끔 cdn 이라는것을 본적이있을것이다.

이미지,동영상 등 요청에의한 파일을 긁다보면 저런것을보거나 혹은

리다이렉트되어서 영상을볼때도 cdn으로시작하는 주소를 본적이있다.

cdn은 쉽개생각하면 세계 곳곳에 분포하는 데이터센터에 콘텐츠를 저장해두고 쓰는것이다.

예로 많이드는것이

넷플릿스이다.

넷플릭스 본사는 미국에있다.

우리나라에서 넷플릭스의 최신자료들을 보려면 죄다 넷플릭스 본사에서 받아오는것일까? 일단멀고, 넷플릭스 본사 서버에 과부화가 걸릴것이다.

그래서 cdn이 그것을 도와준다.

일단 아시아권? 그건몰르겟고 가까운 데이터센터에 최신 넷플릭스 데이터가 들어있다면, 우리의 요청은 멀리있는 넷플릭스 서버까지 갈 필요가없다.

가까운 캐시서버가 우선순위를 가진다.

캐싱이라는 개념도 나오긴하는데 넘어가겠다..

쉽개생각하면 쟁여놓는것.

또쓸꺼같아서 머금고있는것.

브라우저에서도 알개보르게 캐싱을 엄청한다.

임시파일들이 그렇다.

그걸 캐싱이라고할수있다.

브라우저가 매번 브라우저의 정적파일들을 다운해온다면 매번 그 요청을 서버가 부담해야한다.

cdn에서 다룰수있는 컨텐츠의 종류

  1. 정적 컨텐츠
  2. 동적 컨텐츠

정적컨텐츠는 html,동영상등 변화가 거의없는 컨텐츠 + 뉴스기사등 개인화 되지않은 대중적인 컨텐츠에 해당한다.

동적컨텐츠는 성격이 전혀다르다.
위치,IP주소등.. 접근할때마다 내용이 달라지는 컨텐츠이다.
또한 카드번호,전화번호등 개인화된 정보 관련 컨텐츠가해당된다.

CDN에 저장되어 있는 콘텐츠 들은 내용이 바뀔때마다, CDN 서버들에도 변경내용이 전파되어야 한다.

CDN의 이점

  1. DDos공격에 대해 어느정도의 대응이 가능
  2. 로딩속도증가로 인한 UX 향상
  3. 트래픽 분산으로 인한 트래픽관련 비용 절감

CDN 방식 2가지

  1. Scattered(흩뿌려진)방식 - 최대한 빠른 응답속도를 목표 따라서 세계 곳곳에 비교적 낮은 성능의 데이터 센터를 구성하고 연결해두야한다.
    1-1. 세계 곳곳에 최대한 많은 캐시서버를 제공
    1-2. 낮은 수용량의 데이터 센터 및 캐시 서버
    1-3. 매우 높은 관리비용 및 사용자 요금
    1-4. 연결 수요가 적은 지역 대상으로 적절한 방식

  2. Consolidated(굳어진,강화된)방식 - 낮은성능 대신 고성능의 데이터센터들을 운용한다, 비록 응답시간이 증가하지만, 데이터센터의 수가 줄어듦으로 데이터센터의 관리및 유지비용을 절감
    2-1. 다수의 고성능 서버로 통합하여 운용하는방식
    2-2. 응답시간증가, 하지만 관리 및 유지 비용이 낮아짐
    2-3. 연결 수요가 많은 지역 대상으로 적절한 방식

과거스타일과 현재스타일

과거(초기)에는 응답속도에 중접을 두엇다

따라서 Scattered방식, 정적컨텐츠 CDN이 주류였다.

그렇기때문에 응답속도는 매우높았다. 사용자에게 전가되는비용이 너무비쌋다.

하지만 점차 동적 컨텐츠를 지원하고

데이터센터를 통합하기 시작해서

관리하는 데이터센터의 수가 줄어들고 사용자에게 전가되는 비용이 줄어들고있다.

또한 DDoS공격들 사이버공격에 대응하고 어느상황에서도 콘텐츠를 제공할수있도록 보안과 안정성에 집중하고있다.

DNS

Domain Name System이다.

www.naver.com

Root Domain : naver
Top Level Domain : .com
Sub Domain : www

탑레벨 도메인은 .com , .kr, .net 이런것인데
kr같은 국가코드를 사용하는경우, co,ac와 같은 2단계 도메인으로 사용되기도 한다.

서브도메인은 일반적으로 www, m

Domain Name Server(zone)

Root 네임 서버

TLD 네임 서버

권한있는 네임 서버

잘모르겠다.

DNS Lookup

주소를 입력하면 DNS Lookup이라는 과정이 발생한다.

도메인 레코즈... 어렵다.. 일단 너무 거시적이다..

profile
front-back / end developer / Let's be an adaptable person

2개의 댓글

comment-user-thumbnail
2022년 3월 28일

Penalty Kick Online 버킷을 만들고나면 "속성"탭에 최하단에 정적 웹사이트 호스팅 활성화로 편집해준다. 이때 index.html로 보통해준다 (아마 CRA로 생성한 정적파일이 그렇다)

답글 달기
comment-user-thumbnail
2022년 4월 4일

느려!

답글 달기