ㅡ. 개요

CloudSQL에 데이터를 node.js서버에서 간단하게 불러오는 rest api application을 만들고 이를 Cloud Run을 이용해 배포하는 과정

 

ㅡ. 시작

프로젝트를 생성합니다. 

새 프로젝트를 생성합니다.

ㅡ. Cloud SQL 생성

cloudSQL 생성

cloud SQL 생성시 공개 IP 주소로 접근하였습니다. 

 

Terminal 환경에서 접속으로 Local에서 CloudSQL이 접근가능한지 확인하였습니다. 

ㅡ. Mysql Workbench 실행

워크벤치에서 Connection을 생성하고 데이터베이스, 테이블 생성 후 데이터를 insert 하였습니다. 

selec * from fancy.products 시 전체 데이터가 나오는것을 확인할 수 있었습니다.

ㅡ. node.js 와 mysql 연동

2020/08/25 - [Node.js] - node.js restful api 서버 만들기 (with bigQuery)

 

node.js restful api 서버 만들기 (with bigQuery)

*ref : https://ing-yeo.net/2020/02/study-nodejs-create-simple-restful-api-server/ GET : 서버 자원 가져오기 POST : 서버 자원 등록하기 PUT : 서버 자원 치환 (업데이트 같은...) PATCH : 서버 자원 일부 치..

thewayitwas.tistory.com

이전에 Express를 활용해 Node.js로 rest api를 생성하는 과정을 확인할 수 있었습니다. 

 

이상태에서 

npm install -S mysql

mysql 설치

var mysql = require('mysql');
var connection = mysql.createConnection({
    host : '35.238.205.2',
    user : 'root',
    password : '',
    database : 'fancy'
})

connection.connect();

 

mysql 접속하기 위한 connection을 생성합니다. .

app.js에서 라우팅될 URL 을 생성합니다.

 

var gogoRouter = require('./routes/gogo');
app.use('/gogo', gogoRouter); 

ㅡ. app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var gogoRouter = require('./routes/gogo');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/neotek', neotekRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

ㅡ. gogo.js

var express = require('express');
var router = express.Router();
var mysql = require('mysql');


const query = async(res)=>{
    var connection = mysql.createConnection({
        host : '[cloud-sql-ip]',
        user : 'root',
        password : '',
        database : 'fancy'
    })
    
    connection.connect();

 let k=0;
 await connection.query('SELECT * FROM products', function(error, results, fields){
        if(error){
             console.log(error);
        }
        k = results;
        console.log(results);
        res.send(k);
    })
}


/* GET users listing. */
router.get('/as', async function(req, res, next) {
     await query(res);
  
});

module.exports = router;

ㅡ. Postman 실행결과 

ㅡ. CloudRun

ㅡ. Dockerfile생성

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

ㅡ. dockerignore

Dockerfile
README.md
node_modules
npm-debug.log

불필요한것들은 제외시켜줍니다. 

 

ㅡ. 1Step

gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld

ㅡ. 2Step

gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed

 

ㅡ. 배포된 상태에서 URL만 변경시 결과 화면