BEPRO Dev Team

BEPRO에서 파이썬 서버리스 서비스가 운영되는 방식 (EN)

서버리스 플랫폼을 사용하여 개발하면 어떤 이점이 있나요?

2022. 9. 20.


BEPRO의 대부분의 백엔드 서비스는 Python으로 작성되었습니다. 메인 API 서비스는 그 중 하나입니다. 이 서비스는 현재 서버리스 아키텍처로 운영되고 있으며, 저희는 이를 Zappa, 서버리스 오픈소스 관리 도구를 통해 배포하고 있습니다.

이 글에서는 BEPRO에서 파이썬 서버리스 서비스가 어떻게 작동하는지 간단히 소개하고자 합니다.

서버리스란 무엇인가요?

BEPRO에서 서버리스에 대해 이야기하기 전에, 서버리스 자체에 대해 간략하게 살펴보는 것이 좋을 것 같습니다. 먼저, "빅 3" 클라우드 벤더들이 서버리스에 대해 무엇을 말하고 있는지 살펴보겠습니다.

아마존 AWS

서버에 대해 생각할 필요 없이 애플리케이션을 구축하고 실행하세요

AWS는 여러 서버리스 서비스를 제공합니다. (람다, API 게이트웨이, 오로라 서버리스 등)

구글 클라우드

확장성이 뛰어난 애플리케이션과 기능을 완전 관리형 서버리스 플랫폼에서 개발하고 배포하세요.

그들은 또한 일부 서버리스 서비스를 제공합니다.(클라우드 런, 클라우드 함수 등)

MS 애저

서버리스라는 이름은 인프라 프로비저닝 및 관리에 관련된 작업이 개발자에게 보이지 않는다는 사실에서 유래합니다.

마지막으로, Martin Fowler의 블로그 (martinfowler.com), 제가 가장 좋아하는 기술 블로그 중 하나인, 또한 서버리스에 대해 이야기합니다.

서버리스는 이 분야에서 지배적인 이름이 되었고, 다음의 탄생으로 이어졌습니다. 서버리스 컨퍼런스 시리즈와, 다양한 서버리스 공급업체들이 제품 마케팅부터 채용 공고에 이르기까지 모든 곳에서 이 용어를 받아들였습니다.

결과적으로, 위에서 논의된 "빅 3"와 같은 클라우드 벤더가 제공하는 서버리스 서비스를 통해, 서버리스를 "개발자가 인프라에 대해 걱정할 필요 없이 개발할 수 있는 환경"으로 생각하는 것이 좋습니다. 또한, 위에 언급된 martinfowler.com 아티클은 서버리스의 개념, 장점 및 단점을 자세히 설명하고 있으므로, 관심이 있다면 다음으로 넘어가기 전에 이 아티클을 읽어볼 것을 강력히 권합니다.

BEPRO는 왜 서버리스를 채택했을까요?

BEPRO는 왜 서버리스 환경을 도입했는가?

제한된 개발 자원

가장 중요한 이유 중 하나는 사업 초기 제한된 리소스를 최대한 효율적으로 활용해야 했던 BEPRO의 상황입니다. 당시 서비스가 얼마나 빨리 성장할지 확신할 수 없었기 때문에, 새로운 DevOps 개발자를 고용하는 대신 소수의 개발자들이 인프라를 최대한 고려하지 않고도 제품을 개발하고 운영할 수 있는 환경이 필요했습니다.

API 트래픽 패턴

이것은 주말 동안 세 시간 동안 (매초 측정되는) 일반적인 API 호출 패턴입니다. 서버는 아주 짧은 시간 동안 평소 요청의 10배에서 20배를 처리합니다. 이것은 (경기 일정에 따라) 매우 불규칙합니다. 일반적인 상황에서는 비교적 적은 인프라 리소스로 이 트래픽을 처리하기에 충분하지만, 피크 시간대에 동일한 성능을 보장하기 위해 짧은 시간 동안 리소스는 스케일 아웃 또는 스케일 업되어야 합니다. 이러한 트래픽 패턴은 주말/주중 및 계절적/비계절적 기간에 따라 매우 불규칙합니다.

