AWS/Serverless Lambda

[AWS Lambda] Python Serverless 서비스 (Chalice)

yubi5050 2023. 6. 6. 19:59

개요

AWS Lambda를 이용해 Python 기반의 Serverless 서비스를 개발 및 운영할 때, 주로 쓰이는 것으로 보이는 여러 방법(조합)이 있는데,

주로 많이 사용되는 방법은 다음과 같습니다.

 

해당 글에서는 Chalice에 서비스 구조에 대해 이해한 바를 작성하며, 다음과 같은 내용을 주로 작성해 보려고 합니다.

  • Chalice 방법의 특징
  • 구현 방법에 대한 개괄적인 설명

 

Serverless FaaS 서비스인 AWS Lambda 에 대한 이해는 다음 이전글을 참고

 

Chalice 란

공식 Github 링크

Chalice란 AWS 에서 만든 Lambda를 사용하는 애플리케이션을 빠르게 생성하고 배포하게 해주는 도구 프레임워크로 API Gateway, S3, SNS, SQS 및 기타 AWS 서비스에 대한 Event를 코드(Python)로 쉽게 핸들링 하기 위한 데코레이터 기반 API가 기본적으로 제공된다.

 

Chalice 특징

  • 로컬 단에서 CLI를 통해 쉽게 배포 가능
    - FastAPI + Manum의 경우 패키지를 압축해서 Layer로 연결했어야 됬는데, 명령어 하나로 자동으로 한번에 만들어줌
  • 배포 명령어시 API-Gateway / Lambda 자동으로 생성
    - REST API 형태의 구조로 가볍게 서비스를 만들어 사용 가능
  • FastAPI나 Flask 처럼 마이크로 프레임워크와 유사한 API 형태를 제공
  • 다른 AWS 서비스와의 연동 기능을 제공
  • yaml 파일 같이 부가적인 세팅 없이, python decorator로 쉽게 구현 가능

 

Chalice 구현 방법

구현 방법

구현 방법의 상세한 설명은 앞서 소개해드린 블로그들에 상세히 나와 있기에, 개괄적으로만 설명합니다.

 

1. 가상환경에 package 설치

- pip install chalice, boto3(필요시), 필요 패키지

 

2. aws 환경 준비

- iam 생성 및 권한 부여 / s3 bucket 생성 등 / 로컬에 aws credentials 관련 config key 등록

 

3.  새로운 프로젝트 생성

- chalice new-project <project name>

 

4. 비즈니스 로직 코드 작성 

from chalice import Chalice

app = Chalice(app_name="helloworld")

@app.route("/")
def index():
    return {"hello": "world"}

 

4-1. (필요시) .chalice/config.json 

- aws에서 env를 추가 할 수도 있지만 다음 config.json (environment_variables) 처럼도 가능 

{
  "version": "2.0",
  "app_name": "image-upload",
  "environment_variables": {
    "ACCESS_KEY":"<your access key>",
    "SECRET_KEY": "<your secret key>",
  },
  "stages": {
    "dev": {
      "api_gateway_stage": "api"
    }
  }
}

 

5. lambda 로 배포하기

- 다음 deploy 명령 실행시, 패키지와 소스코드, config 등 이 묶인 압축 파일(.zip)이  lambda로 배포됨

- 압축 파일은 deployments/ 하위에 생성됨

chalice deploy

 

6. lambda, api-gateway 확인

- 배포시 자동으로 생성된 lambda와 api-gateway 확인 

 

7. API 요청 및 Cloudwatch 로그 확인

- API 요청 후 자동으로 Cloudwatch에 실행 로그에 대해 확인 가능

 

추가 Chalice 기능 예제

1. S3 Event 구독

from chalice import Chalice

app = Chalice(app_name="helloworld")

# Whenever an object is uploaded to 'mybucket'
# this lambda function will be invoked.

@app.on_s3_event(bucket='mybucket')
def handler(event):
    print("Object uploaded for bucket: %s, key: %s"
          % (event.bucket, event.key))

 

2. SQS 서비스 event 구독

from chalice import Chalice

app = Chalice(app_name="helloworld")

# Invoke this lambda function whenever a message
# is sent to the ``my-queue-name`` SQS queue.

@app.on_sqs_message(queue='my-queue-name')
def handler(event):
    for record in event:
        print("Message body: %s" % record.body)

 

3. 주기적인 실행 작업

from chalice import Chalice, Rate

app = Chalice(app_name="helloworld")

# Automatically runs every 5 minutes
@app.schedule(Rate(5, unit=Rate.MINUTES))
def periodic_task(event):
    return {"hello": "world"}

 

그 밖에 다양한 예시들은 다음 링크에서 확인 가능하다.

AWS Chalice 공식 문서 링크

 

참고 문헌

https://cereme.dev/backend/chalice-vs-serverless/ : Chalice, serverless framework와 비교했을 때 장단점