AWS

[AWS] 웹 애플리케이션 배포하기 (EC2)

그낙이 2025. 5. 3. 18:50
반응형
반응형

[2편: MobaXterm으로 EC2에 Django 프로젝트 배포하기]

이 글은 AWS EC2 인스턴스에 배포할 Django 프로젝트를 MobaXterm을 이용해 원격 접속하고 설정하는 실습형 가이드입니다. 앞선 글에서 EC2와 RDS 환경을 구축했다면, 이제 본격적으로 애플리케이션을 배포해봅시다.

 

MobaXterm이란?

 

MobaXterm은 윈도우에서 리눅스 서버에 쉽게 원격 접속할 수 있는 도구입니다.
터미널(Shell) 기능과 함께 SFTP(파일 전송), 텍스트 편집기, X-Server 등을 모두 포함한 올인원 리눅스 원격 접속 도구로, 다음과 같은 장점이 있습니다:

  • .pem 키페어를 쉽게 등록하여 EC2에 SSH 접속 가능
  • 접속과 동시에 서버 파일 탐색기 자동 연동
  • 텍스트 파일 수정도 GUI 환경에서 바로 가능
  • Git, Python, Django 개발에 매우 유용

EC2 접속 도구 대안 정리

MobaXterm Windows GUI 기반, SFTP 자동 연결, .pem 관리 쉬움 리눅스에 익숙하지 않은 윈도우 사용자
Windows Terminal
+ OpenSSH
Windows 가볍고 빠름, Windows 10/11 기본 탑재 개발 환경에 익숙한 사용자
PuTTY Windows 전통적인 SSH 클라이언트, .ppk 키 필요 키 변환 필요하지만 안정적
WSL (Ubuntu) Windows 리눅스 환경 제공, bash 사용 가능 리눅스 실습/개발 같이 병행할 때
Terminal (macOS/Linux) macOS/Linux 기본 탑재, SSH 명령어 바로 사용 가능 맥/리눅스 사용자 기본 선택
VS Code Remote - SSH Cross-platform 코드 편집 + 서버 접속을 동시에 코드 작성 + 서버 연동이 필요한 경우
FileZilla Cross-platform GUI 기반 SFTP 전용 파일만 업로드할 경우

 

Mac이나 Linux 사용자라면 기본 터미널을 써도 되지만, Windows에서는 MobaXterm이 가장 편리한 선택입니다. 이 글에서는 MobaXterm을 통한 Django 배포를 다루고 있습니다.


 

준비물 체크리스트

  • EC2 서버: Ubuntu 또는 Amazon Linux 기반
  • SSH 키페어 (.pem) 파일
  • GitHub에 올려둔 Django 프로젝트
  • RDS 정보 (엔드포인트, 유저명, 비밀번호)
  • MobaXterm 설치: https://mobaxterm.mobatek.net
 

MobaXterm free Xserver and tabbed SSH client for Windows

The ultimate toolbox for remote computing - includes X server, enhanced SSH client and much more!

mobaxterm.mobatek.net


 

MobaXterm으로 EC2 접속하기

  1. MobaXterm 실행하고 우클릭, New Session 선택 후 SSH를 선택하여 새로운 Session을 연결해줍니다.
  2. Remote host에는 EC2 탄력 IP 주소를 입력해줍니다.
  3. Specify username에는 ubuntu를 입력해줍니다. (AMI에 따라 다를 수 있습니다. default도 괜찮습니다.)
  4. Use private key: .EC2 생성 시 받은 pem 키페어 등록해줍니다.
  5. OK 클릭 후 접속해줍니다.

 

연결에 성공하면 다음과 같은 화면이 나옵니다. 

 

 

RDS 연결 

EC2 생성하기 편에서 있던 RDS를 연결해줍니다. 코드는 다음과 같습니다.
mysql -h <RDS 엔드포인트> -u admin -p

 

Django 설정 변경해주기

 

Django settings.py에 설정되어 있는 db 정보를 변경해줍니다. 배포 환경과 로컬 환경 db 정보를 분기처리해서 설정해주면, 개발과 배포의 분리가 가능해 관리하기 좋습니다. 

hostname = socket.gethostname()

if hostname.startswith('ip-'):  # EC2 서버일 경우
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # engine: mysql
            'NAME': 'some_ec2_db_name',  # DB Name
            'USER': 'some_ec2_user',  # DB User
            'PASSWORD': 'some_ec2_password',  # Password
            'HOST': 'some_rds_endpoint',  # 생성한 데이터베이스 엔드포인트
            'PORT': '3306',  # 데이터베이스 포트
            'OPTIONS': {
                'charset': 'utf8mb4',
                'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
            }
        }
    }