이 상황에서, 우리는 피크 트래픽을 처리할 수 있는 인프라 리소스를 유지하거나, 자동 스케일링 환경을 구성해야 합니다. 전자의 경우 비용이 낭비되고, 후자의 경우 리소스가 확장되면서 트래픽이 이미 감소했기 때문에 너무 늦게 스케일 업 또는 스케일 아웃될 수 있습니다. 위에서 언급했듯이, 이러한 요인들을 고려할 때 인프라를 관리하는 데 있어 우리의 리소스(특히 개발자)는 상당히 제한적이었습니다.

서버리스 환경에서는 서버리스 서비스를 제공하는 클라우드 벤더가 자체적으로 인프라를 관리하므로 개발자는 이러한 트래픽 패턴에 대해 걱정할 필요가 없습니다. 서버리스 방식을 채택함으로써 저희 개발자들이 비즈니스 로직과 기능 개발에 집중할 수 있을 것이라고 생각했습니다. 서버리스 덕분에 새로운 기능도 빠르게 출시할 수 있었습니다.

비용

시스템 운영 관점 외에도, AWS 서버리스 환경과 기존 서버 환경의 예상 비용을 대략적으로 비교해 보았습니다. (RDS, 로드 밸런서, S3와 같은 특정 비용은 대략적인 추정 목적으로만 고려되지 않았습니다.)

가정: 2,000,000회 요청 / 월

우리는 AWS 서버리스 환경이 약 70% 더 저렴하다는 것을 알 수 있습니다.

BEPRO는 동시 실행 수 제한, 실행 시간 제한, 콜드 스타트 지연 등 몇 가지 단점에도 불구하고 서버리스 환경을 도입했습니다. (서버리스의 일반적인 장단점 보기.)

BEPRO의 서버리스 아키텍처

저희는 AWS 서버리스 서비스를 사용하기로 결정했습니다. BEPRO의 아키텍처는 아래에 간략하게 나와 있습니다. (CDN, S3 등과 같은 세부 정보는 서버리스 환경만 보여주기 위해 생략되었습니다.)

우리는 글로벌 서비스를 제공하기 위해 유럽과 아시아를 여러 지역으로 구성하여 API 응답 지연 시간을 최적화하려고 노력했습니다. 우리는 또한 도커 컨테이너를 사용하여 람다 환경을 배포했습니다. 이 모든 서버리스 관리는 오픈 소스 도구인 Zappa에 의해 이루어집니다.

Python 웹 서비스를 Zappa로 배포하기

이제, Zappa를 사용하여 파이썬 웹 서비스를 배포할 것입니다.

Zappa 없이 AWS 서버리스에 웹 서비스를 배포하면, IAM 역할, 코드 패키징, API Gateway/Lambda 설정 등과 같이 고려해야 할 사항이 너무 많아서 골치 아플 것입니다. — 이 모든 것을 Zappa가 자동으로 처리해 줍니다.

Zappa를 이용하여 Docker 기반 서버리스 Python Django 웹 서비스를 배포하는 방법을 알아봅시다.

장고 프로젝트 설정

먼저, Python 가상 환경을 생성하고 Django를 설치하십시오.

(venv)> pip install django

Django 프로젝트를 만드세요.

(venv)> django-admin startproject zappa-example
(venv)> cd zappa-example

허용된 호스트는 Django 설정에서 수정되었습니다. 또한, 이 예시를 원활하게 실행하기 위해 데이터베이스 관련 설정을 주석 처리했습니다.

... (건너뛰기) ...
ALLOWED_HOSTS = ["*"]
... (건너뛰기) ...
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': 'mydatabase',
#     }
# }... (건너뛰기) ...

로컬 환경에서 Django 서버를 실행하세요.

(venv) python manage.py runserver

StatReloader로 파일 변경 감시 중
시스템 점검 수행 중...


시스템 점검 결과 문제가 발견되지 않았습니다 (0개 무시됨).

적용되지 않은 마이그레이션이 18개 있습니다. 앱(admin, auth, contenttypes, sessions)에 대한 마이그레이션을 적용하기 전까지는 프로젝트가 제대로 작동하지 않을 수 있습니다.
이를 적용하려면 'python manage.py migrate'를 실행하세요.
2022년 6월 14일 - 15:09:23
Django 버전 4.0.5, 'zappa_example.settings' 설정을 사용 중
개발 서버를 에서 시작 중
CONTROL-C를 눌러 서버를 종료합니다.

