[Re:Django] 6. AWS에서 서버를 생성하여 django 배포하기

Magit·2020년 5월 5일
1

Django

목록 보기
6/13

AWS의 EC2 구성 및 터미널에서 EC2 접속하기

EC2 란??

Elastic Compute Cloud 서비스로 다양한 OS버젼의 가상서버를 제공하는 아마존의 웹서비스이다. aws에서 콘솔에 로그인을 할 수 있다.

  • 내 결제 대시보드에서 결제관련 값을 확인가능
  • 글로벌 인프라 에서 AWS 글로벌 인프라 맵을 확인해보면 리전은 2개 이상의 가용영역으로 구성되있는데, 지도에서 보면 서울 리전은 3개의 가용영역이 있다.
  • 리전별 데이터 전송 요금 확인 에서 데이터 전송 쪽을 확인해보자. 리전별로 데이터전송에 따라 비용이 다르거나 응답속도에 차이가 있다. 오하이오와 서울을 비교했을 때, 오하이오가 더 싼 걸 확인할 수 있다.(20.04.29 기준)

AWS EC2 구성하기

서비스 탭에서 ec2를 검색해서 해당 페이지로 이동해보자.

  1. 인스턴스 시작 이라는 버튼을 클릭하면 첫 번째 단계로 이동한다.
  • ec2에서 사용할 OS 머신을 선택하는 과정이다.
  • 프리티어에서 사용 가능한 Ubuntu Server 18.04 LTS (HVM), SSD Volume Type 을 찾아서 64비트를 선택하자.
  1. 그 다음은 CPU, 메모리 등 서버의 규모를 선택하는 과정인데, 프리티어에서 사용가능한 t2.micro를 선택하자. 다른 사이즈를 선택하면 과금이 많이 될 수 있으니 조심하자.

  2. 세번째는 인스턴스 세부 정보 구성이다. 인스턴스 세부 정보 구성에서 서브넷은 아이피 주소 사용하는 것으로 선택해주고, 퍼블릭 IP 자동 할당은 활성화하면 동적으로 공인아이피 주소가 부여된다. EC2 인스턴스가 다시 시작할 때마다 자동으로 변경된다. 고정아이피를 사용하고 싶다면 엘라스틱 아이피 설정을 고정된 공인 아이피를 설정할 수 있다. 종료 방식에는 중지종료가 있는데, 중지는 EC2 인스턴스 셧다운시 OS가 정지되서 재시작하면 같은 상태로 재시작한다. 종료는 OS를 정지하는 것과 동시에 EC2 인스턴스가 삭제된다. 실수로 인스턴스가 삭제되는걸 방지하기 위해 종료 방지 기능 활성화가 있는데, 체크해주자. 추가 요금이 발생합니다. 라고 써있는건 최대한 설정하지 말도록 하자.

Virtual Private Cloud(VPC)
AWS 계정 전용 가상 네트워크이다. 가상 프라이빗 클라우드와 서브넷으로 구성된 가상 네트워크인데, VPC 환경을 사용하면 IP주소를 기반으로 한 논리적인 네트워크 공간을 구성하거나 방화벽같은 접근제어정책을 설정할 수 있다.

  1. 네번째는 스토리지 추가인데 여기서 EBS라는 것은 Elastic Black Store 로 EC2의 마운트에서 사용하는 스토리지 타입이다. 스토리지는 용량을 기본 8GB보다 높이게되면 요금이 부과되므로 기본으로 그대로 가자.

  2. 다섯번째는 태그추가인데, 키와 값 형태로 태그를 정의할 수 있다. EC2 리소스를 태그로 지정해서 비용을 관리하거나, IAM 정책 권한을 제어할 수 있으므로 용도에 따라 여러 태그를 지정할 수 있다. 우리는 그냥 키에 계정이름, 값에 프로젝트 이름을 써놓아주자.

  3. 여섯번째는 보안 그룹 구성 설정페이지이다. EC2에서는 HTTP와 HTTPS 접속을 허용해야하는데, 그러기위해서 규칙을 추가해줘야한다. 기본적으로는 모든 아이피주소로부터 SSH 접속을 허용하도록 되있다. 예를 들어 EC2에서 port 8000으로 웹서버를 돌리고 API 호출이 되게 하려면 포트 범위 8000으로 어떤 아이피에서든 접속이 가능하게 규칙을 설정해야한다. 규칙 추가 를 선택하고 포트 범위를 8000으로 하고 소스를 위치 무관 으로 하면 된다.

