개요
슬슬 공채 시즌 + SSAFY 5기의 삼성 SW역량테스트 A형 이 곧 다가와서 백준만 풀다가.. 정신이 나갈 것 같더라구요. 그런데 포폴을 쓰다가, AWS EC2 의 비용 문제로 스토어에서 내려버렸던( 지금 보니 바보짓이었어요 ) 저의 팀프로젝트 결과물을 다시 살려야 겠다는 생각을 했습니다.
비용은 한 달에 약 3만원 후반 대 정도였는데, 마케팅을 따로 하지 않았다 보니 사용자의 수에 비해 너무 과한 비용처럼 느껴졌습니다. 프리티어 쓰면 되지 않냐! 하실 수 있는데, 어떤 날은 10명 들어와서 그냥 서버가 터져버렸습니다. 그런 걸 방지하기 위해 ec2 티어를 올렸더니 또 유저가 안들어온 날이면 아.. 1300원 정도가 허공에 날아갔네 싶었습니다.
그러던 중 Severless 와 AWS Lambda 의 존재를 알게 되었고, 쓴 만큼 비용을 낸다! 는 것을 보고 적용해야겠다는 생각을 했습니다. 서비스는 production 환경은 lambda에서, dev 환경은 ec2 인스턴스에서 굴릴 예정입니다.
잡설이 길었는데, 얼른 시작해보겠습니다. 이번 글은, 별 설명없이 lambda 를 빠르게 적용해야 하는 분들에게 좋을 것 같습니다. 제 프로젝트의 환경은
- nodejs 14.x
- express
- http server
입니다.
1 단계 : express server를 lambda 에 deploy 하기
먼저, serverless 라는 패키지를 global 로 설치해줍니다.
$ npm install serverless -g
설치 되었는지 확인해줍니다.
$ serverless --version
Framework Core: 2.29.0
Plugin: 4.5.0
SDK: 4.2.0
Components: 3.7.3
이제 자신의 AWS 계정 정보를 입력해줘야 합니다. AWS 계정은 당연히 다 있다고 생각하고 진행합니다.
[내 보안 자격 증명] 을 클릭해서 들어가줍니다.
저는 이미 있는데, 새 엑세스 키 만들기를 해줍니다.
이렇게 뜹니다. 보안 액세스 키는 이 창 이후로 다시 볼 수 없습니다. 다운로드 해두시길 바랍니다.
이제 콘솔창으로 돌아와서,
export AWS_ACCESS_KEY_ID=<your-key-here>
export AWS_SECRET_ACCESS_KEY=<your-secret-key-here>
[액세스 키 ID] 가 위, [보안 액세스 키] 가 아래입니다.
이제, serverless.yml 을 루트 디렉토리에 하나 만들어주고, 다음을 입력합니다.
service: {올릴 이름}
provider:
name: aws
runtime: nodejs14.x
stage: production
region: ap-northeast-2
memorySize: 128
functions:
app:
handler: app/app.handler
events:
- http:
path: /
method: ANY
cors: true
- http:
path: /{proxy+}
method: ANY
cors: true
이제 app.js 내에 약간의 수정이 필요합니다. 먼저 serverless-http 패키지를 설치해줍니다.
$ npm install serverless-http
이후, app.js 를 다음과 같이 수정합니다.
var express = require('express');
const serverless = require('serverless-http');
var app = express();
/** 나머지 코드들 **/
module.exports.handler = serverless(app);
아마 많은 분들이 module.exports = app 을 설정해놨을 텐데, 사용해도 상관없는 것 같습니다.
이제 다 끝났습니다! 다음 명령어를 입력해줍시다.
serverless deploy
기다리다 보면 콘솔창에 좌라락 뜨는데, endpoints 부분이 우리가 접근할 수 있는 uri 입니다.
이제 기존의 localhost:포트번호 대신, https:// 다음 부분부터 끝까지 입력해주시면 됩니다. 기존의 서버가 http 서버였다면 이렇게 해야하고, https 서버면 전체를 입력하면 될 것입니다.
이제 aws 콘솔에서 lambda 로 들어가서 보시면 올려놓은 서버가 있을 겁니다. 그럼 끝입니다!
하지만?
저는 또 다른 문제점이 있었습니다. 외부 API 와 통신하는 기능이 있었는데, 해당 API 는 고정 IP 를 등록해두고 사용하는 방식이었습니다. 하지만 Lambda 는 고정 ip 가 아니라, 계속해서 ip 가 바뀐다고 하더라구요. 저는 구글링 끝에 이 문제를 어찌저찌 해결했습니다. 다음 포스팅에는 VPC 만들기, 탄력적 ip 할당, Lambda 에 권한 추가 등 제가 했던 일들을 정리해서 올려보겠습니다. 감사합니다!
최근댓글