본문 바로가기
클라우드 서버/AWS

[AWS] EC2 Django 서버 구축 및 배포

by 보안매크로 2024. 6. 19.
728x90

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

- Django 테스트 서버를 EC2에 올려보는 작업

1. EC2 인스턴스 생성

 EC2인스턴스 이름을 생성하고,

Application and OS Images (Amazon Machine Image)

 항목에는 Amazon Linux 를 사용한다. (AWS 기능을 사용하고, 속도면에서 빠르다. AWS에서 제공하는 다른 기능을 하나도 이용하지 않는다면 ubuntu가 좋은 선택이다.)

 

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

 

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

 

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

 

밑으로 내려보면 [Inbound Security Group Rules] 항목에서 Add security group rule을 눌러준다.

 

 

그러면 하단에 보안그룹규칙2가 생기면서 규칙이 한개 더 생기는 걸 볼 수 있다. 웹과 관련된 요청트래픽을 EC2서버가 받아들이도록 트래픽 유형에서 "HTTP", "HTTPS"을 선택하고, 아래와 같이 설정해준다. (0.0.0.0/0 은 모든 ip의 접근을 허용한다.)

 

 

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

 

 

[고급 세부 정보]에는 내가 생성할 인스턴스에 대해서 정말 세세하게 만들 수 있도록 지원하는 항목인데, 추후에 필요한 항목에 대해 수정한다.

 

 

[Summary]에서 내가 만들 인스턴스에 대해서 설정들이 맞는지 체크하고,  Launch instance눌러서 생성해준다!

 

 

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

 

 

 

2. 탄력적 IP주소 생성

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

단, 탄력적 IP주소를 인스턴스와 매칭시켜주고, 인스턴스를 종료해두면 요금이 청구될 수 있다! 주의하자. 인스턴스 하나당 한개의 탄력적 IP주소만을 사용해야 요금이 안나간다. 사용하지 않을땐 매칭되어 있는걸 해제해주고, 탄력적 ip주소를 제거해줘야 안전하게 요금청구 없이 인스턴스를 Stop 시킬 수 있다.

좌측 메뉴의 [Network & Security]항목에서 탄력적IP를 클릭 한 후 [Elastic IPs]을 클릭한다.

 

 

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

 

 

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

 

 

 

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

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

 

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

 

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

 

 

 

4. EC2 접속하기

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

instances - Connect(연결) - SSH client - 명령어 입력(window 기준으로 설명드립니다)

명령어(Window 기준)

- cmd에서 해당 명령어 입력

ssh -i "저장한 ssh키 경로" "Public DNS"

예시)  ssh -i "C:\Users\test\AWS\ssh\key.pem" ec2-user@ec2-11-11-111-11.asdsadasda-3.computer.amazonaws.com

 

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

전체 과정 요약

  1. 패키지 목록 업데이트
    sudo yum update -y
  2. Python 3, pip, venv 설치
    sudo yum install -y python3 python3-pip
  3. 가상환경 생성
    python3 -m venv myenv
  4. 가상환경 활성화
    source myenv/bin/activate
  5. Django 설치
    pip 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 &

다만, 장고가 지원하는 runserver는 실제 웹서버가 아닌 간단한 개발이나 디버깅용 테스트서버이기 때문에, Nginx나 Apache등의 웹 서버를 사용하여 배포하시는 것을 추천합니다.
    •  
 
728x90