티스토리 뷰

Elastic Beanstalk란?

AWS 서비스 중 하나인데, Deploy를 도와주는 서비스이다. 이번에 Flask로 진행중이던 웹 프로젝트를 Deploy 할 일이 있어서 beanstalk를 써봤다. 확실히 몇 가지만 빼면 편리하게 쓸 수 있었다. 다른 deploy tool을 써본적이 없어서 비교는 잘 못 하겠다.

내가 엄청난 시간을 날린 이유는 바로 bower 때문이다. .ebextensions 내에 .config에 실행할 command 들을 넣을 수가 있는데, 여기에 'bower install'을 넣고 싶었다. 근데 이게 정말 잘 안 되서, 결국 ec2에 바로 ssh로 들어가 직접 설치했다. 다만 ec2의 특성상 instance가 지워질 경우 리셋되기 때문에 좋지 않은 해결 방법으로 보인다. beanstalk config에 bower install 명령어를 날릴 수 있는 방법을 찾아봐야 할 것이다.

초기 세팅 방법

beanstalk cli 설치 방법은 쉽다. sudo pip install awsebcli 이 명령어만 실행하면 된다. 당연히 pip는 설치되어 있어야 하고. virtualenv 상에서 설치하면 해당 virtualenv에서만 쓸 수 있으니까 참고하라. 위 명령어를 실행한 후부터 eb라는 명령어로 여러가지를 수행할 수 있다. AWS Elastic Beanstalk 콘솔에서 볼 수 있는 몇 가지 것들도 위 명령어로 볼 수 있다. 예를 들면 마지막 100개 로그 보기 같은 것도 eb logs 같은 명령어로 볼 수 있다. AWS Beanstalk 콘솔 상에서 로그를 볼 때는 log request 후 다운로드를 받아야 볼 수 있는데, eb logs 명령어로는 바로 터미널에서 열려서 더 편리하다. eb ssh 같은 명령어도 있다. 생성한 environment에 연결된 ec2 instance에 바로 ssh를 연결해주는 것이다. /home/.ssh 디렉토리에 EC2의 Key Pairs에 해당하는 pem 파일을 두면 eb ssh로 바로 ec2 instance에 ssh를 날릴 수도 있다.

처음 initialize

다음의 가이드는 링크의 To configure Elastic Beanstalk의 내용을 설명한 것이다. 처음엔 일단eb init을 해줘야 한다. 이 init을 위해서는 AWS Access Key ID와 AWS Secret Access Key가 필요하다. 이것을 발급받는 방법은 검색해보면 많이 나올 것이다. 처음에만 입력해주면 다음부터 eb init을 할 때 다시 입력할 필요가 없다. 다음으로 나오는 것들은 적절히 입력해주면 된다.

environment 생성

eb init만으로는 단지 프로젝트의 초기 설정을 해주는게 전부이다. 아직 beanstalk에 프로젝트가 실제로 생성되지도 않는다. eb create 명령어로 environment를 생성할 수 있다. 처음 별다른 설정의 문제가 없다면 eb create후 조금 기다리면 콘솔에 이것저것 뜨면서 environment 생성에 성공할 것이다. 다소 시간이 걸리더라도 참고 기다리자. 생성이 완료되면 나중에 쓸지도 모르니까 eb ssh --setup으로 ssh 세팅도 해주자. 이것도 시간이 조금 걸린다.

Configuration

다양한 설정을 설정 파일에서도 세팅할 수 있지만, beanstalk 콘솔에서도 변경 가능하고, configuration 파일로도 변경할 수 있다. 그다지 깊은 세팅을 할 것은 아니라서 콘솔에서 설정할 것이다.건드려야 할 설정은 Instances, Software Configuration, Data Tier 정도이다.

Instances에서는 ec2 security groups, ec2 key pair 이다. 일단 이 environment의 security groups 이름을 메모해둬야 한다. 나중에 DB를 RDS로 연동할텐데 inbound 설정에 우리의 ec2를 추가해줘야 서로 통신이 가능하기 때문이다. ec2 key pair에는 그냥 key pair 맵핑 해주면 된다. 아마eb ssh --setup을 했었으면 자동으로 key pair가 등록되어 있을 것이다. Software Configuration에서는 static files path를 맵핑해줘야 한다. 보통 flask로 개발할 때 app을 생성하면 app/static/ 디렉토리에 static 파일들을 저장해두는데, default 세팅에서는 그냥 statc/ 디렉토리라서 조금 고쳐줘야 한다. 그리고 Environment Properties에서 AWS_ACCESS_KEY_ID, AWS_SECRET_KEY이 비어있으면 채워줘야 한다.

Data Tier에서는 DB 연동을 하는데, 처음 만든 environment라면 DB가 추가되어 있지 않을 것이다. 그래서 새로운 RDS를 만들어줘야 한다. 아마 새로운 RDS를 생성하는 절차를 밟으면 security groups에 RDS의 security group이 생기고, 자동으로 inbound에 우리의 environment로 생긴 ec2의 security group이 추가되어 있을 것이다. 나 같은 경우, RDS를 하나만 생성하고, 두 개의 프로젝트를 같은 RDS를 참조하도록 해야 했다. (environment가 2개) 처음엔 새로운 RDS를 생성하는 것으로 해결됬는데, 두 번째 environment에서는 Configuration에서 Data Tier를 직접 추가하지 않고, 기존의 RDS의 security groups에 두 번째 프로젝트의 environment에 연결된 ec2의 security group을 inbound를 추가해주면 해결된다. RDS를 생성할 떄는 실제로 쓸 계정명과 비밀번호 같은걸 잘 설정해두는 것이 좋을 것이다. 그리고 백업해둔 쿼리를 재실행하거나 스키마 생성 같은 것을 위해 DB에 연결이 필요할텐데 mysql -u{{계정명}} -h {{RDS end point URL}} -p 명령어를 실행하면 된다.

