본문으로 바로가기

🚀 Functions as a Service (FaaS)

 

AWS Lambda, Azure Functions, Google Cloud Functions 등에서 서비스하고 있다. 필자는 AWS를 주로 이용하기 때문에 AWS Lambda를 이용해볼까 한다.

 

FaaS는 기본적으로 클라우드 업체와 같은 곳에서 만든 서버에 우리가 등록한 함수가 존재하며 특정 trigger나 interval 때 해당 함수를 실행하고 그 결과값만 받는 것이다.

 

우리가 직접 Node와 같은 도구를 이용해서 클라이언트에서 req를 받고, 로직을 처리한 다음 res를 보내주는 단계를 거칠 때 필요한 백엔드 서버를 외부에 위탁하는 것이다. 이는 Firebase와 같은 Baas와는 다르다.

 

특정 작업을 하기 위하여 서버를 준비하고 하루종일 켜놓는것이 아니라, 필요할때만 함수가 호출되어 처리되며 함수가 호출된 만큼만 비용이 드므로, 비용이 많이 절약되는 장점이 있습니다. 

 

콜드 스타트가 문제라던데?

콜드 스타트를 주지 않기 위해서 주기적으로 빈 요청을 보내는 경우가 종종 있었는데 이제는 의미가 없어졌다.

노드 기준 콜드 스타트는 0.4초다. 2년전 자료니 현재는 훨씬 더 빨라졌을 것이다.

그 짧은 시간조차 민감하게 받아들여야 하는 서비스라면 돈으로 해결이 가능하다. 예전처럼 주기적을 콜을 보내면 되니까. 그러나 무엇보다 콜드 스타트의 시간조차 염려해야하는 서비스인지를 먼저 묻는 것이 좋을 것이다.

 

mikhail.io/2019/03/visualizing-cold-starts/

 

Visualizing Cold Starts

Serverless cold starts illustrated with animated GIFs.

mikhail.io

 

기본

 

aws lambda는 클라이언트 -> API 게이트 웨이 -> 람다 -> 요청 처리로 동작합니다.

 

일반적으로 백엔드를 구성할 때, 클라이언트에서 백엔드 쪽으로 POST/GET 등 명령을 날릴 때의 백엔드 주소 역할을 API 게이트 웨이가 대신 처리하고, 백엔드 로직은 람다가 담당한다고 이해하면 될 것입니다.

 

람다 자체는 함수이기 때문에 서버처럼 동작하게 만들려면 API 게이트 웨이가 필수입니다.

(요새는 lambda@edge라고 cloudfront에 붙이고 api 게이트 웨이를 사용하지 않는 방법도 있다고는 합니다만 우선 기본적인 람다의 동작에 집중합시다)

 

 

🚀 AWS Lambda

 

Lambda에 접속한 후 "함수 생성"을 시작합시다.

사용할 런타임을 지정합시다. 저는 Node에 익숙하므로 Node를 선택했습니다.

 

런타임 생성 후에 "함수 생성"을 누르면 간단히 생성됩니다. 

 

이제 코드를 살펴볼까요. 간단히 문자열을 출력하는 람다 함수입니다. 이를 실행해보기 위해 상단부의 '테스트' 버튼을 눌러줍시다.

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

 

테스트를 돌려 보면 다음과 같은 결과를 받아볼 수 있습니다.

START와 END 사이에 출력값들이 보이고

REPORT를 통해서 람다를 얼마나 사용했고 청구되는 시간 Billed Duration은 얼마인지, 사용한 메모리 양은 어느 정도인지 등에 대해 알아볼 수 있습니다.

