Django 어플리케이션 AWS EC2 인스턴스로 배포하기

고봉진·2023년 5월 6일
0

AWS

목록 보기
1/3

Django 어플리케이션 AWS EC2 인스턴스로 배포하기

0. EC2 인스턴스 실행

❗️ Root 계정으로 진행하지 않는다.

Root 계정(계정이 처음 만들어졌을때 Root 계정이다)을 사용하고 있는 경우 IAM → 사용자 → 사용자 추가를 선택해 하위 계정을 생성해 진행한다. AdministratorAccess 권한이면 충분하다. 직접 정책 연결할 수도 있고 권한이 지정된 그룹에 사용자를 추가할 수도 있다.

IAM 맨 오른쪽 'AWS 계정' 섹션에서 기억하기 쉽도록 계정 별칭을 지정한다. 필자는 thebjko-alias로 지정했고, 유저명은 thebjko이다. 로그인 화면은 다음과 같다:

IAM 사용자로 로그인 1.png


IAM 사용자로 로그인 2.png


0. 보안 그룹

1. 보안 그룹 생성

보안 그룹 생성.png

2. 기본 세부 정보 입력

기본 세부 정보 입력.png
VPC는 그대로 두면 된다.

3. 인바운드 규칙

EC2 인스턴스로 들어오는 트래픽에 대한 규칙. 모든 소스(0.0.0.0/0, IPv4)에서 HTTP와 SSH를 허용하고 진행한다.
인바운드 규칙.png

4. 아웃바운드 규칙

EC2 인스턴스에서 나가는 트래픽에 대한 규칙. 모든 소스(0.0.0.0/0, IPv4)로 HTTP를 허용한다.
아웃바운드 규칙.png


1. 인스턴스 만들기

1. 인스턴스 시작

인스턴스 시작.png

2. 이름을 지정하고 Ubuntu Server 22.04 LTS를 OS로 선택한다

AMI 선택.png

3. 인스턴스 유형은 프리 티어 사용이 가능한 t2.micro로 선택

인스턴스 유형 선택.png

4. 여기서는 키 페어 없이 진행한다.

키 페어는 ssh로 접속하기 위해 필요하다. 여기선 EC2 Instance Connect를 사용해 진행한다.
키 페어 없이 계속 진행.png

5. 보안 그룹 선택

기존 보안 그룹 선택.png
기존 보안 그룹 선택 → 위에서 생성한 보안 그룹 선택

6. 인스턴스에 연결하기

인스턴스 선택 후 연결.png
해당 인스턴스를 선택하고 연결 클릭한다.

Connect(연결) 클릭
EC2 Instance Connnect


1. 인스턴스 환경 설정

프로젝트 중 django-allauth 패키지를 사용했는데, 어떤 이유에선가 가상환경에서 설치가 안된다. 한 스택 오버플로우 답변에서는 파이썬 버전을 다운그레이드 하라고 하는데, pipenv라는 가상환경에서는 문제 없이 설치가 되어, 가상환경으로 pipenv를 사용하기로 한다.


Pipenv는 파이썬 버전도 기록되는 것 같다. 따라서 인스턴스의 파이썬을 업그레이드한다.

💁 Ubuntu 22.04 LTS의 디폴트 파이썬 버전은 3.10.6이다. 이 버전 이하의 파이썬을 사용했다면 이 과정은 생략해도 좋을 것 같다.

  1. python으로 python3를 호출하기 위한 패키지
sudo apt install python-is-python3
  1. 파이썬 저장소 등록
sudo add-apt-repository ppa:deadsnakes/ppa

ENTER

  1. apt 업데이트 후 파이썬 3.11버전 설치
sudo apt update && sudo apt install python3.11 -y
  1. python3으로 호출할 파이썬 지정
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 110 && sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 100 && sudo update-alternatives --config python3

실행 후 적절한 파이썬을 선택한다. 필자의 경우 2

  1. 이후 sudo apt-get update 명령을 실행하면 apt_pkg 모듈이 없다는 에러가 뜰 것이다. 아래 명령을 실행해 현재 apt_pkg버전을 확인
cd /usr/lib/python3/dist-packages && ls -l | grep apt_pkg
  1. 확인한 버전으로 아래 명령 실행
sudo ln -s apt_pkg.cpython-{확인한 apt_pkg 버전}-x86_64-linux-gnu.so apt_pkg.so

필자의 경우 310


NGINX, supervisor 설치

sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y nginx && sudo apt-get install supervisor

Pip & pipenv 설치

Pip과 가상환경인 pipenv를 설치해야 한다. 파이썬 버전을 전면 개정했기 때문인 것 같다.

cd ~ && curl https://bootstrap.pypa.io/get-pip.py -O && python get-pip.py && . ~/.profile && pip install pipenv

