serverless framework로 간단한 CRUD 백엔드 어플리케이션 만들기 - 개념편

AUSG·2020년 7월 12일
6

Abstract

  • 본인의 프리랜스 과정에서 경험한 serverless framework를 이용해 간단한 CRUD 백엔드 어플리케이션을 만들어 보는 튜토리얼입니다.
  • 제 프리랜스 미션은 python으로 구현하는 것이었지만, node나 go 등의 훌륭한 언어를 통해서도 만들 수 있습니다.

클라우드 서비스를 처음 접하시는 분들이나 경험이 별로 없는 분들은 용어때문에 어렵게 느껴질 수는 있습니다만, 온디멘드 서버를 올리는 것과 원리는 크게 다르지 않습니다. 😎

serverless?

서버리스란 용어때문에 오해하기 쉽지만, 서버리스를 진짜 서버가 없는 아키텍쳐를 이야기하는 것은 아닙니다. 기존의 방식처럼 특정 작업을 처리하기 위해 서버나 가상머신을 설정하는 것이 아닌, amazon web services, Google Cloud Platform 등의 클라우드 서비스가 제공하는 인프라에 관련된 테스크들을 추상화한 서비스를 이용하여 코드에 집중할 수 있게 해주는 아키텍쳐를 뜻합니다.

가장 대표적인 클라우드 서비스인 aws (amazon web services)가 추상화한 여러가지 서비스들을 이용하여 쉽고 빠르게 MVP(최소기능제품)을 구현해볼 수 있습니다.

amazon web services가 제공하는 서비스인, aws Lambda와 Amazon API Gateway를 이용하여 API를 개발합니다. 데이터베이스는 aws가 제공하는 DynamoDB 를 사용해보겠습니다.

aws Lambda

코드를 저장해놓고 실행할 수 있는 런타임을 제공하는, 말그대로 함수와 같은 서비스입니다.

import json 
import os 

def lambda_handler(event, context): 
    # To-do 구현
    
    # 응답 리턴
    return { 
        'statusCode': 200, 
        'body': json.dumps('hello, world') 
    }

위와 같은 함수를 통해, 원하는 작업을 할 수 있습니다. 예를 들면,

import os
import json

import boto3
dynamodb = boto3.resource('dynamodb')


def lambda_handler(event, context):
    table = dynamodb.Table(os.environ['DYNAMODB_TABLE'])
    result = table.get_item(
        Key={
            'id': event['pathParameters']['id']
        }
    )
    return {
        "statusCode": 200,
        "body": json.dumps(result['Item'], ensure_ascii=False)
    }

위와 같이 aws의 DynamoDB 데이터베이스에서 id 변수를 통해 데이터를 받아서 다시 보내주는 함수를 만들 수 있습니다.

Amazon API Gateway

Aws Lambda에서 구현한 함수를 API로 만들기 위해 Amazon API Gateway를 사용합니다. Amazon API Gateway가 제공하는 Https엔드포인트를 통해 API를 호출하면 Amazon API Gateway가 우리가 만든 aws Lambda 함수를 호출하여 결과를 돌려줍니다.

Amazon DynamoDB

어떤 규모에서든 빠르고 유연한 NoSQL 데이터베이스 서비스

대규모 트래픽에도 강한 NO-SQL 데이터베이스입니다. NoSQL방식이기 때문에 확장이 간편하다는 장점이 있습니다. NoSQL 테이블 생성 및 쿼리를 참고한다면, DynamoDB와 NoSQL에 대한 간단한 이해를 도울 수 있습니다.

boto3 SDK

Python 환경에서 위와같은 aws 어플리케이션을 쉽게 사용할 수 있게 해주는 라이브러리(또는 Software Development Kit, SDK)입니다. (공식 홈페이지) 파이썬 코드 안에 boto3를 임포트하면 aws의 프로덕트를 편하게 사용할 수 있습니다.

import boto3

디플로이하는 법

serverless framework

설치

서버리스 프레임워크를 통해 deploy 과정을 자동화하려고 합니다. 서버리스 프레임워크 홈페이지에 들어가셔서 serverless framework opensource다운로드받으시기 바랍니다. 링크에는 다양한 설치 방법이 제시되어 있으니, 사용하는 환경에 맞게 선택하시면 됩니다.

프로젝트 초기화

serverless

serverless-boom
위처럼 나왔다면 성공입니다. Y를 입력하여 계속 진행해보겠습니다.

