설명
공식 페이지의 설명은 다음과 같다.
Develop, deploy, troubleshoot and secure your serverless applications
with radically less overhead and cost by using the Serverless Framework.
대략적으로, Serverless Architecture 를 개발, 배포, 운영하는걸 편하게 해주는
일종의 추상화된 Framework라고 생각된다.
Serverless는 serverless 환경을 배포하고 운영하기 위한 도구다.
중요 개념
Functions
AWS Lambda, Azure Function 처럼, 각 Cloud provider에서 제공하는 Serverless function을 의미한다.
Events
위의 Functions을 실행하는 Trigger 역할을 한다.
Serverless Framework에서 이벤트 정의 시, AWS 기준으로 AWS에 이벤트를 자동 생성 및 Lambda와 연결한다. AWS 기준으로는 다음이 해당한다.
API Gateway, HTTP API, Websocket S3, DynamoDB, SQS Alexa, IoT Cloudwatch, Cloudfront, Cognito
이 외에도 각 Provider 마다 Events 역할을 하는 서비스는 다양하다.
Resources
Lambda가 사용하는 AWS의 Infra 영역이다.
AWS 기준, CloudFormation에서 정의 가능한 영역 모두가 해당한다.
All Resources are other AWS infrastructure resources which the AWS Lambda functions in your Service depend on, like AWS DynamoDB or AWS S3.
Services
Function의 모음.
Functions = Resources + Events
Services = Functions + Functions + …
A service is like a project. It’s where you define your AWS Lambda Functions, the events that trigger them and any AWS infrastructure resources they require, all in a file called serverless.yml.
Plugins
Serverless의 기능 확장을 할 때 사용한다.
A Plugin is custom Javascript code that creates new or extends existing commands within the Serverless Framework.
Installation
1
2
3
4
5
# Using npm
npm i -g serverless
# Using yarn
yarn add -g serverless
Create service from template
1
2
# ./project 하위에 Node.js template로부터 Service 생성
serverless create --template aws-nodejs --path project
프로젝트 구조
1
2
3
project
|- serverless.yml
|- handler.js
serverless.yml
Service는 하나의 프로젝트 단위라 생각하면 된다.
이를 구성하기 위한 파일이 serverless.yml이다.
본 파일에 모든 Function, Resource를 기재하면 된다.
이 yml파일을 쪼개서 Service 단위로 분할이 가능하다.
1
2
3
4
5
6
users
|- serverless.yml
posts
|- serverless.yml
comments
|- serverless.yml
본 파일에서 관리되는 설정은 다음과 같다.
- Service 선언
- Service에 들어가는 Function 정의
- Provider 정의
- AWS, GCP, Azure…
- Plugin 정의
- Event 정의
- Resource 정의
- Event에서 사용하는 Resource 자동 생성
- Variable을 활용한 설정 정의
파일의 기본 양식은 다음과 같다.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# serverless.yml
service: users
provider:
name: aws
runtime: nodejs12.x
stage: dev # Set the default stage used. Default is dev
region: us-east-1 # Overwrite the default region used. Default is us-east-1
stackName: my-custom-stack-name-${self:provider.stage} # Overwrite default CloudFormation stack name. Default is ${self:service}-${self:provider.stage}
apiName: my-custom-api-gateway-name-${self:provider.stage} # Overwrite default API Gateway name. Default is ${self:provider.stage}-${self:service}
profile: production # The default profile to use with this service
memorySize: 512 # Overwrite the default memory size. Default is 1024
deploymentBucket:
name: com.serverless.${self:provider.region}.deploys # Overwrite the default deployment bucket
serverSideEncryption: AES256 # when using server-side encryption
tags: # Tags that will be added to each of the deployment resources
key1: value1
key2: value2
deploymentPrefix: serverless # Overwrite the default S3 prefix under which deployed artifacts should be stored. Default is serverless
versionFunctions: false # Optional function versioning
stackTags: # Optional CF stack tags
key: value
stackPolicy: # Optional CF stack policy. The example below allows updates to all resources except deleting/replacing EC2 instances (use with caution!)
- Effect: Allow
Principal: "*"
Action: "Update:*"
Resource: "*"
- Effect: Deny
Principal: "*"
Action:
- Update:Replace
- Update:Delete
Resource: "*"
Condition:
StringEquals:
ResourceType:
- AWS::EC2::Instance
functions:
usersCreate: # A Function
handler: users.create
events: # The Events that trigger this Function
- http: post users/create
usersDelete: # A Function
handler: users.delete
events: # The Events that trigger this Function
- http: delete users/delete
# The "Resources" your "Functions" use. Raw AWS CloudFormation goes in here.
resources:
Resources:
usersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: usersTable
AttributeDefinitions:
- AttributeName: email
AttributeType: S
KeySchema:
- AttributeName: email
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
handler.js
여러 Function에 대한 코드가 구현되어 있는 부분이다.
Function 부분 부터는 다음 포스트에서 진행.