서버리스 프레임워크 초기화 및 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 요청을 보낼 수 있습니다.
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
'백엔드 > Serverless' 카테고리의 다른 글
[인스타그램 클론코딩] 사용자 인증 & GraphQL Context 활용 (0) | 2020.05.22 |
---|---|
서버리스 GraphQL 백앤드 구성 (0) | 2020.05.22 |
서버리스 프레임워크 초기화 및 AWS에 연결 (4) | 2020.05.13 |
서버리스 프레임워크란? (0) | 2020.05.13 |