우리는 브라우저를 통해 로컬 Django 서버에 연결할 수 있습니다. (이 예시에서는 어떤 기능도 구현하지 않고, 단순히 Django 관리자 로그인 페이지에 접속하여 테스트할 것입니다.)

Zappa 설정

우리는 Zappa 설정을 완료하기 전에 AWS 자격 증명을 설정해야 합니다.

먼저, awscli를 설치하세요.

> pip install awscli

aws configure 명령어를 사용하여 AWS 자격 증명을 설정하세요.

> aws configure

위에서 생성한 파이썬 가상 환경에 Zappa 라이브러리를 설치하세요.

(venv)> pip install zappa

Zappa를 초기화하기 전에, 의존성을 지정하기 위해 requirements.txt 파일을 생성합니다. (이는 나중에 Docker로 배포하는 데 사용될 것입니다.)

(venv)> pip freeze >> requirments.txt

자파를 초기화합니다.

(venv)> zappa init

자파(Zappa) 설정의 대화형 모드로 들어갑니다. 저는 기본값으로 진행했습니다. 대화 중에 주목할 점은 자파(Zappa)가 저희 디렉토리가 Django 프로젝트임을 인식하고 자동으로 설정했다는 것입니다.

ls

(venv)> ls
db.sqlite3          manage.py           zappa_example      
zappa_settings.json

zappa_settings.json 파일이 생성되었습니다. 해당 파일의 내용을 확인해 봅시다.

{
   "개발": {
       "AWS 지역": "ap-northeast-2",
       "장고 설정": "zappa_example.settings",
       "프로필 이름": "기본값",
       "프로젝트 이름": "zappa-example",
       "런타임": "python3.8",
       "S3 버킷": "zappa-yyamukhwg"
   }
}

스테이지 개발이 생성되었습니다. (기본값.) 여러 스테이지(스테이징, 프로덕션 등)를 생성할 수 있으며 각각 배포할 수 있습니다.

aws_region : 배포될 AWS 리전.
django_settings : Django 프로젝트인 경우, Django 설정 파일 경로를 지정합니다.
profile_name : AWS CLI 구성 프로필.
project_name : Lambda 함수용 프로젝트 이름.
runtime : Lambda용 런타임 환경 (Docker 이미지로 배포하는 경우 필요 없음).
s3_bucket : 배포 패키지(zip 파일)를 업로드할 s3 버킷.

Zappa 배포는 매우 쉽습니다.

(venv)> zappa 배포 dev

... (생략) ...
배포 완료!:

코드를 zip 파일로 압축하고, S3 버킷에 업로드하고, Lambda 함수를 생성하고, API Gateway 등을 설정하는 작업 — Zappa는 단 하나의 명령으로 여러 배포 프로세스를 처리합니다.

마지막 출력 URL을 사용하여 관리자 페이지에 접근할 수 있는지 확인할 수 있습니다. (정적 파일이 배포되지 않았기 때문에 스타일이 적용되지 않습니다.)

우리는 배포된 애플리케이션을 완전히 제거할 수 있습니다.

`(venv)> zappa 배포 해제
`

다음으로, 우리는 Docker 이미지로 배포할 예정입니다.

도커 이미지 빌드하기

Dockerfile 생성

FROM amazon/aws-lambda-python:3.8  # 1

ARG FUNCTION_DIR="/var/task/"

WORKDIR ${FUNCTION_DIR}

COPY ./ ${FUNCTION_DIR}

# 패키지 설치
RUN pip install -r requirements.txt

# zappa handler.py를 가져와서 작업 디렉토리에 넣기
RUN ZAPPA_HANDLER_PATH=$( \\
   python -c "from zappa import handler; print (handler.__file__)"
\\
   ) \\
   && echo $ZAPPA_HANDLER_PATH \\
    && cp $ZAPPA_HANDLER_PATH ${FUNCTION_DIR}

CMD [ "handler.lambda_handler" ]  # 2

우리는 AWS에서 제공하는 람다 기반 이미지를 사용했습니다(보기)