이제 검토 및 시작 에서 지금까지 설정한 것을 확인하고 시작하기를 누르면 된다.
기존 키 페어 선택 또는 새 키 페어 생성 이란 창이 나오는데, 새로 만들때는 새 키 페어를 생성해야한다. 이름을 적어주고 키 페어 다운로드를 받으면 되는데, 다운로드는 한 번만 가능하므로 잘 관리해야한다.

다음으로 인스턴스를 시작하고 인스턴스 보기를 누르면 돌아가고 있는 인스턴스를 확인할 수 있는데, 처음에는 pending 상태이지만 시간이 지나면 running으로 바뀐다.

터미널에서 aws 접속하기

다운받은 .pem 파일을 권한을 바꿔줘야 SSH 접속을 할 수 있다. 터미널에서 .pem 파일이 있는 디렉토리로 이동한 다음에 chmod 400 이름.pem 명령어로 파일의 모드를 바꿔주면 SSH 접속을 할 수 있게 된다. ssh 접속을 하려면

ssh -i 이름.pem ubuntu@공인아이피

를 적어줘야한다.
공인아이피는 running 상태인 인스턴스를 선택한 후 오른쪽 밑에 있는 IPv4 퍼블릭 IP의 아이피를 복사 붙여넣기하면 된다. 이후에 질문에서 yes 를 입력하면 된다. 그러면 EC2 서버에 접속할 수 있게된다.



AWS RDS 설치하기

RDS 는 아마존에서 관계형 데이터베이스를 제공하는 서비스이다. AWS Management Console에서 데이터베이스 항목 제일 첫 번째에 있다. 진입하면 RDS Console 화면에 진입하게 된다.

  1. 처음에는 DB 인스턴스가 0개로 되있을 것이다. 데이터베이스 생성은 화면에 보이는 데이터 베이스 생성 버튼을 눌러도 되고, 데이터베이스 항목에서 생성을 눌러도 된다.

  2. 데이터베이스를 생성하기전에 먼저 파라미터 그룹을 설정해야한다. 파라미터 그룹은 설정값 혹은 어떤 value를 담고 있는 집합을 설정하는 곳이다. 파라미터 그룹 패밀리 에는 AWS에서 제공하는 데이터베이스 종류에 따라 파라미터 그룹에 따른 기준이 되는 데이터베이스 정보를 고를 수 있다. 데이터베이스 정보란 다양한 버젼의 데이터베이스를 말하는 것이다. 우리는 mysql 5.7을 선택하도록 하자. 그룹 이름은 아무 이름이나 설정하면 된다. 나는 paulba3-config 으로 생성하겠다.(이름 규칙이 있으니 확인!) 생성 이후에 이름을 클릭해서 파라미터를 수정을 해야한다. AWS 설정되는 데이터베이스에 설정값을 전달하는 행동이기에, 이 설정값을 통해서 RDS에 데이터베이스를 생성하면 그 데이터베이스가 참조할 설정값으로 지금 만든 config를 설정하면 된다. (문자열을 표기하는 방식을 설정한다던가 등등)

  • character_set 을 검색해서 전부 utf8mb4 로 설정해주자. utf8mb4 는 이모티콘까지 저장 가능하게 mysql에서 개량해서 나온 것이다.
  • colla 까지 검색하면 나오는 collacation_connection은 utf8mb4_general_ci 로, collation_server는 utf8mb4_unicode_ci로 선택하고 저장하자.

