본문으로 바로가기

원래 AWS에서 제공하는 것처럼 필요한 파일들을 압축하여 업로드하고 관련된 내용 등을 CLI 또는 웹 콘솔을 통해서 설정하여 구현할 수 있지만, 디버깅, 환경 설정, 배포 등의 이유로 프레임워크를 사용하는 게 좋습니다.

 

  • Serverless: 가장 유명하고 제공하는 기능이 많습니다. 문서화도 잘 되어 있는 편이고 Node.js, Python, Java, Scala를 지원합니다.
  • Apex: express.js를 개발한 TJ Holowaychuk이 만든 프레임워크. 배포 시 멱등성을 보장하며 가장 다양한 언어를 지원합니다. Node.js, Golang, Python, Java, Rust, Clojure를 지원합니다.
  • Chalice: AWS에서 개발한 프레임워크. Python을 지원하며 AWS Lambda와 API Gateway를 자동으로 설정해줍니다.
  • Zappa: 를 사용하기로 했습니다. Zappa는 Python 기반으로 AWS Lambda를 손쉽게 사용할 수 있게 하고 거기에 더해서 API Gateway까지 자동으로 설정해주어서 최종적으로 저희가 원하는 웹 서버를 간단하게 구축할 수 있는 도구입니다. (로켓 펀치가 사용 중)

 

https://www.serverless.com/framework/docs/getting-started/

 

Serverless Getting Started Guide

#Get started with Serverless Framework Open Source & AWS Getting started with Serverless Framework’s Open Source CLI and AWS takes only a few minutes. Install as a standalone binary, or with npm. #Install as a standalone binary #MacOS/Linux Run this comm

www.serverless.com

 

🚀 serverless 프레임워크 설치 (전역 설치 권장)

npm install -g serverless

 

🚀 servless 로그인 (optional)

하는게 편하더라구요 전.

serverless login

 

🚀 aws cli 사용과 serverless 원격 접속을 위해 IAM에서 access key 발급 받기

www.serverless.com/framework/docs/providers/aws/cli-reference/config-credentials/

root 계정을 이용해도 괜찮지만 권한을 제어하고 싶다면 IAM를 통해 부계를 파서 이용합시다.

다른 클라우드를 사용할 거라면 문서에 가서 직접 확인해보시길 바랍니다.

serverless config credentials --provider aws --key 액세스키ID --secret 비밀액세스키

 

저는 이미 aws cli로 세팅을 해줘서 그런지, overwrite하라는 경고가 떠서 해줬습니다.

 

 

🚀 Serverless 템플릿을 통하여 애플리케이션 생성 + deploy

www.serverless.com/framework/docs/providers/aws/cli-reference/create/

 

Serverless Framework Commands - AWS Lambda - Create

Creates a new Service in your current working directory

www.serverless.com

 

서버리스 프레임워크에서 제공하는 템플릿을 이용해서 어플리케이션을 생성해보겠습니다.

serverless create --t

 

아무 템플릿도 지정하지 않았기 때문에 오류를 내면서 무슨 템플릿을 supported 하는지 출력해줍시다.

엄청 많네요. tencent도 있고.. 저는 aws-nodejs를 사용하겠습니다.

Serverless: Generating boilerplate...
 
  Serverless Error ---------------------------------------
 
  Template "true" is not supported. Supported templates are:
    "aws-clojure-gradle", "aws-clojurescript-gradle", "aws-nodejs", "aws-nodejs-typescript", "aws-alexa-typescript", "aws-nodejs-ecma-script", "aws-python", "aws-python3"
    "aws-groovy-gradle", "aws-java-maven", "aws-java-gradle", "aws-kotlin-jvm-maven", "aws-kotlin-jvm-gradle", "aws-kotlin-nodejs-gradle", "aws-scala-sbt", "aws-csharp"
    "aws-fsharp", "aws-go", "aws-go-dep", "aws-go-mod", "aws-ruby", "aws-provided"
    "tencent-go", "tencent-nodejs", "tencent-python", "tencent-php"
    "azure-csharp", "azure-nodejs", "azure-nodejs-typescript", "azure-python"
    "cloudflare-workers", "cloudflare-workers-enterprise", "cloudflare-workers-rust"
    
    ... 중략
serverless create -t aws-nodejs -p [원하는 이름]

 

요란한 출력과 함께 지정한 이름의 폴더가 생성된 것을 확인할 수 있습니다.

handler는 말 그대로 invoke할 함수고, serverless.yml은 관련 설정들이 있습니다.

S3에 저장 등 다른 것과 연계할 때는 serverless.yml에서 설정을 손 봐주고 handler에서 코드를 작성하면 됩니다.

 

기본적으로 생성된 handler를 로컬에서 실행해봅시다. handler.js를 열어보니 hello라는 이름의 함수가 있군요.

'use strict';

// hello라는 이름의 함수가 자동 생성되었습니다.
module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

 

invoke로 로컬에서 실행해봅시다.

주의할 점이, 해당 함수를 실행해보고 싶으면 해당 경로로 먼저 이동한 후에 명령을 입력해야 합니다. 그렇지 않으면 에러도 아니고 그냥 아무 반응이 없습니다. (30분 삽질 ㅅㄱ)

(https://www.serverless.com/framework/docs/providers/aws/cli-reference/invoke-local/)

cd [생성한 이름]
serverless invoke local --function [실행하고자 하는 함수명]

cd hellolambda // 이동
serverless invoke local -f hello // 로컬에서 실행

 

로컬에서 잘 실행되는 것을 확인했다면 AWS에 해당 람다를 배포해봅시다.

배포 전 serverless.yml에서 설정들을 먼저 수정해야 합니다. flutter에서 yml을 써봐서 알겠지만 indent에 굉장히 민감합니다. 주의 합시다.

service: hellolambda

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

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

 

deploy에 성공하면 다음과 같은 주소가 나오게 됩니다.

... 중략
Serverless: Stack update finished...
Service Information
service: hellolambda
stage: dev
region: ap-northeast-2
stack: hellolambda-dev
resources: 11
api keys:
  None
endpoints:
  GET - https://어쩌구저쩌구.execute-api.ap-northeast-2.amazonaws.com/dev/hello
functions:
  hello: hellolambda-dev-hello
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

 

해당 endpoint로 접근해보면 잘 작동하는 것을 알 수 있습니다. 만세! 😎

 

 

🚀 deploy 이후 관리

 

AWS에 배포했으므로 AWS CloudFormation에서 확인할 수 있습니다.

 

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체