START RequestId: 091dae52-d36e-438b-8233-695a3e9cbb07 Version: $LATEST
2021-04-08T19:29:12.832Z	091dae52-d36e-438b-8233-695a3e9cbb07	INFO	저 이거 받았어요 { key1: '값1', key2: '안녕', job: 'programmer' }
2021-04-08T19:29:12.833Z	091dae52-d36e-438b-8233-695a3e9cbb07	INFO	programmer
END RequestId: 091dae52-d36e-438b-8233-695a3e9cbb07
REPORT RequestId: 091dae52-d36e-438b-8233-695a3e9cbb07	Duration: 50.38 ms	Billed Duration: 51 ms	Memory Size: 128 MB	Max Memory Used: 64 MB	Init Duration: 130.38 ms

 

cloudwatch를 통해서 언제, 어떤 정보가 날아왔는지 로깅된 것을 확인할 수도 있습니다

 

 

그런데 현재 이와 같은 req-res를 AWS 웹사이트 내부에서만 할 수 있습니다. 우리가 구현할 웹에서 이 Lambda를 이용하기 위해서는 http 주소를 할당해야 합니다. 일종의 엔드포인트인 셈입니다.

 

API Gateway를 통해 http 주소 할당 

 

좌측의 "트리거 할당"을 클릭합니다.

간단하게 트리거를 구성합니다. Rest api를 만드는 건 아니니까 http로 설정하고, 보안은 '열기'로 하겠습니다.

 

이제 해당 람다 함수에 api 게이트웨이가 붙은 것을 알 수 있습니다.

 

생성한 후의 정보를 살펴보면, API 엔드 포인트가 생긴 것을 볼 수 있습니다. 해당 포인트로 접속하면 람다 함수가 반응해서 우리에게 정보를 줍니다. 이렇게 간단히!

 

 

lambda 패키지 추가

간단한 함수가 아니라 다른 라이브러리를 곁들여 복잡한 함수를 람다로 사용하고 싶다면 어떻게 해야 할까요?

예를 들어, 현재 노드 기반으로 작업을 하고 있는데, 예전에 만들어 놓은 파이썬 크롤러 코드를 사용하고 싶다고 가정해봅시다.

import requests
from bs4 import BeautifulSoup

url = "https://www.google.com"

google_read = requests.get(url)
soup = BeautifulSoup(google_read.text, "html.parser")

a_tags = soup.find_all("a")
results_list = []
for i in a_tags:
  results_list.append(i.get_text())

print(results_list)

 

severless의 좋은 점 중 하나는, 현재 사용하고 있는 언어가 아닌 다른 언어의 패키지도 람다로 올린 후 결과를 받아볼 수 있다는 겁니다ㅣ

 

우선 빈 폴더 하나를 만든 다음 패키지를 설치합니다. 

pip install bs4 -t .

pip install requests -t .

이 파일을 zip으로 압축하여 람다에 올려주면 됩니다.

주의할 점은 패키지를 업로드할 경우 기존 내용이 사라진다는 것입니다.

그런데 설정에 보면 핸들러가 lambda_function.lambda_handler로 기본으로 등록된 것을 볼 수 있습니다. lambda_function 파일의 lambda_handler 함수가 핸들러라는 의미인데 이게 없어졌으니 핸들러를 만들어줘야 합니다.

 

import json
import requests
from bs4 import BeautifulSoup

def lambda_handler(event, context):
    
    url = "https://www.google.com"
    
    google_read = requests.get(url)
    soup = BeautifulSoup(google_read.text, "html.parser")
    
    a_tags = soup.find_all("a")
    results_list = []
    for i in a_tags:
      results_list.append(i.get_text())

    return {
        'statusCode': 200,
        'body': json.dumps(results_list)
    }

 

 

 

참고 자료)

 

이와 같이 AWS 웹에서 람다를 작성할 수도 있지만 보통은 serverless 프레임워크를 활용하여 에디터 내에서 함수를 생성하는 경우도 많습니다. 이와 관련해서는 다음 포스트를 참고합시다.

 

(https://darrengwon.tistory.com/476)

 

Serverless 프레임워크를 통해 serverless 구현하기

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..

darrengwon.tistory.com

 

[Serverless] 강좌 목록 | VELOPERT.LOG

 

velopert.com

 


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