이렇게 저장하면 데이터베이스에 데이터를 저장할 때 깨지는 경우는 없을 것이다.

  1. 이제는 진짜로 데이터베이스를 생성해야한다. 앞 페이지로 가서 데이터베이스 생성 버튼을 누르자. 표준생성-Mysql 을 선택하자. 그외에는 템플릿을 프리티어로 선택하자. DB인스턴스 식별자는 이제 생성하려는 데이터베이스에 꼬리표를 다는것이다. 위에서 프로젝트명으로 했으니 여기도 paulba3로 하자.(2차 프로젝트때 또 생성해야되냐하면 그건 아니다! 생성했던 DB 안에다가 데이터베이스를 생성하기만 하면 된다. 과금 조심!) 마스터 사용자 이름은 root 로 하고 비밀번호를 작성해주자.(허술하게 작성하면 해킹당하니니 조심!) DB인스턴스 크기는 우리에게 선택권이 없다(프리티어라서). 스토리지도 마찬가지이다. 대신 스토리지 자동조정 활성화체크해제해주자. 연결 부분도 가만히 두고 추가 연결 구성에서 추가연결구성은 기본으로 잡힌것으로 냅두자. 퍼블릭 액세스 가능은 데이터베이스를 외부에서 접속 가능하게 해야하므로 로 선택해야한다. VPC 보안 그룹은 우리는 새로 생성을 해야한다. 이름은 프로젝트이름_rules 같은식으로 적어도 된다. 가용 영역은 EC2 만들 때 a를 선택했다면 a로 선택하자. 데이터베이스 포트는 3306이 mysql의 기본 디폴트 통신 포트이다. 데이터베이스 인증은 그냥 암호 인증으로 일단 선택하자. 추가 구성에 이름을 안적으면 나중에 생성하면 되고 아니면 지금 이름을 적어서 만들수도 있다. 지금 그룹프로젝트의 데이터베이스의 이름을 그대로 똑같이 적어줘도 된다. db 파라미터 그룹에서 아까 정한 config를 설정해주고, 자동백업 활성화도 일단은 꺼준다. 삭제방지활성화를 선택해주자. 이제 데이터베이스를 생성하면 된다. 생성할 때 시간이 조금 걸리니 기다려주자.
  1. 생성된 데이터베이스를 클릭하고 들어가면 엔드포인트 주소를 확인할 수 있다. ec2는 인증키를 받아서 그걸로 접속하지만 mysql은 퍼블릭 액세스 가능성을 예 로 설정했고, 테스트 데이터베이스 주소를 치고 사용자 계정이랑 비밀번호를 잘 치면 접속이 잘 될것이다.

  2. 여기서 보안 그룹 설정을 해야하는데, 위에 VPC 보안 그룹이 아니라 보안 그룹 규칙 에서 inbound, outbound 쪽에서 설정해야한다. inbound는 나한테 통신이 들어오는 것, outbound는 내가 내보내는걸 말한다. inbound 규칙을 보면 나와있는 아이피는 지금 접속한 인터넷의 주소로만 접근이 가능하게 되있다. 가급적이면 집이면 집, 위워크면 위워크 아이피만 허용되게 하는게 안전하다. 그게 귀찮으면 이 설정을 풀어야한다. inbound 쪽을 클릭해보면 새로운 창이 열린다. 여기서 밑에 세부정보에서 인바운드 규칙 카테고리를 눌러보자. 그럼 그곳에 특정 아이피만 접속할 수 있다고 설정되있다. 인바운드 규칙 편입을 눌러서 소스를 위치 무관을 눌러주자. 규칙 저장을 눌러주면, 이제 전세계 어디서든 계정정보랑 비밀번호만 알면 접속할 수 있게된다. 권장하지 않지만, 작업이 끝나고 다시 수정해주자! ec2에서 접속할 떄 문제가 없는데 나중에 ec2가 RDS에 연결될때는 ec2 서버에 아이피 주소도 연결해줘야한다. 그래야 ec2 서버도 mysql에 접속할 수 있다.

  3. 이제 아까 RDS의 엔드포인트를 복사해서 터미널로 갖고가보자. mysql을 쳤는데 cannot~ 에러가 나오면 mysql이 아예 설치가 안된것이다.

