본문 바로가기

블록체인_9기/💚 Node.js

41강_230531_Node.js(호스팅, 클라우드 서비스 모델(Iaas, Paas, SaaS), AWS 배포)

728x90

 

 

 

 


호스팅(Hosting)

  • 웹 서비스를 개발하면 배포를 통해서 사용자에게 개발한 소프트웨어를 제공해야 한다.
  • 배포를 하기 위해서는 제 3자기 접속할 수 있는 서버 컴퓨터가 필요하다.
  • 서버 컴퓨터는 24시간 내내 켜져있어야 하는데 이 과정을 수행할 수 있는 서버 컴퓨터를 대여해주는 호스팅 업체를 통해 배포를 진행하고자 한다.

 

출처: https://velog.io/@dreamjh/%ED%98%B8%EC%8A%A4%ED%8C%85%EC%9D%B4%EB%9E%80

 

 

 


클라우드 서비스 모델

On-Premises

  • 소프트웨어, 하드웨어 등 자체 설비를 보유하고 운영한다.

SaaS

  • Software as a Service
  • 프로그램을 설치할 필요 없이 웹 브라우저 만으로 소프트웨어의 기능을 사용할 수 있는 서비스 모델이다.
  • 모든 애플리케이션을 제공업체가 관리하며 웹 브라우저를 통해 제공된다.
  • 예시) Dropbox, Salesforce, Google Apps 등

PaaS

  • Platform as a Service
  • 애플리케이션 개발 환경 및 서비스 제공 환경, 즉 플랫폼을 제공하는 서비스이다.
  • 별도의 개발 플랫폼을 구축할 필요 없이 서비스에서 제공하는 인터페이스를 이용하면 애플리케이션 개발이 가능하다.
  • 주로 개발자와 프로그래머에게 유용한 모델이며, 사용자는 자체 애플리케이션을 개발 및 실행, 관리할 수 있으며 이 과정에서 일반적으로 이러한 프로세스와 관련된 인프라 또는 플랫폼을 구축하고 유지, 관리할 필요가 없다.
  • 예시)  AWS Elastic Beanstalk, Heroku

IaaS

  • Infrastructure as a Service
  • 서버, 스토리지, 데이터베이스 등 서비스 구축에 필요한 컴퓨팅 자원을 가상화하여 사용자에게 제공하는 서비스이다.
  • 사용자는 운영체제 및 데이터, 애플리케이션, 미들웨어 및 런타임을 담당하고 제공업체는 사용자가 필요로하는 네트워크, 서버, 가상화 및 스토리지의 관리와 엑세스를 담당한다.
  • 필요한 구성 요소만 구매하고 필요에따라 확장 및 축소할 수 있는 유연성을 제공한다.
  • 간접비가 낮고 유지관리 비용이 들지 않는 경제적인 옵션이다.
  • 개발 및 테스트 환경의 구축 및 제거가 빠르고 유연하다는 장점을 가지고 있다.
  • 사용자는 개발 환경에서 구축해야 할 인프라만을 사용하고 필요에따라 확장 또는 축소하며 개발이 완료되면 사용을 중단하고 사용량에 대한 비용만 지불한다.

 

 

 


AWS를 이용한 웹 서버 배포하기

AWS?

  • Amazon Web Services
  • 아마존에서 제공하는 클라우드 서비스로, 네트워킹을 기반으로 가상 컴퓨터와 스토리지, 네트워크 인프라 등의 다양한 서비스를 제공한다.
  • 서버의 인스턴스를 생성하여 배포를 할 수 있는 사이트

 

Ⅰ. AWS에서 인스턴스 생성

1. AWS 에서 로그인을 진행 한 후, 메인 페이지에서 EC2를 클릭한다.

2. 인스턴스를 생성하기 전, 우측 상단에 리전을 확인한다. 서버 컴퓨터가 가깝도록 설정해야 한다.

3. 좌측 카테고리에서 "인스턴스"를 선택한 후, 우측 상단에 "인스턴스 시작"을 클릭하여 인스턴스를 생성한다.

