AWS는 Amazon Web Service의 줄임말로서 서버 등의 인프라스트럭쳐를 필요한대로 on demand로 사용할 수 있는 서비스이다. 사용자가 직접 서버를 구입하고 설치할 필요 없이 AWS상에서 클릭 몇번으로 서버를 구축하고 사용할 수 있다.
EC2 (Elastic Compute Cloud)
Secuirty Group
RDS (Relational Database Service)
Route 53
AWS S3
아마존 EC2 사이트에 접속해 아래와 같이 진행해서 인스턴스를 생성한다.
- 신규 인스턴스 생성
- [Step1] Choose Image : Ubuntu Server 19.04 LTS로 선택
- [Step2] Choose Instance type : Freetier
- [Step3] Auto-assign Public IP 허용
- Pem 키 파일 설정 및 다운로드 : 안전하게 보관하자! 접속 시 반드시 필요하다!
- 인스턴스 생성 후 Public DNS와 Public IP 주소를 확인
- 이후 이 Public IP 주소로 접속하면 된다!
터미널에서 아래 명령어를 통해 접속이 가능하다. 참고로 EC2 키페어는 잘 보관해 두었다가 해당 키페어가 있는 폴더 내에서 아래 명령어를 입력하여야 한다.
❯ chmod -R 400 key_pair파일명.pem # 키 권한 설정
❯ ll key_pair파일명.pem # 키 제대로 세팅되었는지 확인
-r--------@ 1 사용자명 staff 1.7K 6 4 15:45 key_pair파일명.pem
❯ ssh -i key_pair파일명.pem ubuntu@아마존의 내 서버 public ip주소
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-1065-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Thu Jun 4 06:56:20 UTC 2020
System load: 0.0 Processes: 86
Usage of /: 13.7% of 7.69GB Users logged in: 0
Memory usage: 15% IP address for eth0: 172.31.1.11
Swap usage: 0%
0 packages can be updated.
0 updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@ip-xxx-xx-x-xx:~$
SSH 는 Secure Shell의 약자입니다. SSH는 서버에 접속하기 위한 방법 중 하나 입니다. 서버에 접속하는 일반적인 방법은 아이디와 비밀번호를 사용하는 것입니다. 아이디와 비밀번호를 사용한 서버 접속의 장점은 어디서든 서버에 접속할 수 있다는 것입니다. 단점은 네트워크 아이디/비번이 만일 노출되면 본인 외에 다른 사람도 서버에 접속 가능하다는 것입니다.
SSH는 대칭키를 사용하여 접속하는 방법입니다. 암호화된 키를 사용한다는 점에서 우리나라의 악명높은 공인인증서와 비슷합니다. SSH의 장점은 대칭키가 생성된 device에서만 서버에 접속이 가능함으로 아이디/비번 보다 훨씬 안전합니다 (device를 훔치기는 쉽지 않음으로). 단점은 device 단위로 접속이 됨으로 편리함/이동성이 떨어집니다. 그럼으로 일반적인 웹서비스에서는 아이디/비번으로 접속 가능하게 합니다 (어디서든 접속이 가능해야 함으로).
아마존 RDB 서비스를 선택해 아래 절차를 진행해서 RDB를 생성한다.
- Parameter groups 생성
- Create parameter group에서 mysql5.7로 선택해서 진행
- Parameter groups 수정
- 한글을 사용할 수 있또록 utf-8 인코딩 설정을 해 줘야 함.
- character_set으로 검색되는 요소들 : utf8mb4로 변경 (이모니콘도 사용가능함)
- collation_connection : utf8mb4_general_ci로 변경
- collation_server : utf8mb4_unicode_ci로 변경
- MySQL 데이터베이스 새로 생성
- Engine 선택 : MySQL
- Only enable iptions eligible for RDS Free Usage Tier" option을 체크
- 세부사항 설정
- username, 비밀번호, 데이터베이스 이름 설정
- Public accessibility : Yes (외부 IP에서 데이터베이스 접속 가능)
- 데이터베이스 생성 후 엔드포인트를 확인. 이 주소로 데이터베이스에 접속할 수 있음
- Security groups 설정
- 어디서나 접속할 수 있도록 설정 변경
- 만약, 특정 IP에서만 접속하고 싶다면 그대로 두면 됨
RDB가 생성되었다면 아마존 RDB엔 엔드포인트로 된 url주소를 아래와 같이 입력해서 명령어를 내리면 RDB에 접속하게 된다.
> mysql -h (RDB 엔드포인트) -u root -p
# h는 host를 의미함
먼저, 아래 명령어로 로컬 데이터베이스에 있는 데이터를 dump해서 백업파일을 생성한다.
> mysqldump -u root -p (데이터베이스명) > (저장할 파일명).sql
그 다음 아마존 RDB mysql에 접속한 뒤 데이터를 저장할 데이터베이스를 생성한 뒤 다시 터미널로 돌아와서 데이터를 밀어넣으면 된다. 그리고 다시 mysql로 돌아가서 데이터베이스에 데이터가 잘 저장되어 있는지 확인하면 된다.
> create database freeporkbelly CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
> mysql -h (RDB 엔드포인트) -u root -p (데이터베이스명) < (불러올 파일명).sql
마지막으로 이후에 데이터가 RDB에 쌓이기 위해서는 프로젝트의 my_settings.py
에서 데이터베이스의 설정을 아마존 RDB에 맞춰서 변경해 주면 된다.
> ssh -i joeylee_key.pem ubuntu@3.34.131.83 # EC2 접속
> wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # Miniconda linux용 다운로드
> chmod +x Miniconda3-latest-Linux-x86_64.sh # 실행 권한 부여
> ./Miniconda3-latest-Linux-x86_64.sh # Miniconda 설치 (yes -> yes하면 설치완료)
> source .bashrc # 환경 설정
(base) ubuntu@ip-xxx-xx-x-xx:~$로 바뀜
> sudo apt-get update # 업데이트 및 업그레이드
> sudo apt-get upgrade
> sudo apt-get install gcc # gcc 설치
> sudo apt-get install libmysqlclient-dev #MySQL client 설치
아마존 EC2에 가상환경을 만든 뒤, 가상환경에서 설치했던 패키지들을 설치한다.
(참고로, conda는 requirements.txt에 있으면 안됨)
> conda create -n (가상환경명) python=3.7
> conda activate (가상환경명)
> git clone (github master)
> cd 해당 프로젝트폴더
> cat requirements
> pip install -r requirements.txt #requirements에 있는 파일들 설치
> pip freeze
그 후 아래와 같이 환경 설정을 변경하고, 데이터베이스를 서버에 연결한다.
> vi freeporkbelly_main/settings.py
=> Allowed_hosts = ['3.33.33.033', '3.33.33.333:8000'] # 추가
=> TIME_ZONE = 'Asia/Seoul' # 타임존 변경
> vi my_settings.py 생성 후 작성
=> host 정보를 아마존 RDS 엔드포인트로 변경
이렇게 한 뒤 python manage.py runserver 0:8000
해도 API가 잘 작동한다. 하지만 장고에서 지원하는 manage.py runserver는 개발/테스트용으로는 편하지만 리퀘스트가 많은 운영환경에서는 적합하지 않다. 따라서 멀티스레드를 지원하는 웹애플리케이션 서버 프로그램인 gunicorn을 설치하여 배포하도록 한다.
[gunicorn 개념 및 명령어]
그냥 할수도 있지만 SSH 세션이 끊어져도 서버를 동작시켜주기 위해 nohup이라는 걸 여기에서는 쓰도록 한다.
> pip install gunicorn
> nohup gunicorn --bind=0.0.0.0:8000 freeporkbelly.wsgi & # (꺼지지 않는) 서버 실행
> ps -ef | grep python # 서버 잘 껴졌는지 확인
> kill 03000 # pid가 03000일 때, 서버 구동 중단
위와 같이 하면 서버가 꺼지지 않고 계속 작동하게 된다. 만약 서버 구동을 중단하려면 kill (pid)를 하면 된다.
[pid 확인하는 법]