[Project] 플레이데이터 장고 미니프로젝트 - AWS EC2 서버 작업

싱숭생숭어·2023년 5월 13일
0

project

목록 보기
3/5

EC2(Elastic Compute Cloud)란?

  • 아마존 웹 서비스(AWS)에서 제공하는 클라우드 컴퓨팅 서비스

  • 클라우드 컴퓨팅이란? 인터넷(클라우드)을 통해 서버, 스토리지, 데이터베이스 등의 컴퓨팅 서비스를 제공해주는 것
    -> AWS에서 원격으로 제어할 수 있는 가상의 컴퓨터를 한 대 빌리는 것

    • (Amazon 공식:) IT 리소스를 인터넷을 통해 온디맨드로 제공하고 사용한 만큼만 비용을 지불하는 것을 말합니다. 물리적 데이터 센터와 서버를 구입, 소유 및 유지 관리하는 대신, Amazon Web Services(AWS)와 같은 클라우드 공급자로부터 필요에 따라 컴퓨팅 파워, 스토리지, 데이터베이스와 같은 기술 서비스에 액세스할 수 있습니다.
  • 클라우드 컴퓨팅을 통해 실제 서버를 구축하는 것보다 훨씬 간편하고 효율적이고 비용도 절감할 수 있음 !

EC2에 대해 더 자세히 알고 싶다면 아래 사이트 참고 !


프로젝트에서 활용할 AWS EC2 서버

이번 미니 프로젝트에서 활용할 EC2 서버는 강사님께서 준비해주셨다!

그래서 리눅스 기반 서버에 접속하려면, putty를 다운받고 강사님께서 주신 ip주소와 .ppk 파일을 활용해야 했고, 이를 통해 쉽게 서버에 접속할 수 있었다.

putty로 ec2 서버 접속하는 방법은 아래 블로그를 참고 !

자 이제 putty로 열린 서버에서 웹사이트를 구동하기 위해서 내가 할 일은 !

  • adduser(내 계정 만들기)

  • 파이썬 설치하기

  • 가상환경 만들기

    • 가상환경 쉽게 접속하기 위한 쉘(.sh) 또는 bashrc 만들기
  • 장고 설치하기

  • 도커 설치하기

  • git clone으로 깃 허브 연결하기

    • 서버 id_rsa.pub(public key)받아서 깃 허브 ssh key에 추가

    • git pull, push 등 실행 잘 되는지 확인

  • 장고 settings.pydml allowhost 수정해서 서버 ip로 홈페이지 열리게 구현하기

  • 도커 sql컨테이너 생성해서 장고 db로 연결하기(이때, 컨테이너가 삭제된다고 해서 안의 db data가 날라가지 않도록 도커 볼륨으로 서버 내 지정한 디렉터리로 동일한 data 저장되게 함)

    • mysqlclinet 설치하기

    • mysql 컨테이너 안에 장고와 연결할 database 만들기

    • 장고 settings.py의 databases (sqlite -> mysql로 수정)

➡️ 위의 과정들을 통해 최종적으로 서버ip:8000 웹사이트가 제대로 실행되는지 여부와
웹사이트에서 계정을 생성하고, 글을 쓰거나 댓글을 달면 mysql db에서 데이터가 확인되는지 !

이 두가지를 구현하는 것을 목표로 했다 !!!


adduser

처음 서버에 접속하면 위의 사진처럼 login as: 가 뜰거다. 이때 나는 ubuntu를 사용할 것이므로, ubuntu를 입력해줌. ubuntu를 입력하면 어쩌구저쩌구 길게 쭉~~ 뜨면서 서버 안의 정보가 뜸 (걍 넘기자)

user 생성

sudo adduser [id]

user 변경

su [id]

생성 id에 sudo 권한 부여하기 (오타나 내부문서 수정안하게 주의)

ubuntu 계정으로 다시 돌아와 아래 명령어 실행
sudo visudo

  • 아래 그림에서 root 아래 나의 id와 ALL=(ALL:ALL) ALL 적기