4. 인스턴스 생성_인스턴스의 이름을 설정하고, 인스턴스의 소프트웨어를 설정한다.

  • 해당 인스턴스는 오늘 수업으로 들은 내용을 복습하기 위한 과정으로 'test'라고 작성하였다.

  • 지금 사용할 OS는 Ubuntu 프리티어로 사용할 예정이다.
    • 프리티어로 사용해야 무료로 사용이 가능하다.

5. 인스턴스 생성_"키페어 생성" 버튼을 클릭하고 키 페어의 이름을 입력하여 생성한다.

  • "새 키 페어 생성"버튼을 클릭한다.

  • 키 페어 이름을 작성하고 유형, 파일 형식은 해당 디폴트 값으로 둔 후,하단의 "키 페어 생성"을 클릭하여 키를 생성한다.
    • 키 페어는 절대 잃어버려도, 깃 허브에 올리면 안된다. 보관을 잘 해야하는 파일이다.
      • 다른 사람에게 전달해야 하는 상황이 발생할 경우, 저장매체(USB 등)를 사용하
    • 키를 생성하면 해당 키가 자동으로 다운로드 된다. 해당 키는 인스턴스와 연결할 폴더에 옮길 예정이다.

5. 인스턴스 생성_네크워크 설정 탭에서 상단의 "편집"버튼을 클릭해서 "보안 그룹 규칙 추가"를 진행한 후 맨 밑에 "인스턴스 시작"버튼을 클릭하여 인스턴스를 생성, 시한다.

  • 디폴트 값으로 SSH가 설정되어 있다. 해당 값은 건드리지 말고 HTTP, HTTPS, MYSQL을 추가하도록 하자
  • 각 보안 그룹별로 원본(접두사)에는 "0.0.0.0/0" 을 선택한다.

👩‍🏫 0.0.0.0/0 

  • 모든 IPv4 주소 지정 방법
  • 라우팅 테이블에서 사용되는 경우 기본 게이트웨이를 식별하는데 0.0.0.0에 대한 경로가 기본 경로
  • 컴퓨터, 모뎀 및 네트워크 카드에서 수신 대기 중임을 의미
  • 네트워크에 액세스할 수 있는 곳이면 어디에서나 접근 가능을 의미

 

 

Ⅱ. 데이터베이스 세팅

1. 생성한 인스턴스와의 연결을 위해서 인스턴스 생성 시 다운받았던 키 페어 파일을 폴더로 옮겨준다.

2.AWS 인스턴스에서 연결할 인스턴스 ID를 클릭하고, 우측 상단의 "연결"을 클릭하여 하단의 예시를 복사하고 visual Studio Code의 터미널에 입력한다.

  • AWS에서 인스턴스 탭을 열어 연결할 인스턴스를 선택하면 나오는 화면에서 우측 상단의 "연결" 버튼을 클릭한다.

  • 예시의 코드를 복사하여 vs code의 터미널에 입력한다.

  • 터미널에 뜬 Are you sure you want to continue connecting (yes/no/[fingerprint])?yes를 입력한다.

3. visual Studio Code에서 터미널을 열어 bash를 열고, mysql을 설치한다.

// 업데이트
ubuntu@ip-172-31-33-48:~$ sudo apt-get update

// mysql 설치
ubuntu@ip-172-31-33-48:~$ sudo apt-get install mysql-server
.......
Do you want to continue? [Y/n] y

4. Mysql에 접속해서 데이터베이스를 생성한다.

// sudo 권한으로 mysql에 접속한다.
ubuntu@ip-172-31-33-48:~$ sudo mysql -u root -p
.......

// mysql에 'test'라는 이름의 데이터베이스를 생성한다.
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
// 데이터 베이스를 확인
mysql> show databases;
+----------------------------+
|          Database          |
+----------------------------+
| information_schema  |
| mysql                         |
| performance_schema|
| sys                             |
| test                             |
+----------------------------+
5 rows in set (0.00 sec)

5. 데이터베이스를 사용할 유저를 생성하고 모든 테이블에 접근할 수 있도록 권한을 설정한다.

  • 사용할 유저를 생성
    • create user '유저 이름 '@ '%' 'identified by '사용할 비밀번호';
  • 유저에게 권한을 설정한다.
    • grant all on 데이터베이스 이름.(데이터 베이스이름 뒤에 점)* to '유저이름'@'%';\
    • 해당하는 데이터베이스의 모든 테이블에 접근이 가능하다.
  • 유저의 권한 확인
    • show grants for '유저 이름';
