ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Deploy django app on AWS EC2
    Project using python/Cloning Airbnb 2021. 4. 24. 22:57

      AWS EC2(Amazon Elastic Computing Cloud)는 호스트에게 컴퓨팅을 대여해주는 클라우드 서비스다. 원하는 시스템과 컴퓨팅 파워를 선택하고 그에 해당하는 요금만 지불하면 된다. On-premise 서버보다 좋은 점은 저렴한 비용으로 서버를 탄력적으로 운용할 수 있다.

    EC2 생성

    AWS Console 사이트에서 서비스 nav bar에서 EC2를 선택하자.

    AWS EC2

    좌측에서 EC2를 선택하자.

    인스턴스

    우측에 '인스턴스 시작'을 클릭하자.

    인스턴스 시작

    여러 가지 OS가 있는데 이 중 Ubuntu Server 20.04 LTS version을 선택한다.

    Ubuntu Server 20.04 LTS

      각자 원하는 사양을 선택해도 좋은데, 나는 프리티어 버전인 t2.micro를 선택하겠다. '다음:인스턴스 세부 정보 구성'을 선택하자.

    인스턴스 유형 선택

      인스턴스 세부 정보 구성 단계인데, 딱히 건드릴 것이 없어서 다음 단계로 넘어가겠다.

    인스턴스 세부 정보 구성

      스토리지 추가 단계인데, 프리 티어 사용 가능 고객은 최대 30GB를 사용할 수 있다고 나와 있다. 나는 배포만 잠깐 해볼 것이므로 8GB로 남겨두겠다.

    스토리지 추가

    태그 추가는 건드릴 것이 없다. '다음:보안 그룹 구성'을 선택하자.

    태그 추가

      보안 그룹 구성을 해야 하는데, 규칙 추가 버튼을 이용해서 다음과 같이 보안을 구성하자. SSH로 통신하기 때문에 ssh를 열어뒀다. 나는 장고 웹 앱을 배포할 것이기 때문에 http, https port를 열어뒀고, django는 개발할 때 8000번 port로 동작하기 때문에, test용 port로 8000번을 열어뒀다. 그리고 '검토 및 시작'을 누르자

    보안 그룹 구성

    인스턴스 시작 검토에서 '시작하기'를 누르자.

    인스턴스 시작 검토

      시작하기 버튼을 누르면 키 페어 선택 또는 생성 창이 뜬다. 나는 기존 키 페어가 있기 때문에 '기존 키 페어 선택'을 선택했다. 없으면 새 키 페어 생성을 하면 된다. 키 페어는 ssh 연결을 할 때 중요한 비밀키이기 때문에, 보관을 잘 해야 한다. 혹시나 git에 올리지 않도록 하자. 나는 /pem/django.pem으로 키를 저장했고, .gitignore에 /pem을 추가했다.

    .gitignore

      키가 생성될 때 .pem 파일이 다운로드되는데, 이 파일이 있는 경로를 기억해두자. 키 페어 선택 또는 생성이 완료되면 인스턴스 시작을 누르자.

    키 페어 선택 및 생성

      인스턴스 생성이 완료되었다. 인스턴스 세부 정보에서 퍼블릭 ip를 확인할 수 있다.

    인스턴스 정보

    Postgresql with RDS

    AWS에서 DB 생성

     AWS의 RDS(Relational Database Service)를 이용해서 DB 서버를 app server와 분리시킬 것이다. 서비스 탭에서 데이터베이스 밑에 있는 RDS를 선택하자.

    AWS RDS

    데이터베이스 생성을 클릭한다.

    데이터베이스 생성

      데이터 베이스는 PostgreSQL을 선택하고 버전은 기본 설정 버전을 선택하자. 템플릿은 무료로 사용하기 위해서 '프리 티어'를 선택했다.

    데이터베이스 생성

    각각의 설정 값은 django에서 설정할 때 필요한 값이다. 'DB 인스턴스 식별자'는 RDS_NAME이 되고, '마스터 사용자 이름'은 RDS_USER, 마스터 암호는 'RDS_PASSWORD'가 된다. 이 값들은 모두 .env 파일에 추가해야 한다.

    DB 설정

      추가로 할 작업은 없으므로 데이터베이스를 생성한다.

    DB 생성

      DB가 생성되면 연결&보안 탭에서 엔드포인트가 있다. 이 엔드포인트는 django app에서 RDS_HOST가 된다. 이 주소도 .env에 추가하자.

    DB 엔드포인트

    django에서 DB 설정 (config/setting.py)

      Production 단계이기 때문에 DEBUG 설정을 다음과 같이 한다. .env에서 DEBUG는 True로 설정되어 있다. AWS에 환결성정에는 DEBUG가 추가되지 않기 때문에 DEBUG=False가 될 것이다.

    config/settings.py

    DEBUG에 값에 따라 DB 환경을 설정을 나눈다.

    config/settings.py

    더 추가로 설정해야 하는 부분은 aws ubuntu server에 ssh로 접속하고 나서 할 것이다.

    S3 storage 설정하기

    AWS에서 S3 생성

     AWS의 S3를 이용해서 이미지와 static files를 저장하는 스토리지를 따로 관리할 것이다.

    AWS S3

    버킷 만들기를 통해서 버킷을 생성한다.

    버킷 만들기

    버킷 이름을 짓고 AWS region을 선택한다.

    S3 일반 구성

    반드시 Public을 해줘야 파일들을 업로드할 수 있다.

    버킷 만들기를 통해서 버킷을 생성한다.

    버킷 생성

    IAM 설정

      S3를 이용하기 위해서는 AWS key가 필요하다. AWS key는 AWS-IAM에서 얻을 수 있다. 서비스->IAM을 클릭한다.

    AWS-IAM

    '사용자 추가'를 한다.

    사용자 추가

      사용자 이름은 당신이 원하는 대로 짓고 액세스 유형은 '프로그래밍 방식 액세스'를 선택한다. 우리가 필요한 것은 액세스 키 ID 및 비밀 액세스 키가 필요하기 때문이다.

    사용자 설정

      정책 설정은 중요하다. 내가 생성하는 user에게 많은 권한을 주고 타인이 나의 key 값을 알게 된다면 s3 이외에도 db나 다른 aws 기능을 건드려서 시스템을 파괴할 수가 있기 때문이다. key 값이 탈취당하였을 경우 피해를 s3로 최소화시켜야 한다.

    '기존 정책 직접 연결' -> 정책 필터에서 s3 검색 -> AmazonS3FullAccess를 선택 -> '다음:태그' 클릭한다.

    정책 추가

    무시하고 '다음:검토' 클릭

    태그 추가

    '사용자 만들기'를 통해서 사용자를 만든다.

    사용자 만들기

      사용자가 생성이 되고 액세스 키 ID와 비밀 액세스 키 값을 준다. 이것을 절대로 노출되어서는 안 된다. 그 래서 나도 가리고 블로그에 게시한 것이다. 그리고 여기서 닫기를 누르면 다시는 key 값을 확인할 수 없으니 .env 파일에 저장하자.

    액세스 키 및 비밀 엑세스 키

    django에서 DB 설정 (config/setting.py)

      Installation

    $ pipenv install django-storages
    $ pipenv install boto3

      config/settings.py

    THIRD_PARTY_APPS에 "storages"를 추가한다. "storages"는 "django-storages"다.

    storages 추가

      django-storages의 문서를 따라 설정 값을 추가하면 다음과 같다. AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY는 IAM에서 얻은 키 값들이다.

    S3 설정

    이미지를 upload 하는 폴더와 static files가 저장되는 폴더를 나눴다.

    config/custom_storages.py

    ssh로 server에 접속해서 $ python manage.py collecstatic 명령어를 통해 static files를 생성한다.

    Network

    config/settings.py

      ALLOWED_HOSTS= []로 되어 있을 텐데 이렇게 되어 있으면 ngix에서 ALLOWED_HOSTS가 설정이 되어 있지 않다고 error를 일으킨다. 다음과 같이 모든 곳에서 접속할 수 있도록 *를 추가한다.(보안상 이러면 안 된다. 적절히 ACL을 하자.)

    SocialLogin

    users/views.py

    Debug mode냐 Production mode냐에 따라 redirect_uri 값을 다르게 준다.

    users/views.py

      github_login의 redirect_uri 값이 변경된 것이다. Production mode일 경우 aws ec2에 올라간 server에 public ip를 사용한다.

    github_login

      kakao_login도 똑같이 해준다.

    kakako_login

      kakao_login_callback 부분도 redirect_uri를 수정해준다.

    kakao_login_callback

    github

      Github 개발자 OAuth 설정에서 주소를 AWS EC2가 주는 ip로 수정한다.

    kakao

    Kakao 개발자 설정에서 주소를 heroku가 주는 url로 수정한다. 내 애플리케이션 선택

    자신의 app 선택

    플랫폼 선택

    수정을선택해서 localhost:port를 AWS EC2로 deploy한 나의 web application url로 바꾼다.

    좌측 메뉴에 제품 설정에서 카카오 로그인을 클릭한다.

    Redirect URL를 수정한다.

    AWS EC2 Ubuntu setting

    1. git clone <address>
    2. sudo apt update
    3. sudo apt install build-essential -y
    4. sudo pat install python3-pip -y
    5. pip3 install --upgrade pip
    6. sudo apt install virtualenv -y
    7. virtualenv -p python3 venv
    8. source venv/bin/activate
    9. pip freeze > requirements.txt
    10. pip install -r requirements.txt
    11. sudo apt install python3-psycopg2 -y
    12. sudo apt intall postgresql-client -y
    13. pip install psycopg2-binary
    14. psql -h <RDS_HOST> -p 5432 --username <RDS_USER_NAME> --dbname postgres
    15. postgres=> CREATE DATABASE <RDS_NAME>;
    16. exit
    17. python3 manage.py migrate
    18. python3 manage.py collectstatic
    19. sudo apt install gettext -y
    20. django-admin makemessages --locale=ko
    21. django-admin compilemessages
    22. python manage.py runserver 0.0.0.0:8000

    참고 자료

    소스 코드

    댓글

Designed by Tistory.