flask를 elastic beanstalk에 배포하기

송윤주·2024년 3월 21일
0

클라우드

목록 보기
6/8

본 글을 작성하는 것은 제목과 같은 과정을 진행하면서 겪는 시행착오를 기록해보자 작성하게 되었다.

왜 flask?

일단 필자는 데이터 분석을 주로 했기에 파이썬 언어가 제일 익숙하다. 그래서 파이썬 기반 웹 프레임 워크를 검색해보았는데 Flask와 Django가 나왔고 장단점을 조사했을 때 아래와 같았다.

Django

장점:

  • 전체적인 솔루션: Django는 "배터리 포함(batteries-included)" 접근 방식을 따릅니다. 즉, 프레임워크 자체에 ORM(Object-Relational Mapping), 인증 시스템, 관리 패널, 파일 업로드 등 웹 애플리케이션 개발에 필요한 대부분의 기능이 내장되어 있습니다.
  • 보안: Django는 보안 측면에서 강력하며, SQL 인젝션, 크로스 사이트 스크립팅, CSRF(크로스 사이트 요청 위조) 등 일반적인 웹 공격으로부터 보호하는 많은 메커니즘을 내장하고 있습니다.
  • DRY 원칙: Django는 "Don't Repeat Yourself" 원칙을 따르도록 설계되었습니다. 이는 코드의 중복을 최소화하고 재사용성을 극대화하는 것을 목표로 합니다.
  • 확장성: 대규모 애플리케이션에 적합하며, 많은 트래픽을 처리할 수 있도록 설계되었습니다.

단점:

  • 학습 곡선: Django의 전체적인 솔루션 접근 방식과 다양한 구성 요소로 인해 초보자에게는 학습 곡선이 높을 수 있습니다.
  • 과도한 기능: 작은 프로젝트나 단일 기능 애플리케이션의 경우, Django의 모든 기능이 필요하지 않을 수 있으며, 프레임워크가 과도하게 느껴질 수 있습니다.

Flask

장점:

  • 경량성과 유연성: Flask는 "마이크로 프레임워크"로 분류됩니다. 기본적으로 제공되는 기능은 제한적이지만, 필요한 기능을 추가하면서 애플리케이션을 구성할 수 있는 높은 유연성을 제공합니다.
  • 쉬운 학습 곡선: Flask의 단순함과 문서화는 개발자가 빠르게 배우고 사용할 수 있게 합니다. 작은 프로젝트나 프로토타이핑에 적합합니다.
  • 확장 가능: 필요에 따라 다양한 확장 프로그램(예: Flask-SQLAlchemy, Flask-Login 등)을 추가하여 기능을 확장할 수 있습니다.
  • 커뮤니티와 지원: Flask도 활발한 커뮤니티를 가지고 있으며, 많은 자료와 튜토리얼이 온라인에 제공됩니다.

단점:

  • 비내장 기능: Django와 달리, Flask는 많은 기능을 기본적으로 제공하지 않습니다. 이는 개발자가 필요한 기능을 직접 구축하거나 확장을 찾아 통합해야 한다는 의미입니다.
  • 대규모 프로젝트에 대한 복잡성 관리: Flask는 기본적으로 경량 프레임워크이므로, 대규모 프로젝트에서는 프로젝트의 구조를 관리하고 확장성을 유지하는 데 더 많은 노력이 필요할 수 있습니다.

결론적으로, Django는 "배터리 포함" 접근 방식과 강력한 기능 세트를 선호하며, 보안 및 확장성을 중시하는 대규모 애플리케이션 개발에 적합하다. 반면, Flask는 간단하고 유연한 프로젝트를 빠르게 시작하고자 하는 개발자에게 적합하며, 개발자가 원하는 대로 확장성을 제어할 수 있다.
-> 그래서 나는 그렇게 많은 기능을 구현하는 것은 아니고 처음 서버 배포를 시작하는 서린이였기에 flask로 결정!


ec2가 아닌 elastic beanstalk에 배포하게 된 이유

내가 책을 통해 공부했을 때 대부분 배포를 ec2를 사용해 진행하는 것 같았다. 그렇지만 나의 탐구욕은 다른 배포 방식에 대해 찾아봤고 ELB도 있다는 것을 알게되었으며 장단점을 조사했을 때 아래와 같았다.

Amazon EC2

장점:

  • 유연성과 제어: EC2는 가상 서버 인스턴스를 제공합니다. 사용자는 운영 체제, 서버 구성, 설치할 소프트웨어 등에 대한 완전한 제어 권한을 가집니다. 이는 복잡한 애플리케이션과 특수한 환경 설정이 필요한 경우 유리할 수 있습니다.
  • 다양한 인스턴스 유형: 다양한 컴퓨팅, 메모리, 스토리지 최적화 인스턴스를 선택할 수 있어, 요구 사항에 맞게 인스턴스를 최적화할 수 있습니다.
  • 확장성: 수동으로 또는 Auto Scaling을 통해 서버 인스턴스의 수를 쉽게 조정할 수 있습니다.

