1. 개요


2. 작업

2.1. 작업할 로컬 디렉토리 생성

2.2. 로컬 디렉토리에서 필요 모듈 다운로드

우선 npm init 실행한 후 필요한 정보를 입력한다.

그러면 package.json이 생성된다.

이어서 mysql 모듈을 받는다.

$ npm install --save mysql
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN recent-tech-note@1.0.0 No description
npm WARN recent-tech-note@1.0.0 No repository field.
 
+ mysql@2.17.1
added 11 packages from 15 contributors and audited 13 packages in 0.747s
found 0 vulnerabilities
 

이번엔 async 모듈을 받는다.

$ npm install --save async
npm WARN recent-tech-note@1.0.0 No description
npm WARN recent-tech-note@1.0.0 No repository field.
 
+ async@3.1.0
added 1 package from 1 contributor and audited 14 packages in 0.583s
found 0 vulnerabilities

2.3. js 파일 생성

파일명과 Lambda 함수의 hander 이름은 같아야 한다.

예를 들어 username.js 라면 handler 이름은 username.hander임.

var BreakException = {};
var mysql = require('mysql');
var async = require('async');
 
var conn  = mysql.createPool({
    host     : 'xxxx.rds.amazonaws.com',
    user     : 'aaaa',
    password : 'bbbb',
    port     : '3306',
    database : 'cccc'
});
 
exports.handler = function(event, context, callback){
    async.waterfall([
        function (cb) {
            conn.query(
                'SELECT name, dept FROM content WHERE ... ORDER BY ... desc LIMIT 30',
                function(err, rows, fields) {
                    if (!err) {
                        cb(null, rows);
                    } else {
                        console.log('Error while performing Query.', err);
                        cb(500);
                    }
                }
            );
        }],
        function (err, result) {
            if (!err) {
                if (result.length > 0) {
                    var res = [];
 
                    try {
                        result.forEach(function(value, index) {
                            var temp = {};
                            temp.name = value.name;
                            temp.dept = value.dept;
                            res.push(temp);
                        });
                    } catch (e) {
                        if (e !== BreakException) throw e;
                    }
                    context.succeed(res);
                } else {
                    context.succeed('');
                }
            } else {
                if (err === 400) {
                    context.fail('Bad Request: You submitted invalid input');
                } else {
                    context.fail('Internal Error: Internal Error');
                }
            }
        }
    );
};

2.4. zip 파일 패키징

로컬 디렉토리 상에서 zip -r myfunction.zip ./ 처럼 압축한 후 업로드한다.