본문 바로가기

Posts/Server

AWS ElasticBeanstalk으로 토이프로젝트 배포하기

반응형

1. Elastic Beanstalk

Elastic Beanstalk은 애플리케이션을 실행하는 인프라에 대해 자세히 알지 못해도 신속하게 배포하고 관리할 수 있는 기능을 제공합니다.

프로비저닝, 로드 밸런싱, 조정, 애플리케이션 상태 모니터링등 세부 정보를 자동으로 처리해줍니다.

(이후 Elastic Beanstalk은 EB라 작성하겠습니다.)

EC2를 이용하면 인스턴스 서버에 일일이 웹서버(nginx)와 패키지 의존성등을 설치해주어야 하는 번거로움들이 생깁니다.

(사실 번거로운것보단 EB가 너무 편한게 아닐까..?)

EB를 사용하게 되면 이런 과정들을 다 손쉽게 처리할 수 있도록 도와줍니다.

aws 사이트에서도 사용할 수 있지만 프로젝트내에서 awsebcli를 활용하여 사용해보겠습니다.


2. EB CLI Install

brew가 설치되었다는 전제하에 진행됩니다. (brew가 없다면 설치 후 진행)

$ brew install awsebcli
$ eb --version 
EB CLI 3.20.2 (Python 3.8.0)

3. EB 구성 설정

3-1. 지역 설정

프로젝트를 구성할 지역을 선택합니다. 우리는 한국 서울을 선택합니다.

커맨드창에 10을 입력하고 엔터를 누릅니다.

$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) eu-south-1 : EU (Milano)
20) ap-east-1 : Asia Pacific (Hong Kong)
21) me-south-1 : Middle East (Bahrain)
22) af-south-1 : Africa (Cape Town)
(default is 3): 10

EB CLI가 리소스를 관리할 수 있도록 액세스 키와 보안 키를 입력합니다.

엑세스 키의 생성은 위에 링크에 aws 사이트에서 확인할 수 있습니다.

You have not yet set up your credentials or your credentials are incorrect.
You must provide your credentials.
(aws-access-id): "access-id"
(aws-secret-key): "secret-key"

3-2. 애플리케이션 이름 설정

다음은 애플리케이션을 생성해야 합니다. 저의 경우 기존에 생성했던 프로젝트가 있기에

목록에 기존 애플리케이션명이 보이지만 처음이라면 Create new Application을 선택합니다.

역시 동일하게 커맨드창에 번호를 입력하고 엔터를 입력하고 이후 애플리케이션 이름을 쓰고 엔터를 입력합니다.

Select an application to use
1) account-project
2) [ Create new Application ]
(default is 1):

3-3. 플랫폼 및 버전 선택

이후 아래 메세지가 뜨게 됩니다. eb에서 자동으로 현재 프로젝트를 바라보고 어떤 언어 플랫폼인지

확인하는 절차입니다. 저는 python을 사용하고 있기에 맞으니 Y를 입력 후 엔터를 누릅니다.

It appears you are using Python. Is this correct?

다음은 플랫폼의 버전을 선택해야 합니다. 본인이 사용할 프로젝트의 버전과 일치하는 버전을 선택후 엔터를 누릅니다.

Select a platform branch.
1) Python 3.8 running on 64bit Amazon Linux 2
2) Python 3.7 running on 64bit Amazon Linux 2
3) Python 3.6 running on 64bit Amazon Linux (Deprecated)

3-4. 버전관리 및 SSH

프로젝트가 git으로 버전관리가 되면 알아서 커밋하겠냐는 메세지가 뜨지만

그렇지 않은 경우는 n를 입력하고 다음으로 넘어갑니다.

이후 SSH key pair를 설정하는 질문이 나오는데 Y를 누르고 엔터를 눌러 설정합니다.

Do you wish to continue with CodeCommit? (Y/n): n
Do you want to set up SSH for your instances?

4. Deploy 설정

4-1. 구성 파일

위에 작업까지 완료하면 프로젝트에 .elasticbeanstalk이란 폴더와 구성 config.yml파일이 생성됩니다.


4-2. .ebignore

.ebignore 파일을 프로젝트 디렉토리에서 생성합니다.

이는 eb cli 명령 실행시 디렉토리내에 특정 파일을 무시하도록 명령합니다.

.gitignore와 같은 개념이고 .gitignore에 있는 그대로 복사해서 쓰되

.gitignore로 등록된 key관리 하는 .env 파일은 제외시킵니다.


