Zappa로 서버리스 배포

·2022년 6월 14일
0
post-thumbnail

Zappa 개요

  • Python Web Framework의 AWS Lambda + API Gateway 기반 서버리스 웹서버 배포 자동화

Zappa 역할

배포의 자동화

  • 명령어 한 줄로 lambda에 코드를 배포하기 위한 모든 과정을 진행한다.
    • lambda 생성, 코드 압축 및 업로드, EventBridge, API Gateway 설정 등 필요한 AWS 리소스를 자동으로 생성하고 설정한다.
  • 기능 출시, 테스트 등 코드 수정이 잦은 상황에 매우 유용하다.

Lambda as Python WAS

Lambda가 웹서버로 작동하기 위한 모든 과정을 포함하고 있다.

  • API Gateway 연결
    • API Gateway와 lambda의 연결이 마치 웹서버와의 연결인 것 처럼 설정(WSGI)
    • CORS, MIME Type등 HTTP 관련 설정 기능을 제공
  • EventBridge 연결
    • cronjob을 위한 lambda 호출
    • event 생성 시 lambda 호출
  • DNS 관련 기능
    • DNS 설정
    • SSL 설정
  • 그 외 웹서버 구성에 유용한 AWS 서비스들을 연결
    • S3 (Static 파일 저장)
    • Integration(SNS, SQS)
    • KMS 설정

관리 기능

  • Stage 기반으로 AWS 인프라를 개발환경으로 관리

    • zappa deploy <환경이름>
    • zappa update <환경이름>
  • django remote manage

    • zappa manage <환경이름>
  • tail

    • 오류 메시지 제공(from cloudwatch)
  • status

    • Lambda의 Metric 제공

Zappa 세팅

API Gateway + lambda + RDS 환경 가정

기본 설정

  • AWS credential

  • Docker 설정

    • 컨테이너 이미지 선택 및 zappa 환경 빌드
    • PIP 세팅
      • 프로젝트에 필요했던 패키지를 pip freeze > requirements.txt 로 문서화한다.
      • 도커상에서 pip install -r 'requirements.txt' 로 설치한다.
      • psycopg2-binary
        • Amazon Linux 2에는 psycopg2 필요 모듈인 libpq 가 없어서 바이너리로 설치해야된다.
  • VPC 설정

    • RDS가 필요한 경우 VPC의 AZ는 2개 이상으로 구성되어야 한다.
    • Private Subnet의 리소스가 인터넷 연결이 필요한 경우, 고정적인 EIP가 필요한 경우 NAT Gateway도 함께 생성한다.
    • S3 연결을 위해 S3 Gateway도 함께 생성해준다.
    • Management console의 creat vpc wizard 이용
      • VPC, subnet, 라우트테이블, NATgw, igw, vpce 설정을 GUI로 가능하도록 지원
  • RDS 설정

    • zappa에서는 RDS를 설정할 수 없으므로 미리 RDS를 AWS에 생성해주자.
  • 기본 설정 자동화 :question:

    • VPC, RDS와 같은 설정은 한번 설정해두면 프로젝트/stage에 따라 변경할 필요가 없이 계속 사용된다. 따라서 IaC로 자동화할 필요는 없는 것 같다.
    • Zappa에서 소개하는 자동화 라이브러리는 있지만 업데이트가 되지 않는다.

Zappa 세부 설정

  • vpc_config

    "vpc_config": {	
    		// 아키텍처상 lambda가 놓여야 할 subnet id
        	// 여러 subnet에 배치할 수 있다.
        "SubnetIds": [ "subnet-12345678" ],
    		// 다른 리소스에 접근하기 위해 설정해둔 보안그룹
        "SecurityGroupIds": [ "sg-12345678" ]
    },
  • events

    "events": [
    { 
    		"function": "your_module.your_recurring_function", 
    		"expression": "rate(1 minute)" 
    },
    {
    		"function": "your_module.your_reactive_function", 
    		"event_source": {
    				"arn":  "arn:aws:s3:::my-bucket", 
    				"events": [
    						"s3:ObjectCreated:*" 
    				]
    		}
    }
    ],
    • 사용 이유
      • 주기적인 작업
      • 다른 리소스에서 이벤트가 발생한 경우 람다가 호출되기 위해서
  • keep_warm

    "events": [
    { 
    		"function": "your_module.your_recurring_function", 
    		"expression": "rate(1 minute)" 
    },
    {
    		"function": "your_module.your_reactive_function", 
    		"event_source": {
    				"arn":  "arn:aws:s3:::my-bucket", 
    				"events": [
    						"s3:ObjectCreated:*" 
    				]
    		}
    }
    ],
    • lambda의 cold start 방지
      • lambda가 갑자기 호출되면 provisioning을 하기 위해 지연시간이 발생한다.
        • cold start + 잡다한 연결 + RDS 등등 지연시간이 1초가 넘어갈 수 있다.
profile
Ben

0개의 댓글