// 사용할 유저를 생성한다.
mysql> create user 'testadmin'@'%' identified by '1234';
Query OK, 0 rows affected (0.02 sec)

// 유저에게 권한을 설정한다.
mysql> grant all on test.* to 'testadmin'@'%';
Query OK, 0 rows affected (0.00 sec)

// 유저의 권한을 확인한다.
mysql> show grants for 'testadmin';
+-------------------------------------------------------------------------------+
| Grants for testadmin@%                                                        |
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `testadmin`@`%`                        |
| GRANT ALL PRIVILEGES ON `test`.* TO `testadmin`@`%` |
+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

// mysql 접속을 종료한다.
mysql> exit
Bye
ubuntu@ip-172-31-33-48:~$

6. mysql 외부 접속을 허용하기 위해 모든 아이피로 변경한다. 

  • 아이피 변경을 위해 "mysqld.cnf"파일을 열어준다.(리눅스에서 작업한다.)
    • sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf;

❗ 열린 파일은 마우스 휠이 아닌, 키보드로 작업 줄을 이동한다.

  • " i "를 눌러 수정모드로 들어간다.
  • 열린 "mysqld.cnf" 파일의 bind-address 값을 " 0.0.0.0 " 으로 수정한다.
  • 수정이 완료되면 "esc"를 눌러 수정모드를 종료한다.
  • vi명령어를 사용하여 수정 내용을 저장하고 종료한다.
    • : wp! => 저장 후 종료
    • : q! => 저장하지 않고 종료
    • : w! => 강제 저장
ubuntu@ip-172-31-33-48:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf;
(키보드 방향키로 원하는 영역으로 이동)
.......
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
(" i "를 입력하여 수정모드 진입)
bind-address = 0.0.0.0
(수정완료 하면 " esc "를 눌러 수정모드 종료)

mysqlx-bind-address = 127.0.0.1
#
......
:wq! (저장 후 종료)

 

Ⅲ. 데이터베이스에 인스턴스 연결

1. Mysql Workbench 를 켜서 새로운 Connection을 생성한다.

  • Mysql 워크벤트 홈에서 " + "버튼을 눌러 새로운 커넥션을 생성한다.

  • 커넥션 생성 팝업에서 name, Hostname, Username, Password 등의 내용을 입력한다.
    • name: 임의의 값으로 입력.
    • Hostname: aws의 인스턴스에서 "퍼블릭 IPv4 DNS"의 주소를 복사하여 넣는다.
    • Username: mysql을 연결하여 생성한 이름을 넣는다. 지금의 경우는  "testadmin"
    • Password: 'Store in Vault ...' 을 클릭하여 mysql 생성 후 입력한 비밀번호를 입력해준다. 지금의 경우 "1234"
    • 'Test Connection'을 클릭하여 생성가능 여부를 확인하고 'OK'를 눌러 생성한다. 

 

Ⅳ. GitHub 프로젝트 연결

1. 깃 올린 레포스토리지의 url을 확인한다.

2. 터미널에서 깃을 init하고 레포스토리지를 연결한 후, 깃의 프로젝트를 내려받는다.

ubuntu@ip-172-31-33-48:~$ git init;
......
ubuntu@ip-172-31-33-48:~$ git remote add origin "깃 레퍼스토리지 주소 (HTTP)"
......
ubuntu@ip-172-31-33-48:~$ git pull origin master

 

Ⅴ. Node.js 설치

1. build-essential, npm, nodejs를 설치하고  프로젝트의 모듈을 다운받는다.

// build-essential 설치
ubuntu@ip-172-31-33-48:~$ sudo apt-get update
ubuntu@ip-172-31-33-48:~$ sudo apt-get install -y build-essential
ubuntu@ip-172-31-33-48:~$ sudo apt-get install curl

// 원하는 노드 버전을 적어주면 된다.
ubuntu@ip-172-31-33-48:~$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash --

// nodejs 설치
ubuntu@ip-172-31-33-48:~$ sudo apt-get install -y nodejs

// node 버전 확인
ubuntu@ip-172-31-33-48:~$ node -v

