AWS

Seoyul Kim·2020년 4월 30일
0

배포

목록 보기
1/3

AWS란?

  • Amazon Web Service의 줄임말로 클라우드 서비스 라고도 하며 서버 등의 인프라스트럭쳐를 필요한대로 on demand로 사용할수 있는 서비스이다.
  • 유저가 직접 서버를 구입하고 설치할 필요 없이 AWS상에서 클릭 몇번으로 서버를 구축하고 사용할 수 있다.

웹서비스 배포를 위한 AWS

  • AWS가 제공하는 기능들은 굉장히 방대하고 다양한데, 그 중 일반적으로 많이 사용되는 개념과 기능은 EC2, Security Group, RDS, Load Balacer(ALB), Route 53, S3이 있다.

1.EC2

  • Elastic Compute Cloud
  • AWS 상에서 사용하는 서버로 EC2 서버에 API를 배포하게 된다.

2.Security Group

  • EC2 인스턴스에 대한 네트워크 트래픽을 제어하는 가상 방화벽 역할을 한다.
  • security group 설정을 해줘야 EC2 인스턴스에 HTTP와 SSH 접속이 가능하다.

3.RDS(Relational Database Service)

  • AWS의 데이터베이스 서비스
  • 사용자가 직접 서버를 생성해서 데이터 베이스를 설치하고 설정하고 관리하지 않아도 되고 동시에 비용도 더 저렴하다.

4.Load Balancer

  • HTTP 요청들을 여러 서버에 분산할 때 사용된다.
  • HTTP 요청이 많을 때는 서버 하나만으로 모두 처리하기 힘들기 때문에 서버 수를 늘리는 것이 일반적이다.
  • 여러 버서를 실행하고 load balacer가 HTTP 요청들을 서버들에 분산 해주는 형태로 시스템이 구성된다.

5.Route 53

  • AWS의 DNS 서비스로 API 시스템을 실제 도메인과 연결 시켜주는 기능을 제공한다.

6.AWS S3(Simple Storage Service)

  • 이름 그대로 파일을 쉽게 저장할 수 있는 공간을 제공하는 서비스
  • 파일을 저장할 수 있을 뿐만 아니라 파일마다 고유 주소를 부여해주기 때문에 S3에 저장한 파일을 웹상에서 쉽게 읽어들일 수 있다.
  • 주로 사이트상의 이미지들을 저장하고 사이트에서 읽어들여 렌더링 해주는데 사용한다.

EC2 서버 생성

  1. 인스턴스를 시작하고 프리티어 사용 가능한 Ubuntu server 18.04 LTS를 선택한다.

  2. t2_micro가 1년동안 무료이므로 instance type은 t2_micro 선택한다.

  3. subnet 을 기본값으로 설정하고, 종료 방지 기능을 활성화하여 우발적인 종료로 부터 보호한다.

  4. storage는 기본 8GB로 둔다.

  5. 태그를 추가하여 키와 값을 설정한다.

  6. 보안 그룹은 기본 설정 값 그대로 설정한다.

  7. pem 키 파일을 전에 발급받은 키로 설정한다.

  8. 인스턴스 시작 후 public ip 주소로 ssh 접속

#path/to/pem 은 pem 키 파일 경로

ssh -i path/to/pem ubuntu@13.125.228.11 

RDS 생성

  • AWS RDS는 여러 데이터 베이스를 제공하지만 MySQL로 설정하여 진행한다.
    1.MySQL 설정 파일은 직접 만들지 않아도 default 설정 파일이 있지만 utf-8 인코딩 설정을 해주어야 한국어 저장이 가능하다.

2.parameter groups 페이지에서 create parameter group 을 선택하여 시작한다.

3.group name 과 description 은 자유롭게 정하고 parameter group family의 경우 mysql5.7로 설정한다.

4.방금 생성한 설정 파일을 수정한다.

  • 검색창에 charater_set을 검색하여 나오는 parameter들을 utf8mb4로 설정한다.
  • chracter_set_client
    utf8mb4로 변경
  • chracter_set_connection
    utf8mb4로 변경
  • chracter_set_database
    utf8mb4로 변경
  • chracter_set_results
    utf8mb4로 변경
  • chracter_set_server
    utf8mb4로 변경
  • 검색창에 collation을 검색하여 나오는 parameter들을 다음과 같이 설정한다.
    • collation_connection
      utf8mb4_general_ci로 변경
    • collation_server
      utf8mb4_unicode_ci로 변경
      5.preview changes를 눌러서 수정사항을 확인하고 변경사항을 저장한다.

6.create database를 눌러 MySQL 데이터베이스를 새로 생성한다.

