본문 바로가기
AWS

[AWS] EC2로 Django 서버 배포해보기

by 젊은오리 2022. 7. 20.
728x90

EC2는 Elastic Compute Cloud라고 해서 AWS에서 제공하는 독립적인 컴퓨터 서버이다. AWS가 제공하는 클라우드상에 나만의 서버를 하나 만듦으로써 서버구축에 필수적인 금액적인 요소나 보수, 관리 등을 본인이 부담을 안해도 되기 때문에 수많은 개인이나 기업이 사용하고 있는 서비스이다. 

이제 오늘 들었던 강의를 바탕으로 기억을 되짚어 보면서 만들었던 Django 테스트 서버를 EC2에 올려보는 작업을 까먹지 않도록 하나하나 정리해보자..!! 

 

1. EC2 인스턴스 생성

EC2인스턴스 이름을 생성하고, [애플리케이션 및 OS이미지]항목에는 Ubuntu22.04 LTS버전을 골랐다.(우분투의 경우 프리티어가 지원되어 무료로 사용가능하다.)

 

인스턴스 유형도 마찬가지로 프리티어가 지원되는 t2.micro를 선택한다.

 

이제 인스턴스에 연결할 수 있는 키 페어를 만들어줘야한다. 기존에 있는 키페어를 사용할 수 있지만  없다는 가정 하에 오른쪽[새 키페어 생성]을 클릭해서 이름을 정한뒤에 키페어유형은 기본값인 RSA선택, 키파일형식은 .pem을 선택한 후에 키페어를 생성한다. [키페어생성]을 클릭하면 .pem파일이 자동으로 다운로드되는데, 이 파일을 보관하고 싶은 곳에 옮겨주고, 넘어간다.(이 키를 분실하면 EC2에 SSH로 접속할 수 없게 되기 때문에 절대 노출되면 안된다!!)

 

보안그룹을 설정해줄 차례이다. 지금은 Django웹서비스 제공을 목적으로 EC2서버를 사용하는 것이기 때문에 웹과 관련된 모든 요청 트래픽이 EC2서버로 들어오는 것을 허용해야 한다. [네트워크 설정] 항목 오른쪽에 [편집]을 클릭한다.

 

 

밑으로 내려보면 [인바운드 보안 그룹 규칙] 항목에서 Add security group rule을 눌러준다.

 

그러면 하단에 보안그룹규칙2가 생기면서 규칙이 한개 더 생기는 걸 볼 수 있다. 웹과 관련된 요청트래픽을 EC2서버가 받아들이도록 트래픽 유형에서 "HTTP"을 선택하고, 모든 IP에 상관없이 접근 가능하도록 소스유형을 "위치무관"을 눌러준다.

 

다음은 [스토리지 구성]이다. 스토리지 구성은 다음과 같이 기존을 유지한채 넘어간다.

 

[고급 세부 정보]에는 내가 생성할 인스턴스에 대해서 정말 세세하게 만들 수 있도록 지원하는 항목인데, 현재로써는 넘어가준다.

 

[요약]에서 내가 만들 인스턴스에 대해서 설정들이 맞는지 체크하고, 인스턴스 시작을 눌러서 생성해준다!

 

다음 아래 사진과 같이 [인스턴스] 에 들어가보면, 방금 생성한 인스턴스가 실행중인 것을 볼 수있다. 정말 간단하게 하나의 서버환경을 구축을 완료했다..!! 

 

 

2. 탄력적 IP주소 생성

EC2서버를 재부팅시키는 경우에, 이전과는 다른 공인 IP주소가 할당되는 경우가 발생한다. 따라서 항상 같은 IP주소를 서버에 할당해 주기 위해서는 탄력적IP주소를 생성하고, 우리가 만든 EC2서버로 연결시켜주는 작업이 필요하다.

좌측 메뉴의 [네트워크 및 보안]항목에서 탄력적IP를 클릭 한 후 [탄력적 IP 주소 할당]을 클릭한다.

 

IP주소를 네트워크 경계그룹으로 제한하려면 파라미터 설정을 해줘야 한다고 되있지만, 현재로써는 제한할 필요가 없기 때문에 기본값을 그대로 유지한 채 다음페이지로 넘어간다.

 

정상적으로 탄력적 IP주소 생성완료된 모습이다.

 

 

 

3. EC2서버에 탄력적IP주소 할당

이전화면에서 계속해서 [작업]을 클릭해서 [탄력적 IP 주소 연결]을 클릭한다.

 

연결할 EC2서버(인스턴스)를 선택해야 한다. 방금 우리가 만들었던 인스턴스를 선택한 후에 연결을 클릭한다.

 

