웹프로그래밍/Django

[django] AWS EC2로 배포

ssung.k 2020. 6. 9. 21:19

Amazon EC2란?

EC2란 Amazon Elastic Compute Cloud의 즐임말로서 AWS에서 제공하는 클라우드 컴퓨팅입니다.

이를 통해 하드웨어 구매없이 더 빠르게 애플리케이션을 개발하고 배포할 수 있습니다.

Amazon EC2를 통해 원하는 만큼 가상 서버를 구축하고 보안 및 네트워크 구성과 스토리지 관리가 가능합니다. 또한 Amazon EC2는 요구 사항이나 갑작스러운 인기 증대 등 변동 사항에 따라 신속하게 규모를 확장하거나 축소할 수 있어 서버 트래픽 예측 필요성이 줄어듭니다.

 

AWS에서 EC2 인스턴스 생성

그러면 AWS에 접속해서 위에서 설명한 EC2 인스턴스를 만들어주겠습니다.

https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2

 

그 전에 확인해야 할 것이 한 가지 있는데 오른쪽 상단에 보면 region, 지역을 선택할 수 있습니다. 적합한 지역을 선택하면 되겠지만 한국에서 하는 서비스라면 당연히 서울이 적합하겠죠?

 

오른쪽 위에 서비스를 누른 후 EC2 로 들어갑니다.

 

그 후 인스턴스를 시작해줍니다.

 

총 7단계에 걸쳐 설정을 진행하게 됩니다.

우선 첫번째로 AMI 선택입니다.

AMI는 Amazon Machine Image로서 인스턴스를 시작하는 데 필요한 소프트웨어 구성(운영 체제, 애플리케이션 서버, 애플리케이션)이 포함된 템플릿입니다.

프리티어 사용 가능한 것 중 Ubuntu Server 18.04 LTS (HVM), SSD Volume Type 을 골라주겠습니다.

 

두 번째로 인스턴스 유형 선택입니다.

인스턴스는 애플리케이션을 실행할 수 있는 가상 서버로서 CPU, 메모리, 스토리지, 네트워킹 용량의 다양한 조합이 있습니다.

아래서 프리티어로 사용 가능한 t2.micro를 선택해주었습니다.

 

세 번째부터 여섯 번째 까지는 나중에 필요에 의해 설정할 수 있으니 우선 넘어가도록 하겠습니다.

 

이제 인스턴스를 생성합시다.

그러면 다음과 같이 키페어를 설정하는 창이 뜹니다.

 

저는 기존에 키 페어가 있기 때문에 해당 키로 진행을 할 것이고 키가 없다면 새 키 페어 생성을 통해 키페어를 생성해줍니다.

해당 키를 통해 서버에 접속할 수 있기 때문에 키는 안전한 폴더에 잘 보관 할 수 있도록 합시다.

 

약간의 시간이 소요되고 인스턴스가 만들어집니다.

 

 

EC2 인스턴스로 접속

그럼 이제 생성한 EC2 인스턴스로 접속해보도록 하겠습니다.

우선 터미널을 실행하고 위에서 생성한 키가 있는 위치로 이동합니다.

 

해당 EC2 인스턴스를 클릭하고 왼쪽 위에 연결버튼을 누르면 연결하는 방법이 나옵니다.

 

해당 키를 다른 사람이 확인 불가능 하도록 권한을 변경해줍니다.

chmod 400 go_home.pem

 

그 후 아래 예시처럼 접속을 해주겠습니다.

키의 이름과 퍼블릭 DNS의 이름은 상황에 맞게 수정해주도록 합시다.

ssh -i "go_home.pem" ubuntu@ec2-13-125-253-120.ap-northeast-2.compute.amazonaws.com

 

서버에 접속된 것을 확인 할 수 있습니다.

 

EC2 서버 세팅

이제 서버를 세팅해봅시다.

우선 여러 패키지를 설치할 수 있는 apt-get을 업데이트해줍니다.

sudo apt-get update

 

이어서 필요한 git과 pip를 설치해줍니다.

sudo apt-get install python3-pip
sudo apt-get install git

 

이제 git을 통해 기존에 생성해두었던 django 프로젝트를 가져오도록 합시다.

git clone gitgub-repo-링크

django project를 가져온 이후에 secrets.json을 만들고 runserver를 실행하는 명령어는 django프로젝트의 세팅마다 다를거라고 생각되어 생략하도록 하겠습니다.
다만 조심해야할 점은 평상시처럼 runserver를 해서 8000 포트를 열어도 이는 로컬에서만 접속가능한 포트입니다.
아래 예시와 같이 0:8000 포트를 지정해줘야 합니다.

python3 manage.py runserver 0:8000 --settings=config.settings.deploy

 

외부에서 접속 확인

AWS에서 좌측 메뉴에서 네트워크 및 보안/보안그룹에서 해당 보안그룹을 추가해줍시다.

사용자지정 TCP에 대해 8000번 포트로 위치 무관으로 수정하겠습니다.

 

다시 EC2 서버에서 django를 실행시켜줍시다.

이 때 위에서 열어주었던 8000 포트를 이용해 퍼블릭 DNS에 접속해보겠습니다.

http://ec2-13-125-253-120.ap-northeast-2.compute.amazonaws.com:8000/

 

 

터미널을 닫아도 계속 실행

단순하게 생각해서는 EC2 서버에 접속에서 django를 runserver를 했으므로 이제 터미널을 닫고 연결을 끊더라도 EC2 서버에서는 django가 계속 돌아가고 있을거라고 생각할 수 있습니다.

하지만 프로세스를 확인해보면 실행되고 있는 django의 부모 프로세스가 해당 터미널의 프로세스입니다. 따라서 터미널이 닫히면 자동으로 자식 프로세스들도 종료시키는 것이죠.

그렇기 때문에 추가적인 설정이 필요합니다.

  1. 우선 서버를 실행시킵니다.

  2. control + Z를 통해 해당 프로그램을 정지합니다.

    [8]+  Stopped python3 manage.py runserver 0.0.0.0:8000 --settings=config.settings.deploy
    
  1. 아래 명령어를 통해 프로그램을 백그라운드로 보냅니다.

    bg
    
  2. 아래 명령어를 통해 ssh 연결이 끊어져도 해당 프로세스가 돌아가도록 합니다.

    disown -h
    
  1. 실행중인 프로세스를 확인하면 존재하는 것을 알 수 있습니다.

    ps -l