7.MySQL을 엔진으로 선택하고 DB 세부 사항은 대부분 default 값으로 두고 맨 아래 settings에서 데이터베이스를 설정하고 싶은 이름으로 생성하고 싶다면 DB instance identifier에 데이터베이스 이름을 적어준다.(아니면 생성되지 않고 나중에 터미널 mysql에서 생성 가능)

8.master username은 root로 설정하고 비밀번호를 설정한다.

9.고급 설정 페이지에서 public accessability를 yes로 설정하고 DB parameter group을 방금 생성한 parameter 설정 파일로 변경한다.

10.나머지는 default 값 그대로 두고 create database 버튼을 눌러 마무리한다.

11.instance 페이지에서 데이터베이스 대쉬보드 페이지로 가면 endpoint를 확인해 이 주소로 database에 접속할 수 있다.

12.Security group 설정을 변경하여 어디서든 접속이 가능하게 한다.(원래는 해킹의 위험이 있기 때문에 어디서든 접속 가능하게 열어놓지 않는다.

  • 보안 규칙 그룹에서 inbound를 선택하여 inbound 규칙을 편집한다.
  • 소스 정보를 위치 무관으로 변경한다.

13.생성된 데이터베이스에 접속한 후 데이터베이스와 테이블을 생성한다.

mysql -h temptest.cj5v1k6zfree.ap-northeast-2.rds.amazonaws.com -u root -p

EC2 / RDS 프로젝트 배포(gunicorn)

1.pem 파일이 있는 폴더로 이동후 EC2 서버로 접속한다.

ssh -i path/to/pem ubuntu@13.125.228.11 

2.ubuntu linux 환경이므로 미니콘다 사이트로 이동해서 linux installer에서 python 3.7 버전의 name에서 오른쪽 마우스를 클릭 후 copy link address를 선택해 터미널에서 다음 명령어를 실행해 설치한다.

weget /copied link address/

3.실행권한을 주어 모두 yes로 실행한다.

 chmod +x /미니콘다파일/ # 실행 권한 부여
 /미니콘다 파일/ # 파일 실행

4.bash shell script 로 로컬 환경과 같이 설정한다.

source .bashrc

5.package update/upgrade

sudo apt-get update
sudo apt-get upgrade

6.mysqlclient 설치시 에러나지 않게 gcc 설치 후 mysqlclient 설치

sudo apt-get install gcc
sudo apt-get install libmysqlclient-dev

7.conda로 프로젝트를 위한 가상환경 생성 후 activate

conda create -n project python=3.7
conda activate project

8.레포지토리 clone 후 디렉토리로 이동

git clone /git repository/
cd /git repository/

9.프로젝트에 필요한 패키지 목록인 requirement 확인 후 설치

cat requirements.txt
pip install -r requirements.txt

10.my_settings 파일을 프로젝트에 만들고 settings에 EC2 서버의 public ip 를 설정하고 서버를 돌린다.

  • EC2 instance에서 runnig 중인 서버의 public ip를 복사 후
vi project명/settings.py
ALLOWED_HOSTS = ['*', 'public_ip', 'public_ip:8000']

11.my_settings에 mysql 설정과 secret_key 넣어준다.

vi my_settings.py  #root 디렉토리에 생성
  • 전에 프로젝트의 로컬 환경에서 my_settings 복사 후 현재 my_settings에 붙여 넣는다.
  • host와 password를 RDS의 database endpoint와 비밀번호로 설정한다.
python manage.py runserver 0.0.0.0:800 #public ip 로 접속
#로컬 환경에서도 아래 명령어로 원격 RDS에 접속 가능
mysql -h temptest.cj5v1k6zfree.ap-northeast-2.rds.amazonaws.com -u root -p

12.EC2 public ip 가져와서 postman 으로 test 가능

13.장고에서 사용하는 manage.py runserver는 단일 thread로 동작하여 개발 테스트로 적당하지만 request 많은 운영 환경에서는 사용하기 적합하지 않으므로 multi thread를 지원하는 웹 어플리케이션인 gunicorn 을 설치하여 사용한다.

pip install gunicorn
  • ssh 세션이 끊어져도 서버를 동작시켜 주기 위해서 nohup 이라는 툴을 사용해서 gunicorn 을 백그라운드로 동작시켜준다.
gunicorn --bind=0.0.0.0:8000 welonmusk.wsgi #백그라운드로 돌리지 않고 그냥 돌림
nohup gunicorn --bind=0.0.0.0:8000 welonmusk.wsgi & #백그라운드로 돌린다.
ps -ef | grep python # 실행 확인
kill /pid_num/ # 서버를 동작시킬 필요 없을 경우 gunicorn 종료 

wsgi란?

  • 장고의 웹 어플리케이션을 지정한다
    &란?
  • 백그라운드로 동작하는 명령어

0개의 댓글