// npm 버전 확인
ubuntu@ip-172-31-33-48:~$ npm -v

// git 프로젝트의 모듈을 설치
ubuntu@ip-172-31-33-48:~$ npm i

2. 깃의 .env의 정보가 AWS와 연결된 mysql 정보로 저장되어 있는지 확인한다.

SESSION_KEY = mysessionkey
DATABASE_USERNAME = testadmin
DATABASE_PASSWORD = 1234
DATABASE_NAME = test
DATABASE_HOST = 127.0.0.1

ACCESS_TOKEN_KEY = myAccessToken

 

Ⅵ. AWS에서 연결된 프로젝트 포트번호 접속 규칙 추가

1. AWS에서 연결한 인스턴스의 ID 클릭 => 보안 => 보안그룹 => 인바운드 규칙 편집 => 규칙추가 접속

2. "규칙추가" => 유형(사용자지정 TCP) => 포트범위(서버에서 대기시킨 포트번호) => 0.0.0.0/0 => "규칙저장"

3. npm start로 서버를 실행하고, "퍼블릭 IPv4 DNS":포트번호/경로 로 접속이 가능하다.

ubuntu@ip-172-31-33-48:~$ npm start
  • 현재의 경우 접속 url
    • http://ec~.compute.amazonaws.com:5697/signUp

 

Ⅶ. 접속 Url에서 포트번호가 노출되지 않도록 포트 포워딩으로 재매핑

 

포트포워딩?

  • port forwarding
  • 포트(Port)를 전달(Forwarding)해 주는 것
    • 특정한 포트로 들어오는 데이터 패킷을 다른 포트로 바꿔서 다시 전송해주는 작업인 것이다.
  •  수신 데이터가 NAT 방화벽을 우회하도록 하여 인터넷 연결 속도를 개선한다.

1. 포트포워딩으로 포트 80 http로 접속했을 때 5697포트로 재매핑 시켜준다.

  • http : 80번 포트
  • https: 443 포트
// --dport 80 접속 했을 때 --to-port 5697 이 포트로 재매핑
ubuntu@ip-172-31-33-48:~$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5697;
  • 해당 작업을 수행하면 접속 url에 포트번호를 입력하지 않아도 접속할 수 있다.
    • http://ec~.compute.amazonaws.com/signUp 
  • 포트 포워딩 확인 명령어
    • sudo iptables -t nat -L --line-numbers
  • 포트 포워딩 삭제 명령어
    • sudo iptables -t nat -D PREROUTING 인덱스 번호

 

Ⅷ. 백그라운드에서 서버를 대기시킬 수 있도록 pm2 모듈 설정

  • 원래의 방법대로 npm start를 진행하면 서버대기 중에는 다른 작업을 할 수 없고 작업 시 서버대기가 종료되므로 백그라운드에서 서버를 대기시켜서 계속 동작할 수 있도록 한다.

1. pm2를 설치한다.

ubuntu@ip-172-31-33-48:~$ npm i pm2

2. package.json에서 실행 스크립트 명령어를 수정한다.

  • 서버 종료: npx pm2 kill
  • 리스트 확인: npx pm2 list
ubuntu@ip-172-31-33-48:~$vi package.json
(키보드 방향키로 원하는 영역으로 이동)
.....
 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
(" i "를 입력하여 수정모드 진입)
    "start": "pm2 start app.js"
(수정완료 하면 " esc "를 눌러 수정모드 종료)
  },
....
:wq! (저장 후 종료)

3. npm start로 서버를 열어준다.

ubuntu@ip-172-31-33-48:~$ npm start

 

작업을 완료 했다면 서버가 열리는 것을 확인 할 수 있을 것이다!

 

 

👩‍🏫

인스턴스 중지 / 종료 시키자!

  • 인스턴스를 사용하지 않을 경우, 계속 인스턴스를 실행시켜 접속을 늘리면 프리티어를 사용했더라도 요금이 청구될 수 있으니, 작업을 하지 않을 경우에는 중지 시키도록 하자!
  • 인스턴스를 삭제하고 싶다면 "인스턴스 종료"를 선택하면 인스턴스 상태가 종료 처리되고 일정 시간이 지나면 인스턴스 목록에서도 사라진다.

 

 

 

 

 

 

 

728x90