연결을 완료했으면 결과를 보기 위해서 메뉴바에 [인스턴스]항목에서 탄력적 IP주소를 확인해본다. 탄력적 IP주소가 안뜬다면 새로고침을 눌러보자. 

 

 

 

4. EC2 접속하기

EC2서버를 구축했으니, 이제 우리가 만든 Django서비스를 배포할 것이다. 

따라서 원격지의 EC2서버로 접속을 먼저 해야 하는데, 이번 단계에서는 SSH라는 원격 접속 툴과 키-페어 파일을 통해서 EC2서버로 접속해본다.

먼저 터미널을 하나 킨 다음 아래와 같은 형식으로 명령어를 입력해준다.

ssh -i {KEY_PATH} {USER}@{SERVER_IP}

  • {KEY_PATH} - EC2서버 쪽에서 인증에 사용될 키페어(.pem)파일의 경로
  • {USER} - 접속한 서버에서 사용할 User계정, Ubuntu운영체제를 선택할 경우 기본으로 ubuntu계정 사용
  • {SERVER_IP} - 접속하고자 하는 서버의 IP주소(우리가 EC2서버에 부여한 탄력적 IP주소)

 

필자의 경우는 키파일(testKey)이 있는  경로로 직접 이동했고, 서버IP가 43.200.152.69여서 아래와 같이 입력한다.

ssh -i testKey.pem ubuntu@43.200.152.69

이후에 어떤 질문이 나오면 yes를 입력해서 서버연결을 완료한다. 서버연결이 정상적으로 되었다면 아래 사진과 같이 초록색으로 바뀌면서 @뒤쪽에 IP주소 또는 HostName이 나올 것이다.

 

 

5. EC2서버 내에 Python/Django 실행 환경 구축

먼저 python과 Django패키지를 설치하기 위해서 패키지목록을 업데이트해준다. 

~$ sudo apt-get update

python3, pip(라이브러리 설치 프로그램),  venv(가상환경 관리도구)을 설치해준다.

~$ sudo apt-get install python3-pip python3-venv -y

Django의 가상환경을 하나 만들어준다.

~$ python3 -m venv [가상환경이름]

가상환경에 진입한다

~$ source [가상환경이름]/bin/activate

가상환경에서 Django패키지를 설치해준다.

~$ pip3 install Django

 

 

6. Github에서, 배포할 프로젝트 Clone/Pull

Clone에 앞서 배포할 Django프로젝트 settings.py에서 ALLOWED_HOSTS = ['*']를 입력해주자. 미리 안바꾸면 나중에 ubuntu에서 수정해야한다.(linux어색한사람 조심..)

배포할 프로젝트를 Clone해준다.

~$ git clone [레파지토리]

Clone된 Django프로젝트 폴더로 이동한다.

~$ cd [프로젝트 폴더]             <--어딘지 모르겠으면 manage.py이 속한 폴더라고 생각하면 된다.

Django 앱에서 사용할 DB를 세팅해줘야 하므로 두개의 명령어를 입력해준다.

~$ python3 manage.py makemigrations

~$ python3 manage.py migrate

마지막으로 sudo -E $(which python) manage.py runserver 0.0.0.0:80 명령어를 통해서 Django테스팅 서버를 작동시킨다.

~$ sudo -E $(which python) manage.py runserver 0.0.0.0:80

 

이제 브라우저를 켜서 탄력적IP를 입력해보면 아래와 같이 IP주소를 통해서 사이트에 접속할 수 있다.

 

잘 된것 같지만 한가지 문제점이 있다. sudo -E $(which python) manage.py runserver 0.0.0.0:80 지금 이 명령어로 들어갈 경우에, 터미널창을 닫게 되면 웹 페이지에 접속할 수 없게 된다. 

이는 서버에서 처리된 방식이 Foreground방식이기 때문이다. Foreground란 사용자의 입력 -> 대기 -> 사용자에게 출력 순으로, 사용자의 입력과 같은 상호작용에 따라 프로그램이 실행되고 종료되는 방식이다. 따라서 우리는 사용자와의 상호작용이 필요없는, 즉 사용자의 입력에 상관없이 프로그램을 실행할 수 있는 Background방식으로 바꿔줄 필요가 있다.

이를 위해서 Linux계열 운영체제들은 임의의 프로세스를 Background에서 실행시키도록 하는 접두어 "nohup"이 존재한다.

nohup을 이용해서 Django 테스트서버를 Background에서 실행시키려면 기존의 코드가 아닌 아래코드를 입력하자.

~$ sudo -E nohup $(which python) manage.py runserver 0.0.0.0:80 &

728x90

댓글