serverless-init
답변을 몇가지 하다보면 초기화된 프로젝트 폴더가 만들어졌습니다. 폴더 안에는 serverless.ymlhandler.py 가 들어가있네요. 이제 CRUD 작업을 할 어플리케이션을 만들 준비가 완료되었습니다. 😎

serverless.yml

service: svls-tutotrial

frameworkVersion: ">=1.1.0 <2.0.0"

provider:
  name: aws
  runtime: python3.8
  region: ${opt:region, 'ap-northeast-2'}
  environment:
    DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"

functions:
  create:
    handler: product/create.create
    events:
      - http:
          path: product
          method: post
          cors: true

  list:
    handler: product/list.list
    events:
      - http:
          path: product
          method: get
          cors: true

  get:
    handler: product/get.get
    events:
      - http:
          path: product/{id}
          method: get
          cors: true

  delete:
    handler: product/delete.delete
    events:
      - http:
          path: product/{id}
          method: delete
          cors: true

resources:
  Resources:
    productDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          -
            AttributeName: id
            AttributeType: S
        KeySchema:
          -
            AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.DYNAMODB_TABLE}

우리가 작성하고자 하는 어플리케이션의 아키텍쳐를 위와 같이 .yml로 정리할 수 있습니다. 찬찬히 읽어보시면 쉽게 이해할 수 있을거에요.

Handler 작성

위의 serverless.yml에 맞게 Handler를 작성할 수 있습니다.

#product/create.py
import json
import logging
import os
import time
import uuid

import boto3
dynamodb = boto3.resource('dynamodb')


def create(event, context):
    data = json.loads(event['body'])
    if 'name' not in data:
        logging.error("Validation Failed")
        raise Exception("Couldn't create the product item.")

    if 'price' not in data:
        logging.error("Validation Failed")
        raise Exception("Couldn't create the product item.")

    table = dynamodb.Table(os.environ['DYNAMODB_TABLE'])

    timestamp = str(time.time())
    
    item = {
        'id': str(uuid.uuid1()),
        'name': data['text'],
        'price': int(data['price']),
        'createdAt': timestamp,
        'updatedAt': timestamp,
    }

    # 데이터베이스에 작성
    table.put_item(Item=item)

    # 응답 
    return {
        "statusCode": 200,
        "body": json.dumps(item)
    }

    return response

이와 같이 CRUD 테스크들을 작성하시면 됩니다!

디플로이

AWS CLI

IAM

아마존 웹 서비스에 회원가입하게 되면, 그 계정은 루트(root) 계정입니다. AWS 계정에서 하나 이상의 IAM 사용자를 만들 수 있습니다. 팀에 새로 합류하는 사람이 있거나 AWS에 대한 API 호출이 필요한 새 애플리케이션을 생성할 때 IAM 사용자를 생성할 수 있습니다. 더 자세한 내용은 공식문서를 참고하세요🤔

IAM 사용자를 만들면 이 사용자에게 aws 접근 방식을 정해줘야 합니다. aws 아마존 웹 서비스를 이용하는 방법은 두 가지가 있습니다.

a. Console Access
일반적으로 웹 UI 에서 서비스를 이용하는 방식입니다. 처음 aws를 접한다면 Console Access 방식으로 체험하게 됩니다.

b. Programmatic Access
IAM 사용자가 aws에서의 API를 호출해야 하거나, AWS CLI 또는 Windows PowerShell용 도구을 사용해야 할 수 있습니다.

자, 그럼 IAM 사용자를 설정합시다. 이번 튜토리얼에서는 b. Programmatic Access 만 이용하면 충분합니다. 이제, Programmatic Access가 설정된 IAM 사용자를 AWS CLI 에 로그인하면 됩니다. 계정 발급 시 알려주는 Access key ID와 Secret access key를 잊어버리면 안됩니다.

AWS CLI

aws CLI 의 설치 문서를 참고하시기 바랍니다. 마찬가지로 문서에는 다양한 설치 방법이 제시되어 있으니, 사용하는 환경에 맞게 선택하시면 됩니다.

aws configure

를 입력하면 아래와 같이 답변하면 됩니다.

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-2
Default output format [None]: json

AWS CLI 준비는 모두 완료되었습니다!

serverless

지금까지 만든 어플리케이션을 aws에서 서비스하려면, 아래의 명령어만 입력하면 됩니다. 🎩 TA-DA!

serverless deploy

Author

변준석

profile
AWSKRUG University Student Group의 공식 벨로그 계정입니다. 멤버들이 돌아가며 글을 쓰고 있습니다.

1개의 댓글

comment-user-thumbnail
2020년 7월 15일

오~ 서버리스 프레임웍 편해보이네요

답글 달기