단점:

  • 관리 부담: 서버 운영 체제 및 애플리케이션 스택의 설치, 구성, 관리를 사용자가 직접 해야 합니다. 이는 시간이 많이 소요될 수 있습니다.
  • 복잡성: 네트워킹, 보안, 스토리지 설정 등 인프라 관리의 모든 측면을 사용자가 관리해야 합니다.

Elastic Beanstalk

장점:

  • 간편한 배포: 애플리케이션 코드를 업로드하기만 하면, Elastic Beanstalk이 애플리케이션 배포 및 관리에 필요한 인프라를 자동으로 처리합니다.
  • 자동 관리: 서버, 데이터베이스, 로드 밸런서 설정, 스케일링, 건강 모니터링 등을 자동으로 관리합니다. 이는 운영 부담을 크게 줄여줍니다.
  • 빠른 스케일링: 트래픽의 변화에 따라 자동으로 리소스를 확장하거나 축소할 수 있어, 리소스 관리가 훨씬 간편합니다.

단점:

  • 제한된 제어: Elastic Beanstalk은 관리의 편의성을 제공하지만, EC2 인스턴스처럼 환경의 모든 측면을 제어할 수는 없습니다. 특정 설정이나 사용자 정의 구성이 필요한 경우 제한이 있을 수 있습니다.
  • 환경 구성의 복잡성: 기본 설정 이외의 복잡한 환경 구성이 필요한 경우, Beanstalk의 학습 곡선이 높을 수 있으며, 설정을 조정하기 위해 추가 작업이 필요할 수 있습니다.

Elastic Beanstalk은 애플리케이션 배포와 관리를 간소화하고자 하는 개발자에게 적합하고 관리 부담을 줄이면서도 애플리케이션의 배포 및 운영을 자동으로 처리할 수 있다. EC2는 더 많은 제어와 유연성이 필요한 경우에 적합하다. 복잡한 애플리케이션 구성이나 특수한 요구 사항을 가진 프로젝트에 유리할 수 있다.
-> flask를 선택하게 된 계기와 마찬가지로 빠른 배포를 위해 더불어 다른 aws 서비스를 경험할 수 있다고 해서 Elastic Beanstalk 선택!



Flask 디렉토리 구조

이 코드를 작성할 당시 프로젝트를 동시에 4개를 진행하는 미쳐버린 기염을 토했기 때문에 그냥 코드를 계에에속 한 파일에 작성하다보니 500줄이 넘어갔었다. 이러면 나중가서 유지보수가 힘들기 때문에 구조를 다시 작성했다.

/yourapp
    /app
        /auth
            __init__.py
            login.py
            register.py
            forms.py
        /news
            __init__.py
            hot_topics.py
            normalize.py
            recommendations.py
            summary.py
            show.py
            cards.py
            staytime.py
        /bookmarks
        	add.py
            remove.py
            inquiry.py
        /models
            __init__.py
            models.py
        /recommend
            __init__.py
            recommendation_module.py
            pdvl_updater.py
        /static
        /templates
        __init__.py
    /migrations
    /tests
    config.py
    run.py

구성 요소 설명

  • /app: 애플리케이션의 모든 코드를 포함하는 주 디렉토리
    • /auth: 인증 관련 라우트와 폼을 포함한다. 예를 들어, 로그인 및 등록 라우트가 여기에 속한다.
    • /main: 애플리케이션의 주요 기능 관련 라우트를 포함한다.
    • /models: 데이터베이스 모델 정의를 포함한다.
    • /recommend: 추천 시스템 관련 코드를 포함한다.
    • /static: CSS, JavaScript 파일, 이미지 등 정적 파일을 저장
    • /templates: HTML 템플릿 파일을 저장
    • init.py: 애플리케이션 팩토리와 함께 Flask 인스턴스를 생성하고, 확장 프로그램을 초기화한다.
  • /migrations: 데이터베이스 마이그레이션 스크립트를 저장
  • /tests: 단위 및 통합 테스트를 포함
  • config.py: 애플리케이션 설정을 포함한다. 데이터베이스 연결 문자열, 비밀 키, JWT 설정 등이 여기에 포함된다.
  • run.py: 애플리케이션을 시작하는 스크립트이다.

중요한 변수 위치

  • 애플리케이션 설정(예: SQLALCHEMY_DATABASE_URI, JWT_SECRET_KEY): config.py 파일에 위치해야 한다. 이 파일에서 환경 변수를 사용하여 민감한 정보를 관리할 수 있다.
  • 데이터베이스 모델: /app/models/models.py에 위치해야 한다.
  • 비즈니스 로직(예: 로그인, 뉴스 추천): 각 기능에 따라 /app/auth/routes.py, /app/main/routes.py, /app/recommend/recommendation_module.py 등에 위치해야 한다.
  • 정적 파일과 템플릿: 각각 /static, /templates 디렉토리에 위치해야 한다.

2024-03-21 기준 배포까지는 필요가 없었어서 일단 게시글로 출간 후 나중에 공부를 위해 작성해보도록 하겠다!
임시글에 남아있는 게 싫어서 일단 출간!

profile
모두가 정보를 습득할 수 있도록 냠냠쩝쩝 먹어보는 공간

0개의 댓글

관련 채용 정보