AWS, EC2 인스턴스 설정, ubuntu설정, runserver

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


AWS

amazon aws

cf, 데이터 센터

rack단위마다 하나의 컴퓨터가 들어가는데, 웹 서버만을 다뤄주기 때문에 하드디스크 용량이 엄청나다. 이 컴퓨터를 꺼지지 않고 사용하다보면 발열이 엄청난데, 이를 식혀주고 전원이 들어오고 인터넷이 끊기지 않는 곳을 데이터센터라고 한다.

즉, 물리적으로 서버를 할당한다.

그런데 이 과정이 너무 귀찮으니까, 데이터 센터를 만들어 가상으로 컴퓨터 자원을 분리해서 나눠준다. 이를 가상서버 호스팅이라고 하는데, 이 가상서버 호스팅은 버튼 몇번 누르면 생성해주는데, 아마존도 자체적인 데이터 서버를 구축한것

아마존은 남아돌게 되는 서버 자원을 이제 파는데, 이게 돈이 된다. - 안정성을 엄청 높여서!

EC2

지금까지 로컬에서는 django에서 어플리케이션을 만들면 browser에서 localhost(127.0.0.1)로 요청을 보내고,
우리 컴퓨터로 돌아와 runserver가 그 요청을 받아 django에서 처리해줬다.

Browser -> localhost(127.0.0.1)
      -> runserver -> Django

그런데 이제는 localhost가 아닌 실제 AWS로 요청이 간다.
요청이 갔을때 runserver가 요청을 받아 Django가 실행해줄 것이고, 그러면 이제는 소스코드가 우리 컴퓨터가 아닌 AWS, 서버상에 올라가져있게 되는 것을 의미한다. 그러기 위한 방법은 클라우드 서비스를 쓸 때 그 클라우드 서비스가 지원하는 자원을 할당받아 사용한다. (여기서는 EC2를 사용해볼 것이다.)

Browser -> AWS -> runserver -> Django
          (EC2)

Amazon AWS 문서

EC2는 클라우드에서 안전하고 크기 조정이 가능한 컴퓨팅 파워를 제공하는 웹서비스이다. 크기조정이 가능하다는 것은 초기에 간단한 연산만 가능한 저렴한 컴퓨터를 받았다고 하더라도, 그 컴퓨터에 있는 내용을 다른 하드디스크에 옮기고 하는 과정을 거치지 않아도 CPU, 램등의 컴퓨팅 파워를 조절할 있다.


인스턴스: 가상 컴퓨터 하나

  • 로그인 > aws management console > EC2 검색 > 실행중인 인스턴스
  • 인스턴스 시작 > (단계1) Ubuntu Server 16.04 LTS (HVM), SSD Volume Type 선택 >
  • (단계2) General purpose t2.micro >
  • (단계6) 보안그룹이름: EC2 Security Group, 설명: EC2 Security Group >
  • 기존 키 페어 선택 또는 새 키 페어 생성 > 새 키 페어 생성 > 키 페어 다운로드 > 파일 이동
    • mv ~/Downloads/<키페어이름>.pem ~/.ssh
  • 시작

Ubuntu Setting

AWS 서버가 있을때, Client쪽에서 AWS에게 접속을 시도할 때 이 AWS가 먼저 SecurityGroup을 거친다. 그 다음에 AWS안의 Service에 연결을 시켜주는데, 지금 이 보안그룹을 만들때 설정을 해줬는데 이를 해주지 않으면 접속이 안된다.

해당 인스턴스의 설명을 보면 보안그룹이라고 있고, 그 안에 EC2 Security Group이 있고, 인바운드 규칙을 보면 포트 22인 것을 확인할 수 있다. 우리가 기본적으로 ssh로 연결하는 포트는 22가 되어있도록 기본값이 설정되어있다.

소스 0.0.0.0/0은 전세계 어느 접근이 와도 다 받겠다는 의미

그런데 만약 우리가 EC2 Security Group 설정을 하지 않으면 default SecurityGroup 설정이 되어있는데, 이는 모든 접근을 다 막아버린다.

