DEPLOYMENT TO AWS #1

김기현·2022년 2월 27일
1
post-thumbnail

AWS가 출시 되면서 기업에서는 높은 인프라 비용을 지불하지 않고 서버와 같은 IT 인프라를 사용할 수 있게 되었습니다. 클라우드를 통해 수 분 내에 수천 대의 서버에 가상으로 액세스하여 결과를 신속하게 제공할 수 있는데요!

오늘은 클라우드 서비스 중 AWS를 배포하는 과정을 담아보았습니다.
우선 사진과 같이 aws 페이지에서 사용자가 사용할 법한 지역을 선택해줍니다.

Configuring EB

서버 관리를 0부터 배우는 것은 그냥 텅 빈 우분투만 설치된 컴퓨터를 활용해야 하는건데, 비용적으로, 그리고 시간적으로 너무 비효율적입니다. 그래서 Elastic Beanstalk를 활용하는데 이는 나 대신 서버를 만들어준다고 생각하면 좋을 것 같습니다.

Elastic Beanstalk

eb는 자동적으로 ec2라는 인스턴스를 생성하고, ec2 인스턴스에 코드를 쉽게 배포하도록 도와줍니다.

Install AWS CLI

pip install awsebcli --dev 다음의 명령어로 CLI를 설치합니다.

설치 후 터미널에 eb를 입력하면 수많은 커맨드를 볼 수 있습니다.

그 후 aws가 우리가 누군질 알 수 있도록 초기화 과정을 거쳐야 합니다.
터미널에 eb init을 입력하고 seoul을 선택합니다.

그 후에 본인의 credential을 입력해야 하는데 없으므로 aws 사이트로 가서 만들어야 합니다.

Create IAM

aws는 우리가 누군질 모르므로 IAM 에 username을 입력합니다.

cli만 필요하므로 programmatic access만 체크합니다.

우선 관리자의 권한을 일단 full access합니다.(비추천)

리뷰가 나오고 유저생성을 완료하는데 이 때 user_iduser_secret이 나옵니다. user_secret은 한번밖에 안나오므로 꼭 메모합니다!!! 더는 볼 수가 없어용!

터미널로 돌아와서 aws-access-idaws-access-key를 입력합니다.

그 후에 어플리케이션 이름확인하고 파이썬 버전을 선택하고, commit 선택(선택 안 했습니다) 등 선택사항들을 선택합니다.

Creating an EB Environment

Django앱을 EB에 배포를 어떻게 해야 할까요..? Elastic Beanstalk가 어떻게 작동하는지 알아보겠습니다.

Create .ebextensions

우선 .ebextensions라는 폴더를 생성합니다.

이 폴더에서 서버에 마이그레이션을 요청하거나, 관리자를 생성하는 등의 행동을 합니다.

다음으로 해당 코드를django.config 폴더에 만들어 입력합니다.

wsgi

python manage.py runserver는 느리고 또 배포용이 아닙니다. 그래서 config폴더에 wsgi.py가 존재합니다. wsgi는 django 앱을 배포하는 하나의 방법으로, 아래의 코드가 엘라스틱 빈스택을 호출하는 방식입니다.

.ebextensionsdjango.config 파일 내의 코드를 다음과 같이 입력합니다. WSGIPath는 다음과 같습니다.

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: config.wsgi:application

Create django-env

이제 장고 가상환경을 만들어야 합니다. 다음의 코드를 입력합니다.

eb create 프로젝트명

설치가 완료되면 aws 페이지에서 프로젝트가 보입니다.

위 사진에서 보이듯이 업로딩을 하면 zip을 해서 AWS s3로 업데이트합니다. 그리고 자동으로 쉬운 인스턴스를 만들어줍니다.

그리고 가상환경을 만듭니다. 보통의 방식은 테스팅하는 가상환경, 프로덕션 환경 2개를 만듭니다.
eb create django-env

eb를 create하거나 영향을 미치는 과정을 하고, 반드시 변경사항을 commit해야합니다. 그 후에 eb deploy를 해야 합니다. EB는 본인의 git commit에 있는 기록들을 가져가기 때문입니다.

Requirements

AWS, 구글, Heroku는 루트에서 requirements.txt를 찾습니다.

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를 입력해 실행합니다.

MySQL part1

EB를 보면 마지막에 데이터베이스를 넣을 수 있는 칸이 있습니다.

데이터베이스를 추가하고 싶다면 이 환경에 추가하면 되지만, 많은 개발자들은 이 방식을 선택하지 않습니다.

green and blue strategy

왜냐하면 이 EB가 죽는다면 DB또한 먹통이 됩니다. 그리고 green and blue 배포 전략을 하게 되지 못하게 됩니다.

green and blue 배포 전략이란 매번 eb deploy할 때마다 서버가 10초정도 정지되는데, 한 앱을 배포할 때 '돌아가는 서버' 다음에 '새로운 환경'을 만들어 새 환경으로 수정사항을 보내고 테스트가 완료되면 서로 url을 변경합니다. 이렇게 하면 웹사이트가 1초라도 멈추지 않게 됩니다.

EB는 예전 환경을 삭제하는데 DB가 있으면 환경이 삭제됩니다. 따라서 RDS를 사용합니다.

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'] 으로 보안을 위해 변경합니다.

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글