AWS Lambda개발 - Serverless Framework

AWS Lambda를 개발할 때 CLI로 개발할 수 있는 Serverless, APEX 같은 툴로 개발을 하게됩니다.
Serverless는 AWS, Google, MS, IBM등 주요 서버리스 서비스들을 다 제공하기 때문에
추후 확장성 면에서 좋을 것으로 예상되어 Serverless 사용법을 알아보려고 합니다.

serverless 설치

1
$ npm i -g serverless

aws credentials 설정

  • AWS Console에서 IAM에 들어 갑니다.
  • Users - Add user 클릭

    1. Details
      – User name에 serverless-cli 입력
      – Access type에서 Programmatic access체크
      – Next: Permissions 클릭

    2. Permissions
      – Attach exisiting policies directly 클릭
      – AdministratorAccess 체크
      – Next: Review 클릭

    3. Review
      – Create user 클릭

    4. Complete
      – Access key ID와 Secret access key 확인

  • Access Ky와 Secret access key 정보를 가지고 serverless의 credentials 설정 명령을 실행합니다.

1
$ sls config credentials --provider aws --key xxxxx --secret xxxx

AWS Node.js Template 생성

1
$ sls create --template aws-nodejs --path lambda-test --name lambda-test

위 명령을 실행하면 아래롸 같이 2개의 파일이 생성됩니다.

|-handler.js
|-serverless.yml

serverless.yml 파일 수정

AWS에 배포하기 위해서 serverless.yml 파일을 아래와 같이 수정 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
service: lambda-test # 서비스이름

provider:
name: aws
runtime: nodejs6.10
stage: dev
region: ap-northeast-2 # 서울 rigion
environment: # 전체 함수에서 사용할 수 있는 환경변수
variable1: value1

functions:
hello:
handler: handler.hello
events: # API Gateway 생성을 위한 설정
- http:
path: lambda-test
method: get
cors: true
environment: # 해당 함수에서 사용할 수 있는 환경변수
variable2: value1

resources:
Resources:
NewResource:
Type: AWS::S3::Bucket
Properties: # ${self:service}와 같이 변수로 사용가능
BucketName: ${self:service}-${self:provider.stage}-upload

get parameter를 받기 위해 hander.js 파일 수정

get parameter는 event객체의 queryStringParameters에 있습니다.

1
2
3
4
5
6
7
8
9
10
const param = event.queryStringParameters;

const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Your name is ' + param.name
}),
};

callback(null, response);

Local에서 Lambda 실행

생성된 함수를 AWS에 배포하기 전에 로컬에서 실행 시킬 수 있습니다.

1
$ sls invoke local -f hello

파라미터를 전달하기 위해서는 –path 옵션으로 json파일 경로를 지정해주는 방법과
–data 옵션으로 전달하는 방법이 있습니다.

1
2
$ sls invoke local -f hello --path data.json 
$ sls invoke local -f hello --data '{"queryStringParameters":{"name":"test"}}'

실행하면 아래 결과를 확인할 수 있습니다.

1
2
3
4
{
"statusCode": 200,
"body": "{\"message\":\"Your name is test\"}"
}

Local에서 Emulator 실행

로컬에서 에뮬레이터를 실행 할 수 있습니다.
http://localhost:4000/lambda-test
파이어베이스와 다르게 live-reload가 되지않아 조금 불편합니다.

1
$ sls run

배포 명령 실행

1
$ sls deploy

배포 완료 후 아래와 같은 정보가 나오게 되며 endpoints에 있는 주소로 접근하면 됩니다.

1
2
3
4
5
6
...

endpoints:
GET - https://7otlb5sfi5.execute-api.ap-northeast-2.amazonaws.com/dev/lambda-test
functions:
hello: lambda-test-dev-hello

삭제

Serverless로 배포한 모든 리소스를 삭제하기 위해서는 AWS console - CloudFormation에 들어갑니다.
Stack Name이 lambda-test-dev를 선택한 후 Action에서 Delete Stack을 클릭하면 관련 리소스들을 삭제합니다.

참고사항

  • S3버킷에는 총 2개의 버킷이 생성됩니다.
    (severless framework이 쓰는 버킷 1, serverless.yml파일의 resource에서 설정한 버킷 1)
  • Serverless를 통해 배포를 하면 Lambda, API Gateway, S3, CloudFormation을 사용하게 됩니다.

Resource