홈 디렉토리로 이동해 pip 파일을 받고 실행 한다. ~/.profile 파일을 실행해 ~/.local/bin 디렉토리를 PATH에 추가해야 그 안에 있는 pip 명령을 바로 실행할 수 있다. 이후 pip install pipenv를 실행해 설치한다.

홈 디렉토리에서 가상 환경을 실행한다. (좀 더 구체적인 디버깅이 필요하겠지만, 특정 디렉토리에서 실행했을 때 잘 안 되던 것 같다는 기억이 있다. 홈 디렉토리에서 생성한 가상환경은 잘 작동했기 때문에 이 글에서는 홈 디렉토리에서 실행한 가상 환경에서 진행한다.)

프로젝트 디렉토리 생성 및 깃허브 클론 후 requirements.txt 파일을 사용해 필요 패키지들을 설치한다.

pipenv shell && pipenv install -r project/requirements.txt

2. Gunicorn.conf

/etc/supervisor/conf.d 디렉토리로 이동해 gunicorn.conf 파일을 생성한다.

cd /etc/supervisor/conf.d && sudo vi gunicorn.conf

슈퍼유저 권한으로 실행(sudo)해야 편집 가능하다. 아래와 같이 입력한다.

[program:gunicorn]
directory=/home/ubuntu/{project 디렉토리}
command={gunicorn 커맨드가 있는 위치} --workers 3 --bind unix:/home/ubuntu/{project 디렉토리}/app.sock {어플리케이션 이름}.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log

[group:guni]
programs:gunicorn
  • Gunicorn 커맨드가 있는 위치는 whereis gunicorn 커맨드로 확인할 수 있다. 이 프로젝트의 경우 /home/ubuntu/.local/share/virtualenvs/ubuntu-iR9coyfD/bin/gunicorn
  • 어플리케이션 이름은 settings.py 파일의 WSGI_APPLICATION에서 확인할 수 있다. 'config.wsgi.application'인 경우 config로 작성한다.
  • 프로젝트 디렉토리 이름을 {project 디렉토리}에 입력한다

로그 파일이 저장될 장소를 생성한다

sudo mkdir /var/log/gunicorn

아래 명령으로 상태를 확인한다.

sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl status

RUNNING이 나오면 잘 작동한다는 뜻이다. 잘 안될경우 sudo systemctl restart supervisor 명령으로 supervisor를 재시작해보자.


3. Nginx.conf

아래 파일에서 user를 root이나 ubuntu로 수정하자.

sudo vi /etc/nginx/nginx.conf
user root;

4. Django.conf

파일 생성 후

sudo vi /etc/nginx/sites-available/django.conf

아래 내용 작성

server{
    listen {사용할 포트 번호};
    server_name {접근할 주소. 띄어쓰기로 구분해 여러개 사용 가능};
                        
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/{project 디렉토리}/app.sock;
    }


}
  • 사용할 포트 번호 : HTTP는 80
  • EC2 인스턴스의 Public IPv4를 입력한다. Public IPv4 DNS도 같이 입력할 수 있는데, 이 때에는 nginx.conf 파일 http 블록 맨 위에 다음과 같이 내용을 추가할 필요가 있다:

/etc/nginx/nginx.conf:

http {
	server_names_hash_bucket_size  <size>;
	...
}
  • Size : AWS EC2 인스턴스의 Public IPv4 DNS는 128로 충분하다.

5. Nginx 구문 테스트

sudo nginx -t

작성한 내용이 nginx 문법에 맞는지 검사한다.


6. /etc/nginx/sites-enabled에 django.conf에 대한 심볼릭 링크 생성 및 nginx restart

sudo ln /etc/nginx/sites-available/django.conf /etc/nginx/sites-enabled
  • ln : ln TARGET DIRECTORY의 형태로 사용. TARGET에 대한 symbolic link를 DIRECTORY 안에 생성한다.

Nginx 재시작

sudo service nginx restart

7. 기타

  1. Disallowed Hosts 에러 : settings.py ALLOWED_HOSTS 리스트에 추가하고, 서버를 재부팅하거나 sudo systemctl restart supervisor 명령으로 supervisor만 다시 실행해 변경사항을 반영할 수 있다.
  2. Migration 중 db가 잠겨있다고 뜰 수 있다. db를 삭제하고 다시 migrate를 진행해 해결할 수 있지만, 다른 방법도 알아볼 필요가 있을 것 같다.
  3. conf 파일 수정후 supervisor reread, update, status 및 nginx를 재실행.
  4. mysqlclient가 설치되지 않으면
	sudo apt install -y python3.11-dev libmysqlclient-dev libssl-dev


참고자료

profile
이토록 멋진 휴식!

0개의 댓글