본문 바로가기

백엔드/Serverless

서버리스 GraphQL 백앤드 구축

서버리스 프레임워크 초기화 및 AWS에 연결 포스트에서 생성한 서버리스 설정값을 사용하여 람다 함수를 배포할 것입니다.

1. 서버리스 프로젝트 생성

npx serverless create --template aws-nodejs --path instagureng-backend

2. 패키지 설치

GraphQL API 관련 패키지

npm install apollo-server-lambda graphql

테스트용 패키지

배포하기 전에 로컬 서버 3000포트로 미리 테스트할 수 있도록 해주는 패키지입니다. 

npm install serverless-offline --save-dev

3. handler.js

schema는 typeDefs, resolvers 객체를 포함하는 객체입니다.

Prisma와 ID 토큰 관련 코드는 나중에 추가해 주겠습니다.

cors 설정은 반드시 해 주어야 합니다.

'use strict';

const { ApolloServer } = require('apollo-server-lambda');
const { schema } = require('./src/schema');


const server = new ApolloServer({
  schema,
  playground: {
    endpoint: "/dev/apollo"
  } 
});

exports.apollo = server.createHandler({
  cors: {
    origin: '*',
    methods: [
      'POST',
      'GET'
    ], 
    allowedHeaders: [
      'Content-Type',
      'Origin',
      'Accept'
    ]
  },
});

 

최종 배포할 때는 Playground를 사용하지 못하도록 ApolloServer 생성자에서 playground 속성을 제거해 주는 것이 좋습니다.

const server = new ApolloServer({
  schema
});

4. serverless.yml

서버리스 프로젝트를 처음 생성하면 region 속성은 정의되어 있지 않을 것입니다. 

핸들러와 마찬가지로 cors 설정을 해 주어야 합니다.

2에서 설치한 serverless-offline 패키지를 서버리스 설정 파일에도 등록해 주어야 합니다.

service: instagureng-backend

provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-2

functions:
  apollo:
    handler: handler.apollo
    events:
      - http:
          path: apollo
          method: post
          cors: true
      - http:
          path: apollo
          method: get
          cors: true

plugins:
  - serverless-offline

5. 배포

다음 코드를 입력하면 다음 작업이 자동으로 수행됩니다.

  • S3 버킷 생성
  • 현재 프로젝트를 압축해서 S3 버킷에 업로드
  • 람다 함수 생성
  • S3에 업로드된 프로젝트를 생성된 람다 함수에 등록
  • API Gateway 생성
  • 생성된 람다 함수와 API Gateway 연결
npx serverless deploy -v

배포가 완료된 후엔 API Gateway 주소로 GraphQL 요청을 보낼 수 있습니다.

서버리스 GraphQL 백앤드

API Gateway는 다양한 기능(쉬운 Restful API 구성, 보안, 백앤드로 다양한 AWS 서비스에 연결 가능 등)이 많지만 여기서는 람다 함수에 접속하기 위한 앤드포인트 역할만 수행합니다.

그리고 일반 서버처럼 Playground도 사용할 수 있습니다. 아마 Playground에서 주기적으로 더미 신호를 보내 람다 함수가 유휴 상태로 들어가지 못하도록 막는 것 같습니다.

출처1: https://www.apollographql.com/docs/apollo-server/deployment/lambda/

 

6. 테스트

위에서 설치한 serverless-offline 플러그인을 사용하면, 코드가 제대로 작동하는지 확인하기 위해 매번 AWS 람다에 배포할 필요가 없습니다.

콘솔에서 다음 명령어를 실행시키면 로컬 3000번 포트에서 핸들러 함수를 실행시킬 수 있습니다.

npm run serverless offline start