예) # User privilege specification
root ALL=(ALL:ALL) ALL
hey9 ALL=(ALL:ALL) ALL

-> 이렇게 수정하면 앞으로 내 계정에서도 sudo 명령어를 쓸 수 있게 권한이 부여됨 !


파이썬 설치하기

sudo apt update
sudo apt install python3.10
sudo apt python3-pip


가상환경 만들기

이건 이전의 VSCODE의 WSL에서 가상환경 만든 것과 동일하다.
sudo apt install python3.10-venv
sudo python3 -m venv venv (venv라는 가상환경 생성하는 명령어)
source venv/bin/activate로 가상환경 잘 실행되는지 확인

vi start.sh (shell 생성)
i 누르고(insert 모드 변경)
상단에 #!/bin/bash 라인 추가
. 가상 환경 경로 입력(source 가상 환경 경로도 가능)
esc 누르고 :wq 입력 후 enter
deactivate 한 후 . /start.sh 입력 시 가상환경에 진입하는지 확인


장고 설치하기

pip install django


도커 설치하기

docker 설치 스크립트 다운로드

curl -fsSL https://get.docker.com -o get-docker.sh

docker 설치 스크립트 실행

sudo sh get-docker.sh

docker 서비스 시작

sudo systemctl start docker

docker 서비스 자동시작 설정

sudo systemctl enable docker

docker 그룹에 사용자 추가

sudo usermod -aG docker your_username


git clone으로 깃 허브 연결하기

git 설치

sudo apt install git

git clone을 통해 깃 허브의 레포지토리를 가져옴

sudo git clone (깃허브주소)

서버의 public key를 받아 git hub에 등록

cd .ssh -> ssh-keygen -t rsa -> cat id_rsa.pub -> 화면에 나오는 ssh key를 git hub의 ssh key에 추가(서버는 로컬과 또다른 컴퓨터라고 생각하면됨, 그래서 서버의 ssh key를 등록해야 git hub 레포지토리에 접근이 가능해짐)

git 실행여부 확인

git pull origin main git add . git commit -m "test" git push origin main 등의 명령어로 git이 잘 실행되는지 확인


서버 ip로 홈페이지 열리게 구현하기

서버에서 sudo python3 manage.py runserver 0.0.0.0:8000를 입력하고
웹페이지의 주소를 서버ip:8000으로 입력하면 페이지가 실행되지 않음 !

이유는 서버에서 장고를 host하려고 하는데, 이를 허용해주지 않았기 때문

따라서 장고의 settings.py에 들어가서 allowedhost 이 부분을 수정해주어야 한다.

allowed_host 이 부분안을 ip주소로 대체하거나 아예 전체의 주소로 host를 허용한다는 의미의 "*"을 넣어도 된다.

그럼 다시 웹페이지의 주소를 서버ip:8000으로 입력하면 제대로 실행되는 것을 볼 수 있다 !!


도커 sql컨테이너 생성해서 장고 db로 연결하기

도커의 컨테이너를 띄워서 하는 이유: 서버내에서 mysql을 설치하고 db를 생성하는 것에 비해 한번에 관리하기 편하기 때문 ! (자세한건 ..더보기)

도커 mysql 컨테이너 생성

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=비밀번호 --name django_db -v /home/mysql/data:/var/lib/mysql mysql:8.0.32 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=2

  • docker run: 도커 컨테이너를 실행하는 명령어

  • -d: 컨테이너를 백그라운드에서 실행하도록 지정하는 옵션

  • -p 4000:3306: 호스트의 포트 3306을 컨테이너의 포트 3306에 연결하는 옵션(mysql의 기본 포트는 3306)

  • -e MYSQL_ROOT_PASSWORD=1234: MySQL 루트 사용자의 비밀번호를 "비밀번호"로 설정하는 환경 변수

  • --name django_db: 컨테이너의 이름을 django_db로 지정하는 옵션

  • -v /home/mysql/data:/var/lib/mysql: 호스트의 home/mysql/data 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 데이터 볼륨으로 연결하는 옵션! 이를 통해 호스트와 컨테이너 간의 데이터를 공유(컨테이너가 삭제되어도 서버 디렉토리 내에 data가 남아있음)

  • mysql:8.0.32: 실행할 도커 이미지의 이름과 버전

  • --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=2: MySQL 서버의 문자셋, 콜레이션, 테이블 이름의 대소문자 처리를 설정하는 옵션으로, UTF-8 (utf8mb4) 문자셋과 대소문자를 구분하지 않는 콜레이션, 대소문자를 구분하는 테이블 이름 설정을 지정