#2 : Zappa가 제공하는 람다 핸들러를 실행합니다. (이는 API Gateway 요청을 처리하고 Django 서버로 라우팅합니다.)

이미지를 빌드하기 전에 Docker 배포를 위한 설정 파일을 생성하세요.

(venv)> zappa 파이썬 설정 파일 저장 dev

자파 저장-파이썬-설정-파일 <스테이지_이름> 형식

일반적으로 zip 파일 기반 Zappa 배포에서는 파이썬 설정 파일이 zip 파일에 패키징됩니다. 동일한 파일(zappa_settings.py)이 생성되고 Docker 이미지에 포함될 것입니다.

이제 이미지를 구축하세요.

> docker build -t zappa-example:latest .

도커 이미지 푸싱

AWS ECR 리포지토리 생성

aws ecr create-repository --repository-name zappa-example --image-scanning-configuration scanOnPush=true

다시 태그 지정.

docker tag zappa-example:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast-2.amazonaws.com/zappa-example:latest

위에서 생성한 AWS ECR에 로그인합니다.

> 에이더블유에스 이씨알 로그인-비밀번호-가져오기 | 도커 로그인 --사용자이름 AWS --비밀번호-표준입력 XXXXXXXXXXXX.dkr.ecr.ap-northeast-2.amazonaws.com/zappa-example

ECR에 이미지를 푸시합니다.

> docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-2.amazonaws.com/zappa-example:latest

Docker 이미지로 배포하기

마지막으로, 도커 이미지를 사용하여 서버리스 웹 서비스를 AWS 서버리스에 배포합니다.

(venv)> zappa deploy dev -d XXXXXXXXXXXX.dkr.ecr.ap-northeast-2.amazonaws.com/zappa-example:latest

... (건너뛰기) ...
배포 완료!:


출력 URL에 접속하여 배포가 성공했는지 확인합니다.

만약 귀하가 이미 애플리케이션을 배포했다면, 다음 명령어를 사용하여 AWS에 최신 애플리케이션 코드를 업데이트해야 합니다.

(venv)> zappa save-python-settings-file dev
> docker build -t XXXXXXXXXXXX.dkr.ecr.ap-northeast-
2.amazonaws.com/zappa-example:latest .
> docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-
2.amazonaws.com/zappa-example:latest
(venv)> zappa update dev -d XXXXXXXXXXXX.dkr.ecr.ap-northeast-
2.amazonaws.com/zappa-example:latest

zappa deploy 대신에 zappa update를 사용하세요

SSL이 적용된 사용자 지정 도메인

저희는 도메인에 AWS Route 53을(를) 사용하고, SSL 인증서에는 AWS Certificate Manager를 사용할 것입니다.

저는 도메인 및 인증서가 완전히 발급되었다고 가정합니다.

먼저, zappa_settings.json을(를) 수정하여 도메인 및 certificate_arn 값을 추가하세요.

{
   "dev": {
       "aws_region": "ap-northeast-2",
       "django_settings": "zappa_example.settings",
       "profile_name": "default",
       "project_name": "zappa-example",
       "s3_bucket": "zappa-yyamukhwg",
       **"domain": "zappa.cwoojin.com",**
       **"certificate_arn": "arn:aws:acm:us-east-
1:XXXXXXXXXXXX:certificate/eba3fd6b-a1f4-4e6a-b5d6-fe7aa8c88649"**
   }
}


BEPRO 네트워크는 예측 시장, 스포츠 베팅, 카지노 게임 등을 위한 인프라를 제공하는 자율적인 빌더 및 운영자로 구성된 분산형 네트워크입니다.

BEPRO 네트워크는 예측 시장, 스포츠 베팅 및 기타 분산형 게임 애플리케이션을 구축하고 운영하기 위한 포괄적인 도구 스택을 제공합니다.

다음을 포함합니다:

  • 예측 시장을 생성하고 관리하기 위한 프로토콜.

  • 스포츠 베팅 애플리케이션을 구축하고 운영하기 위한 도구 모음.

  • 카지노 게임을 개발하고 배포하기 위한 프레임워크.

  • 타사 애플리케이션과 통합하기 위한 API 세트.

BEPRO 네트워크는 거래 수수료 지불, 운영자 보상, 거버넌스 참여에 사용되는 BEPRO 토큰으로 구동됩니다.

