Skip to main content

Serverless 프레임워크를 이용한 람다 프로그래밍 #1

핵심 강의

동영상 준비 중

강의 개요

Serverless 프레임워크과 AWS를 이용하여 웹 서버를 설치하거나 사용하지 않고 RESTful 방식으로 웹 프로그래밍하는 방법을 배웁니다.

강의 전 준비 사항

  • AWS 가입
  • "액세스키ID"와 "비밀액세스키"
  • nodejs & npm 설치

이 강의에서 다룰 내용

  • Serverless 프레임워크의 핵심 사용법
  • hello world 구현
  • mysql에서 테이블 정보를 가져와서 목록 표시하기

Serverless 프레임워크 설치 및 설정

우선 프로젝트를 시작할 폴더를 생성합니다. 저는 "D:\Work\temp"라는 폴더를 사용하였습니다. 여러분들은 여러분들이 원하는 폴더를 각자 선택하시면 됩니다.

D:\Work> mkdir temp D:\Work> cd temp

아래와 같이 터미널 창에서 Serverless 프레임워크를 설치합니다. 물론 nodejs와 npm이 설치되어 있어야 합니다.

D:\Work\Temp> npm install -g serverless

AWS의 람다와 s3 등을 사용할 수 있는 권한이 있는 보안키가 필요합니다. 이부분은 다른 강의에서 다루도록 하겠습니다.

키를 확보하였으면 터미널 창에서 아래와 같이 저장합니다. xxxxxx 대신 자신의 "액세스키ID"와 "비밀액세스키"를 입력하시면 됩니다.

D:\Work\Temp> serverless config credentials --provider aws --key xxxxxx --secret xxxxxx

이 강의에서는 aws의 람다를 이용하고 언어는 python3를 사용할 것입니다. 따라서 아래와 같이 터미널에서 프로젝트를 생성합니다.

D:\Work\Temp> serverless create -t aws-python3

프로젝트 생성이 완료되면 아래와 같이 3개의 파일이 생성됩니다. 이중에서 handler.py와 serverless.yml 파일 두 개가 중요합니다

yaml 파일 설정

우리가 만드는 프로젝트(서비스)에 대한 전반적인 설정을 시작합니다. serverless.yml 파일을 열어서 아래와 같이 수정합니다.

service: test

provider:
name: aws
region: ${opt:region, 'ap-northeast-2'}
runtime: python3.7

functions:
hello:
handler: handler.hello
events:
- http:
path: test/hello
method: get
cors: true
  • 1: 서비스 이름을 입력합니다. 작성하려는 프로젝트의 특징을 잘 나타내는 이름을 선택하시면 됩니다.
  • 5: 서비스 지역을 "ap-northeast-2"로 정하였습니다. 서울을 의미합니다.
  • 6: 사용할 언어는 python 3.7 버전입니다.
  • 8-15: 서비스에 포함 될 함수들의 목록입니다. 여기서는 hello 함수 하나만 정의하고 있습니다.
  • 9: 함수의 이름입니다. 함수의 기능이 잘 나타나도록 이름을 정하시면 됩니다.
  • 10: 외부에서 요청이 들어오면 실제로 실행할 함수의 이름입니다. 9: 라인의 이름과 동일하게 작성하시되 앞에 "handler."를 붙여주시면 됩니다.
  • 13: 이 함수를 요청할 때 사용될 주소입니다. "서비스이름/함수이름" 형식으로 표현했습니다.
  • 14: 호출 방식을 선택합니다. (GET, POST 등)
  • 15: 람다 함수와 도메인이 다른 곳에서도 사용할 수 있도록 CORS(Cross-Origin Resource Sharing)를 true로 설정해줍니다.

함수 작성

모든 준비과정이 끝나고 함수를 작성할 차례입니다. handler.py 파일을 열면, 아래와 같이 Serverless 프레임워크에서 자동으로 만들어 준 소스가 있습니다. 지금은 이 소스를 수정하지 않고 그대로 사용하겠습니다. (파일 안에는 주석 처리되어 실제로는 필요없는 코드가 더 있을 것입니다)