4-2. .ebextensions

배포 설정 파일을 생성합니다. 프로젝트에 .ebextensions 폴더를 생성 후 하위에

.config 확장자를 가진 파일을 하나 생성합니다. 저같은 경우는 00_init.config 라고 생성하였습니다.

배포시 해당 폴더내에 파일명의 번호 순으로 실행됨으로 이 부분을 고려하여 파일을 생성하고 코드를 작성해야 합니다.

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: config.wsgi:application
  aws:elasticbeanstalk:application:environment:
    SERVER_ENV: Prod

packages:
  yum:
    postgresql-devel: []

container_commands:
  00_wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
  01_dbmigrate:
    command: "source $PYTHONPATH/activate && python manage.py migrate --noinput"
    leader_only: true

aws:elasticbeanstalk:container:python

  • eb 컨테이너 -> ec2 -> python으로 구성

WSGIPath: config.wsgi:application

  • WSGIPath는 eb가 애플리케이션을 시작할때 사용하는 wsgi 위치 설정
  • config.wsgi.applicaion 을 바라보게끔 path 설정

packages:
yum:
postgresql-devel: []

  • Amazon Linux 2 서버 환경에서 yum으로 패키지 관리할 때 postgresql 패키지 설치

container_commands:

  • 웹서버가 설정되고 애플리케이션 버전 아카이브의 압축이 풀린 후 실행
  • 파일 권한 변경 및 실행, 가상환경 설정, migrate 관리등을 구성
  • noinput 옵션은 물어보지말고 바로 덮어쓰기 하라는 옵션. 기본으로 설정하기
  • WSGIPassAuthorization On의 경우 인증용 헤더 정보 넘겨주는 기능 (default Off로 무조건 On 설정 추가)

option_settings에 container python을 작성해주고 WSGIPath를 프로젝트 앱의 wsgi.applicaion으로 설정합니다.

위처럼 Path를 잡으면 Gunicorn WSGI 서버에서 작동하게 됩니다.

아래 프로젝트의 환경 변수도(environment) 설정해줍니다.

저의 경우 개발과 프로덕트로 구분해놨기에 배포할 때는 Prod로 구성해주었습니다.

WSGI는 Web Server Gateway Interface로 웹서버(Nginx)와 웹 프레임워크(Django) 사이에 통신을 담당하는 인터페이스입니다.

Nginx와 Django의 통신을 담당한다고 보면 됩니다. wsgi의 종류는 여러가지가 있으며 uWSGI, Gunicorn등이 있습니다.

위 .config 파일 설정의 자세한 내용은 여기에서 확인 가능합니다.


4-3. eb create

설정 파일 작업 이후 터미널에서 커맨드명령으로 $ eb create 를 입력하고 엔터를 칩니다.

아래와 같은 화면이 나오게 되고 환경 이름을 입력 후 엔터를 입력합니다.

Enter Environment Name
(default is account-project2-dev):

이후 DNS CNAME을 입력해야 하는데 위 환경 이름과 동일하게 입력하였습니다.

Enter DNS CNAME prefix
(default is account-project2-dev):

다음 단계에선 로드밸런서 타입을 선택합니다.

로드밸런서란 간단히 말해 하나의 서버에 많은 사용자가 접속할 때

성능과 부하를 고려하여 여러개의 서버를 추가시켜 중간에서 각각의 서버로 사용자의 요청을

분산시키는 기술을 말합니다.

Select a load balancer type
1) classic
2) application
3) network
(default is 2):

우리는 애플리케이션 2번을 입력하고 엔터를 칩니다. 다음에 나오는 Spot Fleet은 aws의 오토스케일링 서비스중 하나를 말합니다.

오토스케일링은 하나의 컴퓨터에 여러 유저가 몰렸을 때 해당 컴퓨터의 사양을

자동으로 업그레이드 시키거나 다운그레이드시키는 기술을 말합니다.

토이프로젝트이기 때문에 이 부분은 N로 해놓고 넘어가도록 하겠습니다.

Would you like to enable Spot Fleet requests for this environment? (y/N):

여기까지 진행하면 프로젝트 배포가 시작됩니다.

컴퓨터마다 조금씩 시간차이가 있겠지만 5~10분정도 기다리면 모든 배포가 완료되고

AWS에 접속하면 ip주소로 배포된 사이트를 확인할 수 있습니다.

다음엔 EC2에 도커를 활용하여 배포를 해보는 시간을 가지면서 공부하도록 하겠습니다.



반응형