추가 패키지 사용을 위한 커맨드 실행

내 프로젝트에서는 redis를 사용해야 했었다. 그런데 beanstalk config 파일을 이용하면 자동으로 redis를 쓸 수 있도록 할 수 있다. 일단 프로젝트 루트 디렉토리에 .ebextensions 디렉토리를 생성하고 config 파일을 생성해야 한다. config 파일을 여러개 만들 수 있는데 파일명 순서에 따라 차례로 실행해준다. 확장자명을 .config로 하면 되는데 project.config처럼 지으면 된다. yaml 형식이나 json 형식으로 쓰면 되고, 자세한 세팅은 문서를 참고하라.

packages: 
  yum:
    gcc-c++: []
    make: []
    git: []
sources:
  /home/ec2-user: http://download.redis.io/releases/redis-2.8.4.tar.gz
commands:
  redis_build:
    command: make
    cwd: /home/ec2-user/redis-2.8.4
  redis_config_001:
    command: sed -i -e "s/daemonize no/daemonize yes/" redis.conf
    cwd: /home/ec2-user/redis-2.8.4
  redis_config_002:
    command: sed -i -e "s/# maxmemory <bytes>/maxmemory 500MB/" redis.conf
    cwd: /home/ec2-user/redis-2.8.4
  redis_config_003:
    command: sed -i -e "s/# maxmemory-policy volatile-lru/maxmemory-policy allkeys-lru/" redis.conf
    cwd: /home/ec2-user/redis-2.8.4
  redis_server:
    command: src/redis-server redis.conf
    cwd: /home/ec2-user/redis-2.8.4
  get_sudo:
    command: echo Defaults:root \!requiretty >> /etc/sudoers 
  npm_install:
    command: sudo yum -y --enablerepo=epel install nodejs npm
  npm_install_bower:
    command: sudo npm install -g bower
container_commands:
  bower_install:
    command: sudo bower install --allow-root
option_settings:
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "app/static/"

yum으로 빌드를 위한 패키지들을 설치하고 redis를 다운로드 받아 설치하는 것이다. 더불어 bower 사용을 위해 git과 npm을 설치 후 npm으로 bower를 install 한다. bower를 sudo로 사용하기 위해 -g 옵션을 넣어 설치한다.

그냥 commands 탭이 있고, container_commands 라는 탭도 있다. 둘의 차이는 바로 타이밍이다.eb deploy로 deploy를 하면 내 프로젝트가 일단 zip으로 압축되어 ec2 instance로 보내진다. 내 프로젝트가 압축 해제 되기 전에 실행되는 명령어들이 commands 이고, 압축 해제 후 실행되는 명령어가 container_commands이다. container_commands에는 bower install 과 같은 내 프로젝트의 특정 위치에 라이브러리 다운로드와 같은 행동을 하는데 쓰이는데 명령어가 실행되는 경로는 프로젝트의 루트 디렉토리라고 생각하면 된다. (실제로는 Python 프로젝트의 경우 /opt/python/bundle/버전번호/app 디렉토리가 프로젝트 루트 디렉토리와 맵핑된다.)

option_settings 부분을 보면 static 파일 경로 맵핑 부분도 있는데, 이렇게 콘솔에서 설정할 것들을 위 ebextesions config 파일로도 설정할 수 있다. 대충 이 정도면 beanstalk 설정은 끝이다.

Flask 프로젝트 세팅

아마 Flask 프로젝트를 진행 중이라면 pip를 이용하여 라이브러리를 설치해서 쓰고 있을 것이다. requirements.txt 파일에 쓰고 있는 라이브러리들을 다 써놨었으면 이걸로 자동으로 pip install을 해준다. 아마 수정해줘야 할 부분들은 프로젝트상에서 파일 참조 경로, DB URI, wsgi 설정 정도일 것이다. 일단 DB URI는 RDS의 end point에 맞춰 수정해줘야 한다. (이 부분은 엄밀히 말해서 Flask의 세팅은 아니고 DB driver library 세팅이긴 하다.) 다음으로 파일 참조 경로인데, 이것은 위에서 static 파일 경로 맵핑을 한 것에 따라 맞춰줘야 한다. 예를 들면 /static/을 app/static/ 디렉토리와 맵핑했었으므로, <script src="/static/lib/angular/angular.min.js"></script> 과 같이 소스(템플릿 파일)에 입력해뒀었으면 app/static/lib/angular/ 디렉토리에 angular.min.js 파일이 있도록 해주면 된다. wsgi 설정은 beanstalk가 자동으로 우리의 프로젝트를 run 해주기 위해 필요한 것이다. default 설정 상으로는 프로젝트 루트 디렉토리에 있는 application.py를 실행해주는데, ebextensions config에서 파일명을 바꿀 수 있다. 하지만 소스 파일 안에서도 바꿔줘야 할 것이 있다.

from app import app
app.run()

보통 이런식으로 많이 쓰는데, 다음과 같이 바꿔줘야 한다.

from app import app as application
application.run()

대충 이 정도면 설정은 끝이다. 여러가지 다른 trouble shooting 해야 할 것들이 있을 수 있는데, beanstalk의 log를 보면서 해결해보자.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday