AWS EC2, Django 프로젝트 배포하기

박도준·2020년 7월 9일
13

Django+AWS+MySQL

목록 보기
3/6
post-thumbnail

AWS란?

AWS는 Amazon Web Services의 줄임말로, 아마존닷컴이 제공하는 각종 원격 컴퓨팅 서비스(웹 서비스)입니다. 아마존 웹 서비스는 다른 웹 사이트나 클라이언트측 응용 프로그램에 대해 온라인 서비스를 제공하고 있습니다.

AWS EC2란?

Amazon EC2(Amazon Elastic Compute Cloud)는 Amazon Web Services(ASW) 클라우드에서 확장 가능한 컴퓨팅 용량을 제공합니다.
자세한 내용은 여기


AWS 로그인하기

우선 aws에 가입을 하고 로그인을 합니다.(AWS)

그리고 오른쪽 상단의 지역 설정 메뉴에서 서울을 선택합니다.


새 유저 만들기

가입한 계정은 루트 계정이며 모든 권한을 다 가지고 있기 때문에 보안이 뚫릴 경우 공격자가 모든 권한을 가지는 문제가 생길 수 있습니다.
따라서 제한된 권한을 가지는 유저를 생성하여 그 유저로 서버를 운영하면 보안이 뚫리더라도 안전할 수 있습니다.

우선 메인 화면의 서비스 검색창에 IAM이라고 입력한 뒤 나타나는 창을 클릭하여 사용자 및 엑세스 키 관리 메뉴로 이동합니다.

사용자 및 엑세스 키 관리 화면에서 사용자 탭으로 이동하여 사용자 추가 버튼을 누릅니다.

사용자 이름을 입력하고, 엑세스 타입은 상황에 맞게 설정합니다.

  • Access type:
    • Programmatic access : 개발 환경에만 엑세스를 허용함
    • AWS management console access : AWS 콘솔에 엑세스를 허용함.

그리고 다음버튼을 눌러 permission 설정 창으로 넘어갑니다.
attach existing policies directly를 클릭하여 권한 목록을 불러옵니다.

검색창에 ec2full을 검색한 다음 AmazonEC2FullAccess 정책에 체크한 후, 다음을 눌러 넘어갑니다.

태그 추가는 선택 사항으로 필요에 따라 추가하시면 됩니다.

그리고 사용자 생성버튼을 누르면 다음과 같이 사용자를 생성한 것을 볼 수 있습니다.

유저 생성 완료 창에 뜨는 Access Key IDSecret aceess key는 창을 닫으면 다시는 볼 수 없으므로 csv파일을 다운받아 저장해두는 것을 추천드립니다.

Secret aceess key는 절대로 외부로 누출되어서는 안됩니다.!!


키 페어 생성하기

Amazon EC2는 공개키 암호화 방식을 사용하여 로그인 정보를 암호화 및 해독합니다.

공개키 암호화 방식은 공개키로 암호화한 데이터를 유저가 가진 개인키로 해독하는 방식입니다.

이 공개키와 개인키의 쌍을 키 페어라고 합니다.

왼쪽 상단에 서비스를 클릭하고 컴퓨팅 항목에 EC2를 클릭합니다.

메인 화면의 리소스 항목 아래의 키 페어를 클릭합니다.

그리고 키 페어 생성을 클릭하여 이름을 입력하면 pem 또는 ppk 형식의 파일이 다운로드 됩니다. (putty 사용할 경우 pem 다운로드)

(키 페어는 뒤에 EC2 인스턴스를 생성할 때 생성할 수 있습니다.)


EC2 인스턴스 생성하기

인스턴스는 AWS에서 제공하는 가상 컴퓨팅 환경을 뜻합니다.

EC2 관리 메인 화면에서 인스턴스 시작 버튼을 클릭합니다.

어떤 인스턴스를 실행할지 선택합니다.
프리티어는 새로 가입한 사용자들이 1년간 일정 할당량을 무료로 사용할 수 있는 유형입니다.
혹시 모르니 인스턴스 사용을 안할 경우에는 종료(삭제)하는 것을 추천드립니다.


AMI선택

AMI란 인스턴스를 시작하는 최초의 설정(운영체제, 애플리케이션 서버 등)을 의미합니다. 이를 이미지라고 합니다.
인스턴스 유형 선택에서도 프리티어인 t2 micro를 선택합니다.

그리고 단계 7에서 시작하기를 하면 키 페어를 설정하라는 창이 나옵니다.
저는 위에서 이미 키 페어를 생성했기 때문에 기존 키 페어를 선택하겠습니다.


밑에 체크박스까지 체크하고 인스턴스 시작을 하면 다음과 같이 인스턴스가 시작 중인것을 알 수 있습니다.


다시 첫 화면에서 EC2를 선택하여 들어와서 실행 중인 인스턴스를 클릭하면 실행중인 인스턴스를 볼 수 있습니다.

실행 중인 인스턴스 화면에서 '연결을 누르면 접속할 수 있는 방법을 볼 수 있습니다.

PuTTY를 사용하여 연결을 누르면 Windows의 경우 PuTTY를 사용하여 인스턴스에 연결하는 방법을 참고합니다.

그러면 아래와 같이 ec2 서버에 연결한 것을 볼 수 있습니다.


Django 서비스 AWS EC2로 올리기

커맨드 창에 다음과 같은 명령을 수행한다.

sudo apt-get update
[설치할 수 있는 패키지의 정보를 불러오는 것]
sudo apt-get upgrade

sudo apt-get install git
[깃 설치]

sudo apt-get install python3-pip
python3 모듈을 관리하는 python3버전의 pip 설치

sudo pip3 install django
pip3 install --upgrade django
[django 설치하고 upgrade]

git clone [깃헙 레포 링크]

받아온 django 프로젝트에서 settings.py에서 ALLOWED_HOSTS에 퍼블릭 IP주소를 추가해줍니다.

그리고 EC2는 보안상, 외부에서 접속하는 port를 제한하고 있는데, 이런 port들을 외부에서 접속하기 위해서는 수동으로 열어줘야합니다.
이를 인바운드 정책으로 관리합니다.

인바운드 정책을 변경하기 위해 AWS의 EC2->보안 그룹->인바운드 규칙->인바운드 규칙 편집을 클릭합니다.

그리고 아래와 같이 유형은 TCP로 선택하고, Django 기본 포트인 8000을 추가하고, 소스는 위치 무관을 선택합니다.

이제 외부에서 Django 서버에 접속할 수 있는 준비는 끝났습니다.

서버를 실행해 보겠습니다.

python3 manage.py runserver 0:8000

그리고 [IP주소]:8000 에 접속하면 아래와 같이 서버가 잘 동작하는 것을 볼 수 있습니다.

profile
Better late than never

3개의 댓글

comment-user-thumbnail
2020년 12월 22일

안녕하세요. 좋은 글 감사합니다. 질문이 하나 있어서 댓글을 남겼습니다. 제가 AWS EC2에서 django가 동작은 제대로 되는데, request를 처리하고나서 다음과 같은 에러가 계속 발생합니다. 로컬 장비에서 테스트할 때는 발생을 하지 않는데... 해결책이 뭔지 조언을 해주시면 감사하겠습니다.

[22/Dec/2020 13:51:31] "GET / HTTP/1.1" 200 23

Exception occurred during processing of request from ('39.122.103.122', 63560)
Traceback (most recent call last):
File "/home/ubuntu/miniconda3/envs/django/lib/python3.9/socketserver.py", line 650, in process_request_thread
self.finish_request(request, client_address)
File "/home/ubuntu/miniconda3/envs/django/lib/python3.9/socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/ubuntu/miniconda3/envs/django/lib/python3.9/socketserver.py", line 720, in init
self.handle()
File "/home/ubuntu/miniconda3/envs/django/lib/python3.9/site-packages/django/core/servers/basehttp.py", line 174, in handle
self.handle_one_request()
File "/home/ubuntu/miniconda3/envs/django/lib/python3.9/site-packages/django/core/servers/basehttp.py", line 182, in handle_one_request
self.raw_requestline = self.rfile.readline(65537)
File "/home/ubuntu/miniconda3/envs/django/lib/python3.9/socket.py", line 704, in readinto
return self._sock.recv_into(b)

ConnectionResetError: [Errno 104] Connection reset by peer

1개의 답글
comment-user-thumbnail
2022년 4월 6일

좋은 글 고맙습니다. 처음 배포해보는 사람도 따라갈 수 있게 잘 정리해놓으신것같아요!

답글 달기