AWS가 출시 되면서 기업에서는 높은 인프라 비용을 지불하지 않고 서버와 같은 IT 인프라를 사용할 수 있게 되었습니다. 클라우드를 통해 수 분 내에 수천 대의 서버에 가상으로 액세스하여 결과를 신속하게 제공할 수 있는데요!
오늘은 클라우드 서비스 중 AWS를 배포하는 과정을 담아보았습니다.
우선 사진과 같이 aws 페이지에서 사용자가 사용할 법한 지역을 선택해줍니다.
서버 관리를 0부터 배우는 것은 그냥 텅 빈 우분투만 설치된 컴퓨터를 활용해야 하는건데, 비용적으로, 그리고 시간적으로 너무 비효율적입니다. 그래서 Elastic Beanstalk
를 활용하는데 이는 나 대신 서버를 만들어준다고 생각하면 좋을 것 같습니다.
eb
는 자동적으로 ec2
라는 인스턴스를 생성하고, ec2 인스턴스에 코드를 쉽게 배포하도록 도와줍니다.
pip install awsebcli --dev
다음의 명령어로 CLI를 설치합니다.
설치 후 터미널에 eb
를 입력하면 수많은 커맨드를 볼 수 있습니다.
그 후 aws가 우리가 누군질 알 수 있도록 초기화 과정을 거쳐야 합니다.
터미널에 eb init
을 입력하고 seoul을 선택합니다.
그 후에 본인의 credential을 입력해야 하는데 없으므로 aws 사이트로 가서 만들어야 합니다.
aws는 우리가 누군질 모르므로 IAM 에 username을 입력합니다.
cli만 필요하므로 programmatic access만 체크합니다.
우선 관리자의 권한을 일단 full access합니다.(비추천)
리뷰가 나오고 유저생성을 완료하는데 이 때 user_id
와 user_secret
이 나옵니다. user_secret
은 한번밖에 안나오므로 꼭 메모합니다!!! 더는 볼 수가 없어용!
터미널로 돌아와서 aws-access-id
와 aws-access-key
를 입력합니다.
그 후에 어플리케이션 이름확인하고 파이썬 버전을 선택하고, commit 선택(선택 안 했습니다) 등 선택사항들을 선택합니다.
Django앱을 EB에 배포를 어떻게 해야 할까요..? Elastic Beanstalk가 어떻게 작동하는지 알아보겠습니다.
우선 .ebextensions
라는 폴더를 생성합니다.
이 폴더에서 서버에 마이그레이션을 요청하거나, 관리자를 생성하는 등의 행동을 합니다.
다음으로 해당 코드를django.config
폴더에 만들어 입력합니다.
python manage.py runserver
는 느리고 또 배포용이 아닙니다. 그래서 config폴더에 wsgi.py
가 존재합니다. wsgi는 django 앱을 배포하는 하나의 방법으로, 아래의 코드가 엘라스틱 빈스택을 호출하는 방식입니다.
.ebextensions
에 django.config
파일 내의 코드를 다음과 같이 입력합니다. WSGIPath는 다음과 같습니다.
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: config.wsgi:application
이제 장고 가상환경을 만들어야 합니다. 다음의 코드를 입력합니다.
eb create 프로젝트명
설치가 완료되면 aws 페이지에서 프로젝트가 보입니다.
위 사진에서 보이듯이 업로딩을 하면 zip을 해서 AWS s3
로 업데이트합니다. 그리고 자동으로 쉬운 인스턴스를 만들어줍니다.
그리고 가상환경을 만듭니다. 보통의 방식은 테스팅하는 가상환경, 프로덕션 환경 2개를 만듭니다.
eb create django-env
eb를 create하거나 영향을 미치는 과정을 하고, 반드시 변경사항을 commit해야합니다. 그 후에 eb deploy
를 해야 합니다. EB는 본인의 git commit
에 있는 기록들을 가져가기 때문입니다.
AWS, 구글, Heroku는 루트에서 requirements.txt를 찾습니다.
deploy를 마치면 404에러를 넘어서 500에러가 나옵니다. 그리고 다음의 에러를 내뱉습니다. ModuleNotFoundError : No module named 'django'
왜냐하면 django라는 이름의 모듈이 없기 때문입니다.
django가 아직 EB에 설치되어있지 않기 때문에 EB한테 pipfile
에 있는 모든 것을 설치하라고 해야 합니다. 다음의 과정이 필요합니다.
pip freeze > requirements.txt
OR pipenv를 사용하는 경우라면 pipenv_to_requirements -f
해당의 명령어는 pipfile안에 있는 사항들을 requirements.txt 파일로 만들어줍니다.
파일이 생성되었으면 git add .
, 그리고 git commit -m ""
으로 커밋을 올리고 eb deploy
를 입력해 실행합니다.
EB를 보면 마지막에 데이터베이스를 넣을 수 있는 칸이 있습니다.
데이터베이스를 추가하고 싶다면 이 환경에 추가하면 되지만, 많은 개발자들은 이 방식을 선택하지 않습니다.
왜냐하면 이 EB가 죽는다면 DB또한 먹통이 됩니다. 그리고 green and blue 배포 전략
을 하게 되지 못하게 됩니다.
green and blue 배포 전략이란 매번 eb deploy할 때마다 서버가 10초정도 정지되는데, 한 앱을 배포할 때 '돌아가는 서버' 다음에 '새로운 환경'을 만들어 새 환경으로 수정사항을 보내고 테스트가 완료되면 서로 url을 변경합니다. 이렇게 하면 웹사이트가 1초라도 멈추지 않게 됩니다.
EB는 예전 환경을 삭제하는데 DB가 있으면 환경이 삭제됩니다. 따라서 RDS
를 사용합니다.
RDS를 활용하면 DB를 EB설정에서 분리되게 만들도록 허용해줍니다.
그리고 설정 입력을 완료합니다.
RDS를 오픈한 후 django-setting에서 DATABASE를 수정합니다.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "westargram",
"USER": "사용자이름",
"PASSWORD": "비밀번호",
"HOST": "Endpoint값",
"PORT": "5432",
}
}
엔드포인트와 포트번호까지 입력합니다.
보안을 위해 환경변수에 저장하거나 파일을 gitignore에 올리는 것도 방법이고 다른 방법으로 EB에 들어간 다음 Software파트에서 수정 버튼을 누르고 환경 변수를 입력합니다.
그러면 다음과 같이 입력할 수 있습니다.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"HOST": os.environ.get("RDS_HOST"),
"NAME": os.environ.get("RDS_NAME"),
"USER": os.environ.get("RDS_USER"),
"PASSWORD": os.environ.get("RDS_PASSWORD"),
"PORT": "5432",
}
}
그 후 commit 및 eb deploy를 합니다.
ALLOWED_HOSTS = ['*']
를 ALLOWED_HOSTS = ['.elasticbeanstalk.com', 'handsomedavid.com']
으로 보안을 위해 변경합니다.