BEPRO 토큰은 또한 예측 시장, 스포츠 베팅 및 카지노 게임에 스테이킹하는 데 사용됩니다.

더 많은 정보는 BEPRO 네트워크 웹사이트를 방문하십시오.

(venv)> zappa certify
(venv)> zappa update dev -d XXXXXXXXXXXX.dkr.ecr.ap-northeast-
2.amazonaws.com/zappa-example:latest

..(skip)...
업데이트된 Zappa 배포가 활성화되었습니다!: ()

등록된 도메인에 대한 연결이 성공적인지 확인합니다. (https://zappa.cwoojin.com.)

기본 배포 설정이 이제 완료되었습니다.


게임 제작을 위한 Web3.0 운영 체제.

BEPRO는 누구나 자신만의 게임 플랫폼을 구축할 수 있도록 지원하는 탈중앙화 자율 조직입니다.

우리는 SDK, API 및 도구의 완전한 스위트를 구축하고 있습니다.

BEPRO에서 구축하기

BEPRP에서 자파 설정

제가 BEPRO에서 사용하는 zappa_settings.json의 일부를 공유합니다.

BEPRO는 여러 단계(개발, 테스트, 운영 등)로 나뉜 배포 환경을 운영합니다.

고급 Zappa 사용법에 대한 Zappa 공식 문서를 참조하십시오.

{
 "dev": {
   "aws_region": "eu-central-1",
   "django_settings": "xxx",
   "project_name": "xxx",
   "s3_bucket": "xxx",
   "environment_variables": {
     ...
   },
   "certificate_arn": "xxx",
   "domain": "xxx",
   "route53_enabled": false,    "cors": {
     "allowed_headers": [xxx]
   },
   "exception_handler": "xxx",
   "keep_warm_expression": "xxx",
   "memory_size": xxx,
   "payload_compression": xxx,
   "payload_minimum_compression_size": xxx,
   "lambda_description": "xxx",
   "vpc_config": {
     "SubnetIds": [xxx],
     "SecurityGroupIds": [xxx]
   }
},  
"prod_base": {
   ... (skip) ...
 },
 "prod": {
   "extends": "prod_base",
   "events": [{
     "function": "task_1",
     "expression": "cron(0/2 * * * ? *)"
   }, {
     "function": "task_2",
     "expression": "cron(* * * * ? *)"
 },]
... (skip) ...
 },
 "prod_asia": {
   ... (skip) ...
 },
 "test": {
   "extends": "dev",
   ... (skip) ...
 },
 ... (skip) ...
}

결론

이 글에서는 서버리스가 무엇을 의미하는지, BEPRO가 왜 서버리스를 채택했는지, 그리고 Zappa를 사용하여 파이썬 서버리스 웹 서비스를 배포하는 방법을 간략하게 설명했습니다.

Zappa는 이 문서에서 설명하는 서버리스 배포 기능 외에도 다양한 기능을 지원합니다. 예를 들어, 애플리케이션 로직에서 람다 함수를 직접 쉽게 호출하여 비동기 작업을 실행하거나, 스케줄러를 등록하여 정기적인 작업을 람다 함수로 실행하는 것과 같은 기능을 제공합니다.

우리는 마침내 Github Actions와 Zappa를 사용하여 서버리스 배포 환경을 구축했습니다. 이 환경은 우리 개발자들이 비즈니스 로직에 더 집중할 수 있게 해주었습니다. 지금도 서버리스 환경을 개선하기 위해 해결해야 할 문제들이 남아 있으며, 우리는 이러한 문제들을 해결하기 위해 끊임없이 고민하고 있습니다.

마지막으로, Python Serverless Web Services 구축을 고려하고 계시다면, 이 기사가 도움이 되었기를 바랍니다.


The BEPRO Network offers a range of tools and products to help users create their own prediction markets and gaming platforms.

The BEPRO Token powers the entire BEPRO ecosystem. It's a utility token used for staking, governance, and incentivizing participation.

You can use the BEPRO dApp to explore existing prediction markets, create new ones, and participate in the governance of the network.

For more information, refer to the official BEPRO documentation.

If you encounter any issues with the BEPRO platform, please contact support.