안경잡이개발자

728x90
반응형

  이번 시간에는 간단히 AWS Lambda와 MongoDB를 연동하는 방법에 대해서 알아보도록 하겠습니다. 우리는 추후에 결과적으로 간단한 형태의 게시판 게시글 API를 만들어볼 것입니다. AWS Lambda와 MongoDB 모두 구축이 매우 간단하고, 편리하기 때문에 이 두 서비스를 한꺼번에 이용하는 경우가 많습니다.

 

  따라서 바로  Atlas 회사의 MongoDB를 구축해보도록 하겠습니다. MongoDB는 다음의 포스팅에서 제가 간단히 소개한 바 있습니다. https://ndb796.tistory.com/302

 

Atlas 무료 MongoDB 사용 방법

공부 목적으로 MongoDB를 이용하시는 분들은 Atlas 회사의 MongoDB 서비스를 가장 많이 사용합니다. 이번 포스팅에서는 Atlas 회사의 무료 MongoDB를 사용하는 방법에 대해서 소개하도록 하겠습니다. ▶ Atlas Mon..

ndb796.tistory.com

  위 과정은 매우 금방 따라하실 수 있을 거고, 최종적으로 만들어진 MongoDB의 접속 문자열(String)을 메모장에 기록해 놓은 뒤에 다음의 과정을 따라오시면 됩니다.

 

  더불어 Atlas에서는 공식 AWS Lambda와 Atals MongoDB를 연동하는 예제를 제공하고 있으므로 이를 참고하시면 좋습니다. https://docs.atlas.mongodb.com/best-practices-connecting-to-aws-lambda/

 

Best Practices Connecting from AWS Lambda — MongoDB Atlas

Best Practices Connecting from AWS Lambda MongoDB recommends the following best practices to optimize connection times between AWS Lambda and Atlas: Define the MongoDB client connection to the MongoDB server outside the AWS Lambda handler function. This ma

docs.atlas.mongodb.com

 

  가장 먼저 AWS Lambda의 환경 변수(Environment Variables)로 MONGODB_URI을 설정합니다. 이 때 <password> 부분에 자신의 MongoDB 비밀번호를 넣어주셔야 합니다.

 


이제 Lambda 소스코드를 작성합니다.

 

"use strict";

const mongoose = require('mongoose');
const MONGODB_URI = process.env.MONGODB_URI;

module.exports.handler = (event, context, callback) => {
  console.log('event: ', event);
  
  /* Database 설정 및 변수 초기화 */
  mongoose.Promise = global.Promise;
  mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true });
  const db = mongoose.connection;
  db.once('open', function () {
      console.log('Database Connected.');
  });
};

 

  이후에 코드를 [Save]하고 [Test] 버튼을 눌러서 아무렇게나 테스트 설정을 하여 테스트를 해보시면, 아래 쪽에 Cannot find module 'mongoose'라는 메시지가 나오게 됩니다. 이는 Mongoose 라이브러리가 AWS Lambda에 기본적으로 포함되어 있지 않기 때문에 발생하는 문제입니다.

 

 

  따라서 우리가 AWS Lambda에 특정한 라이브러리를 추가하여 사용하고 싶다면, 직접 Node.js 라이브러리를 압축하여 AWS Lambda에 올려야 합니다. 따라서 특정한 폴더에서 npm install mongoose로 MongoDB 라이브러리를 설치합니다.

 


  그리고 nodejs라는 이름의 폴더를 만들고, 그 안에 node_modules 폴더를 둡니다. 그리고 library라는 이름의 폴더를 하나 더 만들어서 nodejs 폴더를 그 안에 둡니다. AWS Lambda에 업로드 하게 되는 압축 파일의 루트 폴더는 nodejs라는 이름을 가진다고 약속되어 있어요. 

 

 

  이후에 library 폴더를 압축합니다. 이후에 그 압축 파일을 AWS Lambda의 Layer에 올립니다. 이 때 Runtime이 자신의 AWS Lambda의 Runtime과 일치하는지 확인할 수 있도록 합니다. (Node.js 8.10 버전인 경우 Layer Runtime도 8.10을 선택합니다.)

 

 

  이제 다시 AWS Lambda로 돌아가서, 우리의 Lambda 함수를 클릭한 뒤에 [Add a layer]를 눌러 레이어를 추가합니다.

 

 

  결과적으로 다음과 같이 업로드한 라이브러리를 선택해서 [Add] 버튼을 누르시면 됩니다.

 

 

  이제 이 상태에서 다시 AWS Lambda를 [Save]하고 [Test]하면 이제 Mongoose를 사용할 수 있게 되는 것을 알 수 있습니다.

 

 

  다만 이 때 위와 같이 정상적으로 DB 접근이 되지 않아서, 'Database Connected.' 라는 로그(Log)가 출력되지 않으면, Atlas에서 DB White List 설정을 확인하실 필요가 있습니다. 혹은 MongoDB 비밀번호가 제대로 입력이 되어 있는지 확인하실 필요가 있습니다.

 

  기본적으로 AWS Lambda의 IP를 Atlas의 White List에 등록해야 사용할 수 있습니다. 하지만 AWS Lambda는 유동 IP 정책을 따르고 있어서, 일일히 모든 IP를 White List에 등록할 수 없습니다. 그래서 흔히 VPC를 이용하여 고정 IP를 할당할 수 있습니다.  다만 이렇게 하면 어렵고, 비용도 많이 발생할 수 있어요. 따라서 그냥 실습 과정에서는 MongoDB에서 모든 IP를 허용할 수 있도록 할 수 있습니다. 따라서 Atlas의 MongoDB에서 [CONNECT]를 눌러 연결 정보를 확인합니다.

 

 

  이후에 다음과 같이 [IP Whitelist tab]을 누릅니다.

 

 

  이후에 다음과 같이 모든 IP 주소에서 접속할 수 있는 Entry를 추가하시면 됩니다.

 

 

  이제 다음과 같이 정상적으로 AWS Lambda를 실행하면, 3초 가량의 시간이 흐른 뒤에 'Database Connected.'라는 메시지가 출력됩니다. 다만 DB 연결과 관련하여 많은 시간이 소요되며, Error Message를 뱉을 수 있습니다.

 

 

  그래서 실제로 코딩을 할 때에는 다음과 같은 방식으로 코드 맨 아래에서 context.done() 함수를 통해 결과를 돌려주며 함수를 마치도록 해야 합니다.

 

"use strict";
const mongoose = require('mongoose');
const MONGODB_URI = process.env.MONGODB_URI; // or Atlas connection string
module.exports.handler = (event, context, callback) => {
  console.log('event: ', event);
  /* Database 설정 및 변수 초기화 */
  mongoose.Promise = global.Promise;
  mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true });
  const db = mongoose.connection;
  db.once('open', function () {
      console.log('Database Connected.');
  });
  context.done(null, { 'statusCode': 200 });
};

 

  이제 결과적으로 200번 응답 코드가 출력되는 것을 알 수 있습니다. 다만 'Database Connected.'라는 로그 메시지는 출력되지 않고, 바로 종료되는 것을 알 수 있습니다. 이제 이러한 구조에서 실제로 DB로부터 데이터를 조회하는 등의 작업을 수행하면, 그 때 정상적으로 동작하게 됩니다. 이상으로 이번 시간에는 AWS Lambda와 MongoDB의 연동 방법에 대한 개괄적인 내용을 다루어 보았습니다.

 

 

728x90
반응형