Skip to content

AWS nodejs

egoing edited this page Nov 30, 2020 · 16 revisions

이곳으로 오는 방법

https://bit.ly/aws-node

수업순서

  • github.com 에 저장소를 만듭니다.
    • 저정소명 : nodejs-aws
    • 저장소는 Public으로 지정해주세요.
  • github.com 에 아래와 같은 소스코드를 만듭니다.

index.html

<h1><a href="index.html">WEB</a></h1>
<ul>
    <li><a href="html.html">html</a></li>
    <li><a href="nodejs.html">nodejs</a></li>
    <li><a href="mysql.html">mysql</a></li>
</ul>
<h2>Welcome</h2>
Hello WEB!!

html.html

<h1><a href="index.html">WEB</a></h1>
<ul>
    <li><a href="html.html">html</a></li>
    <li><a href="nodejs.html">nodejs</a></li>
    <li><a href="mysql.html">mysql</a></li>
</ul>
<h2>html</h2>
HTML is hypertext markup language
  • EC2 인스턴스를 만듭니다.

  • git clone 저장소 주소을 입력해서 저장소를 서버로 deploy합니다.

  • sudo apt update

  • sudo apt install nodejs npm

  • sudo npm install --global local-web-server

  • sudo ws --port 80

  • 동작하는 것을 확인한 후에 ws를 바로 꺼주세요. EC2 instance connect는 timeout 시간이 짧습니다. 타임아웃이 되면 기존에 동작하던 ws가 계속 동작하고 있기 때문에 port가 충돌되는 문제가 발생할 수 있습니다.

  • nodejs를 이용한 최소한의 구현을 해봅시다.

1.js

var http = require('http');
var app = http.createServer(function(request,response){
    response.end(`
    <h1><a href="index.html">WEB</a></h1>
    <ul>
        <li><a href="html.html">html</a></li>
        <li><a href="nodejs.html">nodejs</a></li>
        <li><a href="mysql.html">mysql</a></li>
    </ul>
    <h2>Welcome</h2>
    Hello WEB!!    
    `);
});
app.listen(80);
  • sudo node 1.js

  • sudo npm install --global pm2

  • pm2를 이용해서 자동으로 소스코드가 watch 되는 것을 살펴봅니다. 또 pm2에 의해서 구동되던 인스턴스를 켜고 끄는 법을 익힙니다.

  • sudo pm2 start 1.js --watch

  • sudo pm2 status

  • sudo pm2 delete id

  • nodejs와 web server의 차이점을 느껴봅시다.

2.js

var http = require('http');
var app = http.createServer(function(request,response){
    var content = Math.random();
    response.end(`
    <h1><a href="index.html">WEB</a></h1>
    <ul>
        <li><a href="html.html">html</a></li>
        <li><a href="nodejs.html">nodejs</a></li>
        <li><a href="mysql.html">mysql</a></li>
    </ul>
    <h2>Welcome</h2>
    ${content}    
    `);
});
app.listen(80);
  • sudo pm2 start 2.js --watch

  • rds를 생성합니다.

  • rds의 VPC security group에 EC2 security group를 등록해서 접속을 허용합니다.

  • sudo apt install mysql-client

  • mysql -uadmin -p -hHOST-NAME

  • 데이터베이스 생성

    • CREATE DATABASE mydb;
  • 데이터베이스 선택

    • use mydb;
  • 테이블 생성

    • CREATE TABLE topic(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, title char(20) NOT NULL, description TINYTEXT, thumbnail varchar(200) NULL);
  • 데이터 입력

INSERT INTO topic (id,title,description) VALUES(1, 'S3', 'S3 is ..');
INSERT INTO topic (id,title,description) VALUES(2, 'EC2', 'EC2 is ..');
INSERT INTO topic (id,title,description) VALUES(3, 'CF', 'CF is ..');
  • npm 패키지 설치
  • npm init
  • npm i mysql
  • nodejs 모듈
  • mysql을 nodejs로 제어하는 방법을 살펴봅시다.
    3.js
var mysql = require('mysql');
var connection = mysql.createConnection({
    host: 'database-1.cdbrt00yi2pz.ap-northeast-2.rds.amazonaws.com',
    user: 'admin',
    password: '11111111',
    database: 'mydb'
});
connection.connect(function (err) {
    if (err) {
        console.error('error connecting: ' + err.stack);
        return;
    }
    console.log('connected as id ' + connection.threadId);
    connection.query('select * from topic', function (error, results, fields) {
      console.log('error=>', error);
      console.log('results=>', results);
      for(var i=0; i<results.length; i++){
        console.log(i, results[i].title);
      }
    });
    connection.end();
});
  • web-mysql 앱을 만들어봅시다.
var mysql = require('mysql');
var http = require('http');
var url = require('url');
var connection = mysql.createConnection({
    host: 'database-1.cdbrt00yi2pz.ap-northeast-2.rds.amazonaws.com',
    user: 'admin',
    password: '11111111',
    database: 'mydb'
});
connection.connect(function (err) {
    if (err) {
        console.error('error connecting: ' + err.stack);
        return;
    }
    console.log('connected as id ' + connection.threadId);
});
var app = http.createServer(function (request, response) {
    var _url = request.url;
    var queryData = url.parse(_url, true).query;
    var pathname = url.parse(_url, true).pathname;
    connection.query('select * from topic', function (error, results, fields) {
        var list = "";
        for (var i = 0; i < results.length; i++) {
            list += `<li><a href="?id=${results[i].id}">${results[i].title}</a></li>`;
        }
        var content = "";
        if (queryData.id === undefined) {
            content = "<h2>Welcome</h2>Hello WEB!";
            response.end(`
                <h1><a href="index.html">WEB</a></h1>
                <ul>
                    ${list}
                </ul>
                <h2>Welcome</h2>
                Hello WEB!!    
            `);
        } else {
            connection.query(`SELECT * FROM topic WHERE id="${queryData.id}"`, function (error, results) {
                console.log(results);
                response.end(`
                    <h1><a href="index.html">WEB</a></h1>
                    <ul>
                        ${list}
                    </ul>
                    <h2>${results[0].title}</h2>
                    ${results[0].description}
                `);
            })
        }
    });
});
app.listen(80);
  • sudo crontab -e에서 아래 내용을 추가
    • @reboot sudo pm2 start /home/ubuntu/nodejs-aws/3.js
  • 이미지 생성
  • 이미지로 인스턴스 생성
    • 재부팅 비활성화
  • 이미지로 인스턴스 만들기
    • 인스턴스를 만들 때 security group을 rds에서 허용한 것으로 지정