Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Redis REST API로 구현하는 상태 저장(Stateful) AWS Lambda

AWS Lambda는 서버리스 시장을 개척한 선구자입니다. 많은 개발자들이 서버리스가 개발의 미래라고 믿습니다. 서버리스는 진정한 종량제(pay-per-use) 모델을 제공하며, 백엔드 인프라의 유지보수와 확장 부담에서 개발자를 해방시켜 줍니다. 하지만 동시에 몇 가지 과제도 함께 안고 있습니다. 그중 하나가 바로 상태 비저장(stateless) 특성입니다. 상태를 유지하려면 외부 데이터 저장소를 활용해야 하는데, 안타깝게도 대부분의 인기 있는 데이터 저장소는 연결(connection) 기반으로 동작합니다. 이전 글에서 설명했듯이, 서버리스 환경에서 연결 관리는 꽤 번거로운 작업이 될 수 있습니다. 바로 이러한 이유에서 우리는 Upstash Redis 위에 고성능 REST API를 개발했습니다. 이번 글에서는 REST API를 활용해 AWS Lambda와 Upstash Redis로 아주 기본적인 상태 저장 API인 페이지 카운터를 구현해 보겠습니다.


라이브 데모 확인하기: https://3jyz1n07o8.execute-api.us-east-1.amazonaws.com/count


전체 코드 보기: https://github.com/upstash/examples/tree/master/aws-lambda-redis-rest


프로젝트 설정

애플리케이션 배포에는 Serverless 프레임워크를 사용합니다. 터미널에서 serverless 명령어를 실행하면 대화형으로 프로젝트를 생성할 수 있습니다.

git:(master) ✗ serverless

Serverless: No project detected. Do you want to create a new one? Yes
Serverless: What do you want to make? AWS Node.js
Serverless: What do you want to call this project? aws-lambda-redis-rest
Project successfully created in 'aws-lambda-redis-rest' folder.

코드 작성

먼저 npm install node-fetch 명령으로 fetch 패키지를 설치합니다. 그다음 Upstash 콘솔에서 데이터베이스를 생성하고, REST API 버튼을 클릭해 URL과 토큰을 복사합니다. 이후 handler.js 파일을 아래와 같이 수정합니다.

const fetch = require("node-fetch");
module.exports.hello = async (event) => {
  const url =
    "https://us1-last-panther-33620.upstash.io/incr/counter?_token=AACQgMzYyNGM0OGMtZWQ3MC00OTRlLWFmOGEtODc3ZWQxYWQyZGJjZjgyOTlkM2JhNWIxE3OTJlNmE2NGVjNGM=";
  let data = await fetch(url);
  let result = await data.text();
  return { statusCode: 200, body: result };
};

위 코드는 요청이 들어올 때마다 Upstash Redis의 INCR 명령으로 카운터 값을 1씩 증가시키고, 그 결과를 응답으로 반환하는 간단한 로직입니다. 이어서 serverless.yml 파일에 API 엔드포인트를 추가합니다.

service: aws-lambda-redis-rest
frameworkVersion: '2'

provider:
 name: aws
 runtime: nodejs12.x
 lambdaHashingVersion: 20201221

functions:
 hello:
   handler: handler.hello
   events:
     - httpApi:
         path: /count
         method: get

실행 및 배포

작성한 함수는 로컬 환경에서 다음 명령으로 테스트할 수 있습니다.

serverless invoke local -f hello

배포는 아래 명령 한 줄이면 충분합니다.

serverless deploy

배포가 완료되면 명령 실행 결과로 엔드포인트 URL이 출력됩니다. 이 URL을 브라우저에서 열면 페이지를 새로고침할 때마다 카운터 값이 증가하는 것을 확인할 수 있습니다.

참고 사항

  • 최상의 성능을 위해서는 데이터베이스와 AWS Lambda 함수를 반드시 같은 리전(region)에 배치해야 합니다.
  • REST API 덕분에 데이터베이스 연결을 직접 관리할 필요가 없으며, 별도의 Redis 클라이언트 라이브러리도 전혀 필요하지 않습니다.
  • API 토큰은 절대 공개적으로 공유하지 마세요. 실수로 노출된 경우에는 데이터베이스 비밀번호를 재설정하여 해당 토큰을 무효화(revoke)할 수 있습니다.
  • 하나의 함수 호출에서 여러 Redis 명령을 실행해야 한다면, 최상의 성능을 위해 파이프라인(pipeline) API를 사용하는 것이 좋습니다.