본문 바로가기
AWS

[Lambda] Serverless 프레임워크 사용하기

by yonikim 2021. 5. 18.
728x90

요새 서버리스가 핫하다. 예전부터 핫했나..? 서버리스(serverless) 와 관련된 이야기를 시작하기 전에 클라우드 컴퓨팅과 관련된 용어를 먼저 정의하고 가자.

 

 


클라우드 컴퓨팅


클라우드 컴퓨팅은 서로 다른 물리적인 위치에 존재하는 컴퓨터들의 리소스를 가상화 기술로 통합해 제공하는 기술을 말한다.  

 

IaaS (Infrastructure as a Service)
클라우드 인프라스트럭처 서비스는 확장성이 높고 자동화된 컴퓨팅 리소스(서버, 네트워크, OS, 스토리지 등)를 가상화하여 제공하는 것이다. IaaS 제공업체는 서버, 하드 드라이브, 네트워킹, 가상화 및 스토리지를 관리하고 고객은 OS, 미들웨어, 애플리케이션 및 데이터와 같은 자원들을 관리해야 한다. 대표적인 예로는 AWS, Microsoft Azure, Google Cloud 등이 있다. 

 

※ PaaS (Platform as a Service)
클라우드 플랫폼 서비스는 주로  응용 프로그램을 개발할 때 필요한 플랫폼을 제공하는 것이다. PaaS 는 고객에게 OS, 미들웨어, 런타임과 같은 소프트웨어 작성을 위한 플랫폼을 가상화하여 제공하고 관리한다. 이 가상화된 플랫폼은 웹을 통해 제공되며 개발자는 운영체제, 소프트웨어 업데이트, 저장소 또는 인프라에 대한 관리없이 소프트웨어 개발에만 집중할 수 있다. 대표적인 예로는 Heroku, OpenShift 등이 있다.

 

※ SaaS (Software as a Service)
클라우드 애플리케이션(소프트웨어) 서비스는 사용자에게 제공되는 소프트웨어를 가상화하여 제공하는 것이다. SaaS 를 통해 서비스를 공급하는 업체는 데이터, 미들웨어, 서버 및 스토리지와 같은 모든 잠재적인 기술적 문제를 관리하기 때문에 고객은 유지보수 및 자원을 간소화하면서 비즈니스에 집중할 수 있다. 대표적인 예로는 Dropbox, Google Apps 등이 있다. 

 

 

 


서버리스 컴퓨팅


 

서버리스 컴퓨팅은 개발자가 서버를 관리할 필요 없이 (인프라에 신경 쓰지 않고) 코드를 작성하고 배포할 수 있는 클라우드 플랫폼이다. 서버리스는 BaaS 혹은 FaaS 에 의존하여 작업을 처리하게 된다.

 

※ BaaS (Backend as a Service)
앱 개발에 있어서 필요한 다양한 기능들(데이터베이스, 소셜 서비스 연동, 파일시스템 등)을 API 로 제공해줌으로서, 개발자들이 서버 개발을 하지 않고서도 필요한 기능을 쉽고 빠르게 구현할 수 있게 해주는 서비스이다. (보통 백엔드 로직들이 클라이언트 쪽에 구현된다.) 대표적인 예로는 Firebase 가 있다. 

 

※ FaaS (Function as a Service)
프로젝트를 여러개의 함수로 쪼개서 (혹은 한개의 함수로 만들어서) 거대하고 분산된 컴퓨팅 자원에 이 함수들을 등록하고, 이 함수들이 실행되는 횟수 및 시간 만큼 비용을 내는 방식을 말한다. 대표적인 예로는 AWS Lambda, Azure Functions, Google Cloud Functions 및 IBM OpenWhisk가 있다.

 


Serverless 프레임워크 사용하기


 

나는 Serverless 프레임워크를 사용하여 AWS Lmabda 에 배포할 것이다. 

 

1. 서버리스용 폴더 만들기

$ mkdir serverless-test
$ cd serverless-test

 

2. 서버리스 프레임워크 설치하기

$ npm install -g serverless

 

3. 서버리스 템플릿 생성하기

$ sls create --template aws-nodejs-ecma-script

 

4. 파일 작성하기

 

▷ handler.js

export const test = (event, context, callback) => {
  const p = new Promise((resolve) => {
    resolve('success')
  })
  p.then(() =>
    callback(null, {
      message: 'Hello! Serverless Test',
      event,
    })
  ).catch((e) => callback(e))
}

 

▷ serverless.yml

service:
  name: serverless-test

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

functions:
  lambda-function-name: # 람다함수명
    handler: handler.test # 작성한 파일명.함수명
    memorySize: 512 # 메모리크기 디폴트는 1024 MB
    timeout: 30 # 타임아웃 디폴트는 6초
    events:
      - schedule:
          rate: cron(0 21 * * ? *) # AWS CloudWatch 스케쥴 이벤트 (UTC 기준이니 참고)

 

AWS 의 다른 서비스를 이용하기 위해선 IAM Role 이 필요한데, 이미 만들어둔게 있다면 아래와 같이 ARN 을 기재해 주거나 

...
provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-2
  stage: stg
  role: arn:aws:iam::${AWS_ACCOUNT_NUMBER}:role/LambdaIAMRole
...

 

설정파일에서 직접 IAM Role 을 만들 수도 있다.

...
provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-2
  stage: stg
  role: LambdaIAMRole
...
resources:
  Resources:
    LambdaIAMRole:
        Type: AWS::IAM::Role
        Properties:
          RoleName: LambdaIAMRole
          AssumeRolePolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Principal:
                  Service:
                    - lambda.amazonaws.com
                Action: sts:AssumeRole
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
          Policies:
            - PolicyName: LAMBDA-POLICY-NAME
              PolicyDocument:
                Version: '2012-10-17'
                Statement:
                  - Effect: Allow
                    Action:
                      - logs:CreateLogGroup
                      - logs:CreateLogStream
                      - logs:PutLogEvents
                    Resource:
                      - 'Fn::Join':
                          - ':'
                          - - 'arn:aws:logs'
                            - Ref: 'AWS::Region'
                            - Ref: 'AWS::AccountId'
                            - 'log-group:/aws/lambda/*:*:*'
                  - Effect: "Allow"
                    Action:       
                      - "s3:Get*"
                      - "s3:List*"
                    Resource: 
                      - "arn:aws:s3:::bucket/*"

 

5. 배포하기

$ sls deploy

 

 

728x90