따라서 위의 명령어는 MySQL 8.0.32 버전을 실행하고, 호스트의 3306 포트를 통해 컨테이너 내의 MySQL 서버에 접근할 수 있도록 설정하며, 데이터를 호스트의 home/mysql/data 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리 간에 공유함. MySQL 서버는 UTF-8 문자셋을 사용하며, 대소문자를 구분하지 않는 콜레이션과 대소문자를 구분하는 테이블 이름 설정을 가짐 !

mysqlclient 설치

mysqlclient를 설치해주는 이유: 안설치하고 계속 장고 runserver하려고 하면 서버에서 Did you install mysqlclient?라고 물어봄 .. -> 이유는 ... 아직 잘 모르겠네요 ...

암튼 mysqlclient 설치하는 법은 https://pypi.org/project/mysqlclient/ 공식 홈페이지를 참고함 !

sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
pip install mysqlclient

그럼 이제 사진처럼 열심히 설치완료됨 !

장고와 연결할 database 생성

도커의 mysql 컨테이너 안에 아직 아무 database가 없으므로 장고와 연결할 database를 만들어줘야 함

1) MySQL 컨테이너에 쉘 접속: 아래 명령어를 사용하여 MySQL 컨테이너에 쉘 접속
docker exec -it <container_name_or_id> bash
우리는 위에서 컨테이너 이름을 django_db라고 지어서 docker exec -it django_db bash

2) MySQL 클라이언트 실행
mysql -u <mysql_username> -p
우리의 경우는 mysql -u root -p

3) MySQL 비밀번호 입력: 위의 명령어를 실행하면 비밀번호를 입력하라는 메시지가 표시됨. MySQL 비밀번호를 입력하고 엔터 키를 누르기 !

4) 데이터베이스 생성: MySQL 클라이언트에서 아래 명령어를 사용하여 데이터베이스를 생성
CREATE DATABASE <database_name>;
나의 경우 database_name은 django_db로 했음

5) 데이터베이스 확인: 데이터베이스가 성공적으로 생성되었는지 확인하기 위해 아래 명령어를 사용
SHOW DATABASES;

장고를 생성한 database와 연결

장고 프로젝트와 도커 mysql 컨테이너를 연결하기 위해서는 장고의 settings.py 파일의 databases 부분을 수정해야 함 !

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명', 
        'USER': 'DB접속 계정명',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '서버 ip,
        'PORT': '3306',
    }
}

나의 경우는 위 사진과 같이 수정했다 !


^^ 이제 진짜 찐으로 장고의 서버 작업이 완료되었다 !

장고가 웹에서 잘 구현되는지 확인하기 위해 runserver를 해주기에 앞서
python3 manage.py migrate를 통해 장고의 수정사항을 업데이트 해주자.

마지막으로 python3 manage.py runserver 0.0.0.0:8000를 통해 웹페이지를 구동해주면 ~~

이제 더이상 localhost가 아닌, 서버ip 주소로 외부 사람들도 접속가능한 웹페이지를 구현하는데 성공했다 !!!

++ mysql workbench를 다운받아 나의 장고 db를 확인할 수 있고, database의 erd 또한 확인 가능하다. 이는 나도 타 블로그를 참고하였으므로, 아래 블로그의 주소를 남겨두었다.
(아래는 위 홈페이지 database의 erd)

mysql database erd 관련 블로그 참고 !

profile
공부합시당

0개의 댓글