import json

def hello(event, context):
body = {
"message": "Go Serverless v1.0! Your function executed successfully!",
"input": event
}

response = {
"statusCode": 200,
"body": json.dumps(body)
}

return response
  • 3-14: serverless.yml 파일에서 정의한 hello 함수를 구현한 영역입니다. 외부에서 요청이 들어오면 이 부분이 실행되어 리턴(return)된 값이 전송됩니다.
  • 4-7: 요청한 클라이언트에게 전송할 메시지 부분입니다. 이부분은 여러분들이 전달하고 싶은 데이터 형식으로 마음대로 구성해도 됩니다.
  • 5: "message"라는 이름을 가지고 값이 "Go Serverless v1.0! Your function executed successfully!"인 메시지를 body 안에 포함합니다.
  • 6: "input"이라는 이름을 가지고 값이 event인 메시지를 body 안에 포함합니다. event는 hello(event, context) 함수의 파라메터입니다. 외부에서 요청할 때 함께 입력된 여러 정보가 포함되어 있습니다. (헤더 정보 및 사용자 정의 데이터 등)
  • 9-12: HTTP 프로토콜의 상태코드와 함께 메시지 body를 묶어 줍니다. 상태코드 200은 클라이언트의 요청을 성공적으로 처리했다는 의미입니다.
  • 14: 함수를 종료하고 결과를 리턴합니다. 즉, 메시지를 클라이언트에게 전달합니다.

배포

완성된 함수를 배포하기 위해서는 터미널 창에서 아래와 같이 입력해주시면 됩니다.

D:\Work\Temp> serverless deploy

완료되면 아래와 같은 메시지와 함께 함수를 호출할 수 있는 주소가 나타납니다.

주소를 웹 브로우져의 주소창에 복사해 넣고 엔터를 치면 함수를 호출하고 난 결과가 보입니다. event에 많은 내용이 포함되어 복잡해보이지만, message 항목과 해당 메시지 내용을 확인할 수 있을 것입니다.

https://fz33d5pzcc.execute-api.ap-northeast-2.amazonaws.com/dev/test/hello

파라메터를 포함해서 함수 실행하기

함수를 실행할 때 원하는 파라메터를 포함시키는 방법을 알아보겠습니다. 아래 링크를 보시면 이전 주소에 name이라는 파라메터를 추가하고 "Ryu"라는 값을 전달하고 있습니다.

https://fz33d5pzcc.execute-api.ap-northeast-2.amazonaws.com/dev/test/hello?name=Ryu

위의 주소처럼 코드에서 전달받은 인자를 처리하는 방법을 알아보겠습니다.

def hello(event, context):
values = event["queryStringParameters"]

body = {
"message": "Hello %s?" % values["name"]
}

response = {
"statusCode": 200,
"body": json.dumps(body)
}

return response
  • 2: 요청받은 파라메터는 "queryStringParameters"에 묶여서 전달됩니다. 이렇게 전달된 데이터를 values라는 변수에 대입시키도록 하겠습니다.
  • 5: 위에서 요청한 주소의 파라메터의 이름이 name이고 값은 "Ryu"이므로 values["name"]은 "Ryu"가 됩니다. 이것을 "message"의 값으로 넣어서 리턴하도록 합니다.

이제 다시 소스를 아래와 같이 터미널에서 실행하여 배포하도록 합니다.

D:\Work\Temp> serverless deploy

배포가 완료되면 아래 링크를 다시 한 번 클릭하여 함수를 실행합니다.

https://fz33d5pzcc.execute-api.ap-northeast-2.amazonaws.com/dev/test/hello?name=Ryu

name 파라메터의 값을 다른 것으로 변경하면 어떻게 되는 지 살펴보세요.

::: tip 파이선에서 아래와 같은 코드는

"Hello %s?" % values["name"]

아래와 같은 의미가 됩니다.

"Hello " + values["name"] + "?"

:::