AWS Lambda로 Express 서버 배포하기

Taemin Jang·2024년 2월 5일
0

안녕하세요, 현재 진행중인 코테PT 프로젝트 MVP를 마치고 배포한 과정을 적어보려고 합니다.

우선 코테PT는 취업 준비생을 위한 코딩테스트 학습, 복습 일정 관리를 제공하는 서비스입니다.

초기 기능으로 백준 ID를 입력 시 문제 푼 기록을 가져오고, 가져온 것을 토대로 Github 잔디와 같이 보여줍니다.

여기서 특별한 점은 처음 푼 문제와 나중에 다시 푼 기록을 가지고 복습 여부를 판단하여 복습까지 했다면 싱싱한 초록잎, 복습은 안했다면 갈색잎으로 보여줍니다.

해당 MVP를 가지고 검증하기 위해서는 배포가 필수입니다.

프론트 배포는 React로 개발 중이기에 vercel로 배포했고, 백엔드는 AWS Lambda로 배포하기로 결정했습니다.

AWS Lambda

AWS에서 제공하는 서버리스 컴퓨팅 서비스로써, 서버리스는 사용자가 서버를 직접 관리할 필요가 없다는 것을 의미한다.

즉 코드를 업로드하면 Lambda가 사용자에 요청으로부터 자동으로 실행하여 응답 및 스케일링, 모니터링 등을 처리해준다.

Lambda vs EC2

Lambda는 간단한 작업, 빠른 실행에 최적화가 되어있고, 트래픽이 많이 몰리지 않는 서비스에 적합하다. 예로 S3 버킷이나 DynamoDB 변경에 대한 응답, 알림 보내기, 파일 처리 등이 있다.
Lambda는 최소 사용량만큼 사용하면 과금되지 않아서 잘 구성하면 무료로 서비스를 운영할 수 있다.

그에 비해 EC2는 복잡한 장기 실행 프로세스에 맞게 설계되어 있으며, 지속적인 운영에 대한 비용이 들어가게 된다. 예로 웹 서버, 백그라운드 처리 등이 있다.

Lambda를 선택한 이유

Lambda에 대해 간단히 살펴봤습니다.
현재 프로젝트의 상태를 보면, 첫 MVP 개발을 마치고 검증이 필요한 상태이며, 서버 기능도 ID 검증, ID가 푼 문제 기록 크롤링뿐이라 상시로 서버가 상주할 필요가 없고 요청에 의한 실행만 해주면 되어 Lambda가 적합하다고 생각했습니다.

그리고 비용적인 측면에서도 트래픽이 많지 않을것으로 예상되어 무료로 서버를 배포할 수 있다는 점이 좋았습니다.

Lambda로 배포해보자

AWS 콘솔에서 Lambda를 검색한 다음 다음과 같이 함수 생성을 클릭합니다.

새로운 함수를 만들기 위해 이름과 런타임을 선택해서 생성합니다.

함수를 생성하면 다음과 같이 쉽게 생성이 되고, 작성한 서버 코드를 zip으로 압축한 뒤 업로드 버튼을 통해 업로드해주면 코드가 등록됩니다.

또한 Express로 코드 작성했다면, serverless-http 라이브러리를 통해 서버리스에서 API Gateway가 트리거할 수 있도록 handler를 export 해줘야합니다.

const axios = require("axios")=
const express = require("express");=
const serverless = require("serverless-http")
const app = express();

...

app.get("/achievement", async function (req, res) {
  ...
  res.json(allLists);
});

app.get("/login", async function (req, res) {
  ...
  res.json(result);
});

module.exports.handler = serverless(app);

이렇게 작성된 서버 코드를 등록했다면 Deploy를 통해 배포해줍니다.

그리고 트리거 추가를 통해 API Gateway를 추가하고 REST API로 설정하면 됩니다. Deployment stage는 서버 배포상태를 의미하며 production의 약자인 prod로 설정해줬습니다. 따라서 추후에 배포가 되면 ~~url/prod로 접근할 수 있습니다.

생성한 API Gateway로 들어가면 리소스가 있는데 미리 생성된 리소스를 삭제해주고 루트 경로(/)에서 리소스 생성을 해줍니다.

프록시 리소스를 선택해줍니다. 리소스 이름을 {proxy+}로 설정해주면 해당 경로 하위 리소스에 대해 요청을 처리할 수 있게 됩니다.

생성한 리소스에서 {proxy+}에 있는 ANY를 정의해줘야합니다. 통합 편집을 통해 정의해줍시다.
Lambda 함수로 선택하고 프록시 통합을 해줍니다. 그리고 이전에 생성한 Lambda함수를 선택하고 저장합니다.

그리고 해당 리소스를 선택하고 API 배포를 해줍니다.

스테이지 들어가서 URL을 보면 배포된 링크를 확인할 수 있습니다.

이렇게 간단하게 Lambda 함수를 생성해서 서버리스로 배포해봤습니다.

초기 트래픽이 적은 프로젝트라 Lambda로 배포해도 무료로 사용이 가능하지만 서비스가 커지고 트래픽이 월 100만 요청이 들어온다면 고려해봐야할 것 같습니다.

참고

profile
하루하루 공부한 내용 기록하기

0개의 댓글