mysql -h 엔드포인트주소 -u root -p
-h 호스트는 엔드포인트주소
-u 유저는 root
-p 패스워드

를 치고서 비밀번호를 치면 이제 aws의 mysql이 실행된다.

로컬에 있는 데이터베이스 aws에 옮기기

내 로컬에 있는 데이터베이스를 뽑는 방법은 mysqldump 라는게 있다.

mysqldump -u root -p 데이터베이스명 > 데이터베이스명.sql
# 해당 데이터베이스의 데이터를 .sql 파일로 뽑아온다.

dump 로 옮기려는 곳에 데이터베이스는 만들어져있어야한다. 다시 aws의 mysql로 이동하자

mysql -h 엔드포인트주소 -u root -p

create database project_garam character set utf8mb4 collate utf8mb4_general_ci;
# 데이터베이스 만들어주기

이제 아까 만든 .sql 파일을 aws의 데이터베이스에 넣어줘야한다.

mysql -h 엔드포인트주소 -u root -p 데이터베이스명 < sql이름.sql
  • 에러를 조심하자
    데이터가 다 들어갔다면 다시 aws의 mysql에 접속하자. 이제 데이터가 잘 들어갔는지 확인하기 해야한다.
mysql> show databases;
#데이터베이스들을 보여준다.

mysql> use 데이터베이스명;
#해당 데이터베이스를 이제 사용하겠다는 의미

mysql> show tables;
#특정 데이터베이스에서 테이블들을 보여준다.

mysql> select * from 테이블명
#해당 테이블에 있는 데이터를 모두 불러온다

미리미리 데이터베이스를 dump 떠놓자!



EC2 인스턴스에 프로젝트 배포 준비하기

개인 피씨에서 개발하는 것과 마찬가지로 EC2 서버에 비슷한 개발환경을 설치하는 과정이다. 먼저 ssh로 EC2 서버에 접속하자. .pem 파일이 있는 폴더에서 실행시켜야 한다.

ssh -i 파일이름.pem ubuntu@아이피

전체 과정은 미니콘다 설치, 패키지 업그레이드, 최소한의 패키지 설치하기이다.


먼저 미니콘다를 설치해보자. 미니콘다 홈페이지에서 Linux installer에서 64비트인 녀석을 copy link한 다음에 터미널에서 아래 명령어를 입력한다.

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

이제 다운받은 파일에 실행권한을 주고서 실행해보자

chmod +x Miniconda3-latest-Linux-x86_64.sh
# 미니콘다에 실행권한 부여

./Miniconda3-latest-Linux-x86_64.sh
# 미니콘다 설치파일 실행하기

# 그다음 나오는 곳에서 yes로 넘어가기

설치후에 배쉬셀 스크립트를 실행해서 로컬환경과 마찬가지로 설정하자.

source .bashrc

그리고 apt 명령어로 패키지 업데이트 및 업그레이드를 실행시키자.

sudo apt-get update
sudo apt-get upgrade

다음으로 MySQL을 설치해야되는데, gcc 를 먼저 설치하고 MySQL 클라이언트를 설치해야 에러가 안난다.

sudo apt-get install gcc

이제 MySQL 클라이언트를 설치하자

sudo apt-get install libmysqlclient-dev

이제 콘다로 가장환경을 만들어주자

conda create -n project python=3.7

그리고 activate 한 다음에 git repository를 클론해오고서 해당 디렉토리로 이동해서 requirements.txt 를 확인해보자. 이게 우리가 필요한 패키지들이다. pip 명령어로 받아오자.

pip install -r requirments.txt

이제 해야할일은 내 프로젝트에 my_setting.py를 만들고 settings.py에 ec2의 서버의 퍼블릭 아이피를 설정해주고 서버를 돌려야한다.

먼저 settings.py의 ALLOWED_HOSTS 를 설정해줘야한다.

ALLOWED_HOSTS = [
	'*', '퍼블릭아이피', '퍼블릭아이피:8000'
]

이제 my_settings.py를 manage.py가 있는 루트 디렉토리에서 생성해서 설정해줘야한다. 로컬서버에 있는 파일에서 조금 변형해서 하면 된다.

