Serverless Framework

zenibako.lee
6 min readApr 19, 2020

--

appsync

다소 불친절한 글 일 수 있습니다.

아직 글쓴이의 이해도가 부족한 탓일 수 도 있고,

아직 레퍼런스가 많이 없기 때문인 탓도 있습니다.

글을 읽다 궁금하신 부분이 있다면… 검색… 뿐입니다.

AWS AppSync

AWS의 서비스 중 하나로,

기존에 개별적으로 존재하던 AWS의 서비스들을 패키지 처럼 구성하여

`GraphQL 기반`의 서버리스 어플리케이션 서버를 구현,관리하도록 도와줍니다.

여러 서비스들이라고 하면, NoSQL데이터베이스인 DynamoDB,

AWS Lambda를 통한 편리한 펑션 관리 , IAM을 통한 권한관리 등등이 존재합니다.

https://aws.amazon.com/ko/appsync/

AWS 공식 사이트의 사진입니다. 다양한 유형의 클라이언트는 Appsync의 단 하나의 엔드포인트로 접근 (GraphQL)을 하여 reseponse를 얻게 되며,

Appsync는 필요에 따라 구성해놓은 여러 AWS 서비스들을 사용하여 요청에 따른 처리를 합니다.

Appsync를 사용하다보면, 람다처럼 모든 리소스들을 웹상에서 관리할 수 있습니다. 그러기 위한 GUI들이 꽤나 잘 구성되어 있습니다.

그러나 소스 코드를 로컬에서 관리하고, 테스트하고, CLI로 간편하게 Appsync 서버를 배포할 수 있다면 어떨까요?

Serverless Framework

서버리스 프레임워크는 이러한 고민을 해결해줍니다.

serverless.yml 파일을 통해

AWS appsync 어플리케이션의 설정을 합니다.

functions:   
hello:
handler: handler.hello
events:
- http:
path: hello
method: get

이것은 예시로 작성해본 yml파일의 functions항목입니다.

해당 항목은 이 서버에서 구성할 lambda function들을 정의합니다.

/hello 라는 path로 http get request event가 발생할 경우,

hanlder.js의 hello라는 함수가 작동을 하게 됩니다.

람다함수의 기본구조

Serverless-offline

로컬에서 기껏 구성한 서버리스 서버를 확인하기 위해서,

sls deploy

로 앱싱크에 실제로 배포를 해야 하는 수고를 매번 해야한다면,

시간의 낭비가 발생하게 됩니다.

로컬에서 구성한 서버리스 서버를 로컬 환경에서 테스트할 수 있도록 해주는 것이 ‘serverless-offline’입니다.

serverless-offline package를 설치한 뒤 .yml파일에 플러그인으로 추가를 해줍니다.

plugins:
- serverless-offline

이후

serverless는 해당 디렉토리에서 serverless offline이라는 옵션이 추가가 됩니다.

serverless offline start

이라는 명령어를 통해, 내가 구성한 설정으로 로컬환경에서 배포를 할 수 있습니다.

Serverless-dynamodb-local

내가 로컬환경에서 배포를 해봐야

source로 사용하는 DB는 여전히 aws의 dynamodb와 연결이 되어있을 것이다.

그런데 이 dynamodb마저 로컬에서 생성/연결을 할 수 있다.

sls dynamodb install

해당 명령어를 실행하면,

프로젝트의 루트디렉토리에 dynamodb 폴더가 생성되며, 로컬에 dynamodb를 생성할 수 있다.

custom:
myStage: ${opt:stage, self:provider.stage}
myRegion: ${opt:region, 'us-west-1'}

이후 yml에 custom 이라는 key값을 통해

내가 필요한 변수를 선언할 수 있다.

opt:stage의 경우 sls offline start 명령어를 실행할 때

stage라는 항목으로 부여하는 변수를 받게 된다.

해당 옵션이 없는 경우, yml파일에 존재하는 provider의 stage를 참조한다.

custom: 
dynamodb:
start:
port: 8000
inMemory: true
migration: true
seed: true
}
}
}

혹은 위와 같이 선언하면,

sls dynamodb start를 할 경우 해당 옵션에 따라 진행이 된다.

migration을 true로 줬기 때문에,

resources:
Resources:
myTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: myRealTable
KeySchema:
- AttributeName": attr_1
KeyType: HASH
AttributeDefinitions:
-AttributeName: attr_1
AttributeType: S
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1

start와 동시에 myRealTable이라는 테이블을 생성하고, myTable이라는 변수로 해당 테이블을 참조를 한다.

또한 seed옵션을 true로 주어서 seed date를 구성하는것도 가능하다.

custom:
dynamodb:
seed:
domian:
sources:
-table: myRealTable
sources: [./myRealTableSeed.json]
//myRealTableSeed.json
[
{
"id":"hong",
"name":"gildong"
}
]

이렇게 .json파일로 저장한 seed data를 해당 테이블에 넣어줄 수 있다.

물론 keySchema항목과 맞춰서 넣어주는 것이 좋다.

--

--

zenibako.lee
zenibako.lee

Written by zenibako.lee

backend engineer, JS, Node, AWS

No responses yet