else:
    # 개발 서버 또는 로컬 환경의 설정
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # engine: mysql
            'NAME': 'some_local_db_name',  # DB Name
            'USER': 'some_local_user',  # DB User
            'PASSWORD': 'some_local_password',  # Password
            'HOST': '127.0.0.1',  # 로컬 개발용 MySQL
            'PORT': '3306',  # 데이터베이스 포트
            'OPTIONS': {
                'charset': 'utf8mb4',
                'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
            }
        }
    }

 

ssh, Git 프로젝트 연동

ssh-keygen -t rsa
cd .ssh
cat id_rsa.pub <- 전부 복사 주소까지
cd ..
[github에서 settings->deploy keys 생성]
git pull (github repo ssh url)

# 가상 환경 설치
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install uwsgi
pip install django

# 마이그레이션
python manage.py makemigrations
python manage.py migrate

# 정적 파일
python manage.py collectstatic

# 마이그레이션이 안된다면
python manage.py makemigrations <앱 이름>
python manage.py migrate

 

cat id_rsa.pub 입력 시, 출력되는 코드를 전부 복사해서 프로젝트 레포지토리 deploy key에 넣어줍니다. 

collectstatic 명렁어는 static 파일들을 하나의 폴더에 모아주는 명령어로, 실제 서비스 환경에서 필수입니다.


 

(번외) git 연결

# 현재 리모트 확인
git remote -v

# 만약 origin이 없다면, 추가
git remote add origin git@github.com:some_github_team/some_project_repository.git

# origin이 이미 있고, URL을 바꾸고 싶다면
git remote set-url origin git@github.com:some_github_team/some_project_repository.git

# main을 트래킹하도록 설정
git branch --set-upstream-to=origin/main main

# branch 명이 main이 아닐때 확인
git branch

# 예시(master 브랜치인 경우)
git branch --set-upstream-to=origin/master master

# 연결 안됐을 때 -- 
git ls-remote --heads origin

# 예시 출력 
<hash>	refs/heads/main
이렇게 진행하면, head가 origin/main에 존재하게 되므로 로컬 브랜치 이름을 변경해주는 것이 좋습니다. 로컬 브랜치를 main으로 이름을 변경하고 연결해줍시다. 
 
git branch -m master main
git fetch origin
git branch --set-upstream-to=origin/main main

 

 
uwsgi 등 서버 설정 변
# 1.uwsgi 파일로 이동해서 -> project이름 수정 [project이름은 app말고 project이름]

# 2.
sudo vim /etc/systemd/system/uwsgi.service
# sudo nano /etc/systemd/system/uwsgi.service

[Unit]
Description=uWSGI Emperor Service
After=network.target

[Service]
ExecStart=/home/ubuntu/venv/bin/uwsgi --ini /etc/uwsgi/sites/djangoProject.ini
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target
sudo vim 사용 시 i(insert) 이후 텍스트를 입력하고, 저장하려면 esc + :wq(write + quit) 명령어를 입력하면 됩니다. 

sudo nano 사용 시 Ctrl + O (저장), Ctrl + X(종료) 입니다. 

 

접속 확인

# uwsgi.service 작성후
sudo systemctl daemon-reload
sudo systemctl enable uwsgi.service
sudo systemctl start uwsgi.service

 

sudo systemctl status uwsgi.service

 

위 명령어로 서비스가 잘 시작되었는지 상태도 확인하실 수 있습니다.

 

브라우저에서 탄력 IP 입력했을 때, 진행한 프로젝트 메인 페이지 뜨면 성공입니다.

 

다음 글 안내

 

✨ 이 글은 AWS 기반 Django 배포의 2단계입니다. EC2에 원격 접속하고, RDS와 연동된 Django 프로젝트를 실제로 실행해보는 실습을 다뤘습니다.

 

👉 다음 글에서는 Route53 도메인 연결 및 HTTPS 인증서 설정 방법을 정리합니다. 

 

[AWS] 웹 애플리케이션 배포하기 (EC2)

[3편: Route53 도메인 연결 및 HTTPS 인증서 설정하기]이 글은 AWS EC2 인스턴스에 Route53 도메인 연결 및 HTTPS 인증서를 설정하는 실습형 가이드입니다. 앞선 글에서 EC2와 RDS 환경을 구축과 MobaXterm으로

gnaaak.tistory.com

 

언제나처럼 — 시작은 삽질이지만, 끝은 지식입니다.

반응형