#my_settings.py
SECRET = {
        'secret' : '' # 숨기기!
}

ALGORITHM = 'HS256'

DATABASES = {
	'default' : {
		'ENGINE': 'django.db.backends.mysql',
		'NAME': 'project_garam', #aws mysql에 올렸던 데이터베이스의 이름
		'USER': 'root', 
		'PASSWORD': '',	#비밀번호!
		'HOST': '', #RDS의 엔드포인트 주소를 입력
		'PORT': '3306',
		'OPTIONS': {'charset': 'utf8mb4'},
		'TEST': {
			'CHARSET': 'utf8mb4',
			'COLLATION': 'utf8_general_ci'
		}
	}
}
  • 여기서 중요한 점은 HOST는 RDS MySQL의 호스트 주소이고, 비밀번호는 MySQL의 서버 접속 암호, NAME은 데이터베이스 이름이다.
  • RDS 호스트 확인방법은 RDS로 가서 DB 인스턴스에서 엔드포인트를 확인해보면 된다.

이제 settings 들의 확인이 끝나면 python manage.py runserver 0:8000 으로 퍼블릭 아이피로 쓰게 만들자
서버가 돌아가면 POSTMAN으로 한 번 확인해보자.

여기까지 해도 엔드포인트는 호출하지만, 장고에서 manage runserver 명령은 단일스레드로 동작하여 개발 및 테스트 환경에서는 적절하지만 리퀘스트가 많을 수 있는 운영환경에서는 적절하지 않다. 그러므로 멀티스레드를 지원하는 웹애플리케이션 서버 프로그램인 gunicorn을 설치하여 배포를 해보자.



gunicorn 으로 프로젝트 배포하기

gunicorn은 WAS(웹 애플리케이션 서버)가 있고 이곳에 우리가 만든 장고 웹 애플리케이션을 올려주는 방식으로 프로젝트를 배포할 수 있다.

설치하기 위해서 pip install gunicorn 명령어로 gunicorn을 설치하자.
ssh 세션이 끊어져도 서버를 동작시키기 위해서 nohup이라는 툴을 써서 gunicorn을 백그라운드로 동작시키게 할 것이다.

입력 커맨드 아래와 같다.

gunicorn --bind=0.0.0.0:8000 paulbassett.wsgi
# 백그라운드로 안돌리고 그냥 돌리는 명령어

nohup gunicorn --bind=0.0.0.0:8000 paulbassett.wsgi &
# wsgi는 장고의 웹 애플리케이션을 지정해주는 파일이다.
# & 는 백그라운드로 동작시키는 명령어이다.

아래 명령어로 실행을 시키고 제대로 실행이 됬는지 확인하는 방법은 ps 명령어를 쓰면 된다.

ps -ef | grep python
# gunicorn이 잘 실행된건지 확인하자!

root       761     1  0 Apr30 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root       786     1  0 Apr30 ?        00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
ubuntu    4838  4778  0 08:25 pts/0    00:00:00 /home/ubuntu/miniconda3/envs/project/bin/python /home/ubuntu/miniconda3/envs/project/bin/gunicorn --bind=0.0.0.0:8000 paulbassett.wsgi
ubuntu    4841  4838  0 08:25 pts/0    00:00:00 /home/ubuntu/miniconda3/envs/project/bin/python /home/ubuntu/miniconda3/envs/project/bin/gunicorn --bind=0.0.0.0:8000 paulbassett.wsgi
ubuntu    4843  4778  0 08:27 pts/0    00:00:00 grep --color=auto python

POSTMAN에서 제대로 돌아가는지 확인도 한 번 해주자.
주의할 점은 서버를 동작시킬 필요가 없을 때는 종료시켜줘야한다.

kill pid번호

위 명령어로 gunicorn을 종료시킬 수 있다. 확인차 ps -ef | grep python 명령어를 입력하면 종료된 걸 확인할 수 있다.

이번 pid번호는 위에 4838 이었다.

profile
이제 막 배우기 시작한 개발자입니다.

0개의 댓글