프로젝트 개요
AWS Elastic Beanstalk에 프로덕션 수준의 Python Flask 애플리케이션을 배포해 보겠습니다. 이 서비스는 배포, 용량 산정(provisioning), 로드 밸런싱, 애플리케이션 상태 모니터링을 자동으로 처리합니다. 공개 URL을 통해 접속 가능한 웹 애플리케이션을 직접 구축해 보세요. 준비물: AWS 계정, Python 3.12 이상, Flask 및 커맨드 라인에 대한 기본적인 지식.
환경 및 프로젝트 설정
먼저, 깨끗한 프로젝트 디렉토리를 만들고 가상 환경을 설정합니다. 이는 애플리케이션의 의존성 패키지를 격리하는 역할을 합니다.
mkdir flask-eb-deploy
cd flask-eb-deploy
python3.12 -m venv venv
source venv/bin/activate # Windows의 경우: venv\Scripts\activate
이제 터미널 프롬프트에 (venv)가 표시될 것입니다. 웹 프레임워크인 Flask와 프로덕션용 WSGI 서버인 Gunicorn을 설치합니다.
pip install flask gunicorn
pip freeze > requirements.txt
requirements.txt 파일은 매우 중요합니다. Elastic Beanstalk은 이 파일을 사용하여 의존성 패키지를 설치합니다. 초기 프로젝트 구조는 다음과 같아야 합니다.
flask-eb-deploy/ ├── venv/ └── requirements.txt
Flask 애플리케이션 생성
메인 애플리케이션 파일을 생성합니다. 여기서는 루트 엔드포인트와 Elastic Beanstalk이 모니터링할 수 있는 상태 확인(health check) 기능을 포함한 간단한 API를 작성합니다.
# app.py
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return jsonify({
'message': 'Flask App on AWS Elastic Beanstalk',
'status': 'success'
})
@app.route('/health')
def health():
return jsonify({'status': 'healthy'}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
애플리케이션이 제대로 작동하는지 로컬에서 테스트해 봅니다. 개발 서버를 실행하세요.
python app.py
브라우저에서 http://localhost:8080에 접속합니다. JSON 메시지가 보일 것입니다. http://localhost:8080/health에 접속하여 상태를 확인한 후, Ctrl+C를 눌러 서버를 중단합니다.
⚠️ 참고: 호스트를0.0.0.0으로 설정했습니다. 이는 Elastic Beanstalk 환경에서 필요한 설정으로, 서버를 외부에서 접근 가능하게 만듭니다. 기본값인127.0.0.1은 작동하지 않습니다.
Elastic Beanstalk 설정
Elastic Beanstalk에는 두 개의 설정 파일이 필요합니다. 먼저 플랫폼 전용 훅(hook)을 위한 .platform 디렉토리를 만들고, WSGI 서버용 설정 파일을 추가합니다.
mkdir -p .platform/nginx/conf.d
# .platform/nginx/conf.d/proxy.conf
# 프록시의 기본 타임아웃 시간 증가
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
이 Nginx 설정은 타임아웃 시간을 늘려주는데, 이는 처리 시간이 긴 요청이 발생하는 애플리케이션에서 흔히 필요합니다. 다음으로 핵심 파일인 WSGI 설정 파일을 생성합니다.
# wsgi.py
from app import app
if __name__ == "__main__":
app.run()
이 파일은 Gunicorn의 진입점(entry point) 역할을 합니다. Elastic Beanstalk은 기본적으로 application이라는 이름의 객체를 찾습니다. 여기서는 Flask 인스턴스 이름을 app으로 지었으므로 이를 직접 가져옵니다. 플랫폼이 Gunicorn을 통해 이를 실행하게 됩니다.
⚠️ 참고: 파일 이름은 반드시 wsgi.py여야 합니다. Elastic Beanstalk의 Python 플랫폼은 특정 규칙을 따릅니다. 다른 이름을 사용하면 배포에 실패하게 됩니다.
requirements.txt를 업데이트하여 정확한 버전을 고정합니다. 이렇게 하면 의존성 업데이트로 인한 예기치 않은 오류를 방지할 수 있습니다.
pip freeze > requirements.txt
최종 프로젝트 구조는 다음과 같아야 합니다.
flask-eb-deploy/ ├── .platform/ │ └── nginx/ │ └── conf.d/ │ └── proxy.conf ├── venv/ ├── app.py ├── requirements.txt └── wsgi.py
EB CLI를 이용한 배포
가장 쉬운 배포 방법은 Elastic Beanstalk 커맨드 라인 인터페이스(CLI)를 사용하는 것입니다. 이를 설치하고 초기화합니다.
pip install awsebcli
eb --version
Elastic Beanstalk 애플리케이션을 초기화합니다. 이 명령은 로컬에 설정 파일을 생성하고 AWS에 애플리케이션을 구성합니다.
eb init -p python-3.12 flask-tutorial-app --region us-east-1
AWS 자격 증명(credentials)을 입력하라는 메시지가 표시됩니다. 안내에 따라 로그인하세요. 이 명령은 미국 동부(버지니아 북부) 리전에 flask-tutorial-app이라는 이름의 Python 3.12 애플리케이션을 설정합니다. 이제 코드가 실행될 실제 환경을 생성합니다.
eb create flask-tutorial-env
이 단계는 5~10분 정도 소요됩니다. EC2 인스턴스, 로드 밸런서, 보안 그룹, Auto Scaling 그룹 등 모든 AWS 리소스를 프로비저닝합니다. 명령이 성공적으로 완료될 때까지 기다려 주세요.
⚠️ 참고:eb create명령은 기본적으로 로드 밸런싱과 오토 스케일링이 적용된 환경을 생성합니다. 저비용의 단일 인스턴스 테스트 환경을 원한다면eb create --single flask-tutorial-env를 사용하세요.
테스트 및 확인
배포가 완료되면 브라우저에서 애플리케이션을 열어 정상 작동 여부를 확인합니다.
eb open
기본 브라우저가 실행되며 애플리케이션의 공개 URL(예: flask-tutorial-env.eba-abc123.us-east-1.elasticbeanstalk.com)로 연결됩니다. 루트 경로에서 JSON 메시지가 나타나야 합니다. URL 끝에 /health를 붙여 {"status": "healthy"}가 반환되는지 확인하세요.
문제가 발생하면 CLI에서 직접 로그를 확인할 수 있습니다. 배포 오류나 런타임 에러를 확인할 때 가장 먼저 살펴봐야 할 곳입니다.
eb logs
코드를 수정하려면 로컬 파일을 업데이트한 후 eb deploy 명령을 사용하여 다시 배포합니다. 새 엔드포인트를 추가해 보겠습니다.
# app.py의 if __name__ 블록 앞에 추가
@app.route('/api/data')
def get_data():
sample_data = {"items": [{"id": 1, "name": "Sample Item"}]}
return jsonify(sample_data)
eb deploy
배포 명령은 애플리케이션을 패키징하고 실행 중인 환경을 업데이트합니다. 완료되면 eb open을 다시 실행하고 /api/data 경로로 이동하여 새 엔드포인트를 확인하세요.
배포 관리하기
이제 실제로 운영 중인 Flask 애플리케이션을 갖게 되었습니다. AWS Management Console에서 환경 상태나 설정을 확인하려면 다음 명령어를 사용하세요.
eb console
해당 환경의 Elastic Beanstalk 대시보드가 열립니다. 여기서 상태 모니터링, 알람 확인, 용량 조절 및 설정을 관리할 수 있습니다. 작업을 마치고 계속되는 비용 발생을 방지하려면 환경을 종료하세요.
⚠️ 경고: 이 작업은 EC2 인스턴스와 로드 밸런서를 포함하여 해당 환경의 모든 AWS 리소스를 삭제합니다. 애플리케이션에 더 이상 접속할 수 없게 됩니다.
eb terminate flask-tutorial-env
환경 이름을 입력하여 확인합니다. 애플리케이션 자체(flask-tutorial-app)는 EB 대시보드에 남아 있으므로, 나중에 언제든지 새 환경을 다시 만들 수 있습니다.
프로덕션급 AWS 서비스에 Flask 애플리케이션을 성공적으로 배포했습니다. 이 설정은 스케일링, 로드 밸런싱, 상태 모니터링을 자동으로 처리합니다. 다음 단계로는 Amazon RDS와 같은 데이터베이스 연결, Route 53을 이용한 커스텀 도메인 설정, 또는 eb deploy 명령을 활용한 CI/CD 파이프라인 구축 등이 있습니다.