ssh, 컴퓨터에 접속할 때 쓰는 프로토콜, 프로그램 프로토콜, 웹에서 데이터를 주고받기 위한 통신규약

~/.ssh에서

chmod 400 ~/.ssh/<키페어이름>.pem
ssh -i ~/.ssh/<키페어이름>.pem <ip주소>.ap-northeast-2.compute.amazonaws.com

# 우분투 진입 성공!
ubuntu@<ip주소>:~$ ls -al

# update, upgrade
ubuntu@<ip주소>:~$ sudo apt-get update
ubuntu@<ip주소>:~$ sudo apt-get dist-upgrade

# zsh설치
ubuntu@<ip주소>:~$ sudo apt-get install zsh

# oh-my-zsh 설치
ubuntu@<ip주소>:~$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

# root유저로 전환
ubuntu@<ip주소>:~$ sudo su

# ubuntu유저의 shell을 변경 (작은따옴표아님 유의!)
root@<ip주소>:/home/ubuntu# chsh ubuntu -s `which zsh`

# ~/.zshrc의 첫 번째 줄 주석 해제 (아래 부분)
export PATH=$HOME/bin:/usr/local/bin:$PATH

# exit후 다시 ssh접속
root@<ip주소>:/home/ubuntu# exit
exit
ubuntu@<ip주소>:~$ exit
logout
Connection to <ip주소>.ap-northeast-2.compute.amazonaws.com closed.

ssh -i ~/.ssh/<키페어이름>.pem <ip주소>.ap-northeast-2.compute.amazonaws.com

# Locale설정 (tab 누르고 OK에서 엔터)
sudo vi /etc/default/locale
vi ~/.zshrc
exit
Connection to <ip주소>.ap-northeast-2.compute.amazonaws.com closed.

ssh -i ~/.ssh/<키페어이름>.pem <ip주소>.ap-northeast-2.compute.amazonaws.com

# pip설치 및 version다운
sudo apt-get install python-pip
sudo python -m pip install -U pip

# pipenv설치
sudo -H pip install -U pipenv

# pyenv설치
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

# vi ~/.zshrc에서 맨 아래에 추가
export PATH="/home/ubuntu/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# pyenv를 위한 requirements설치
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev

# exit후 다시 ssh접속
exit
Connection to <ip주소>.ap-northeast-2.compute.amazonaws.com closed.

ssh -i ~/.ssh/<키페어이름>.pem <ip주소>.ap-northeast-2.compute.amazonaws.com

# pyenv로 필요한 파이썬 버전 설치
pyenv install 3.6.5
pipenv install

[리눅스 chmod 규약 참고]

이제 파일을 전송해보자

  • 우선 로컬에 프로젝트를 만든다. ~/project/deploy/ec2-deploy
  • git init, gitignore
  • pipenv shell / django-admin.py startproject config
  • mv config app

scp, ssh(컴퓨터간 연결을 만드는데, 암호화한 상태로 연결)를 기반으로 해서 연결된 데이터들을 파일전송할 때에도 사용할 수 있는데, 이를 편리하게 만든게 scp

scp -i ~/.ssh/<키페어이름>.pem \
-r ~/project/deploy/ec2-deploy \
<ip주소>.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/project

이거를 확인하는 방법은 ssh로 다시 서버로 들어가본다.

ssh -i ~/.ssh/<키페어이름>.pem <ip주소>.ap-northeast-2.compute.amazonaws.com
pwd
cd project
pwd
/home/ubuntu/project

해당 위치에서 git 넘어온거 확인한다.

cd app
./manage.py runserver 0:8000

인터넷 접속이 안된다면

보안그룹 설정 > 사용자 지정 TCP > 포트범위 8000 > 설명 Django runserver

settings.py

ALLOWED_HOSTS = [
  'localhost',
  '127.0.0.1',
  '.amazonaws.com',
]
ssh -i ~/.ssh/<키페어이름>.pem <ip주소>.ap-northeast-2.compute.amazonaws.com rm -rf /home/ubuntu/project

scp -i ~/.ssh/<키페어이름>.pem \
-r ~/project/deploy/ec2-deploy \
ubuntu@<ip주소>.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/project

./manage.py runserver 0:8000