고민 많이 했습니다. EC2 서버 만드는 과정을 블로그에 작성해야한다는 엄청난 중압감 하지만 사나이라면 이겨내야한다고 생각합니다. 그냥 해보겠습니다. ㅋ
이번시간은 AWS EC2 인스턴스에 직접 접속하여 파이썬 개발 환경을 구축하고,
FastAPI 애플리케이션을 백그라운드 데몬 서비스(systemd)로 등록하여 안정적으로 배포하는 전체 과정을 정리해보겠습니다.
1. 수동 서버/프로덕션 환경 구성의 단점과 한계
클라우드 인프라 구축 시 Terraform이나 Docker/Kubernetes 같은 자동화 도구 없이, EC2에 직접 접속하여 하나씩 세팅하는 방식은 다음과 같은 명확한 한계가 존재합니다. (이 단점을 보여드리기 위한 내용)
- 시간 소요 및 휴먼 에러(Human Error) 가능성 증가: 설치 명령어나 환경변수를 하나라도 누락하면 원인을 찾기 어려운 오류가 발생할 수 있습니다.
- 재현성(Reproducibility)의 한계: 패키지 버전 업데이트나 리눅스 환경 변수로 인해 '어제는 되었는데 오늘은 안 되는' 상황이 발생하기 쉽습니다.
- 결론: 수동 구축은 초기 인프라 구조를 이해하는 데는 가장 좋지만, 실제 운영에서는 CI/CD 파이프라인이나 컨테이너 기반 자동화 배포 환경으로 전환하는 것이 바람직합니다.
2. EC2 초기 접속 및 인프라 사전 준비
1. AWS 콘솔 접속
할당받은 로그인 주소를 통해 콘솔에 접속합니다.

2. 보안 그룹(Security Group) 설정 + 태그 추가
인바운드 규칙에 SSH 접속용 22번 포트와 FastAPI 웹 서비스 연결용 8000번 포트를 개방합니다.
태그 추가하면 검색할 때 쉬워용



3. 퍼블릭 IP 및 Elastic IP(탄력적 IP) 할당
EC2 인스턴스를 재부팅할 때마다 퍼블릭 IP가 변경되는 것을 방지하기 위해 전용 탄력적 IP를 할당받아 매핑합니다.

4. 인스턴스 생성

aws ec2 에 작성해야하는 내용은 영어로 작성해주세요.
저희는 ubuntu를 이용했고 대부분의 설정은 기본 값을 그대로 해주시고 제가 사진 올린것만 변경하시면 됩니다.

키 페어 만드는 것이 매우 중요합니다.
키페어 만들기

잘 만들어서 어디 꽁꽁 숨겨두세요. 해킹당하시지 않게 ㅎㅎ



설정 다 하시고 인스턴스 시작 누르시면 인스턴스 시작됩니다.
5. SSH 접속
터미널이나 SSH 툴(PuTTY, MobaXterm 등)을 열고 퍼블릭 IP와 .pem 키를 이용해 서버에 접근합니다.
MobaXterm 설치 위치
https://mobaxterm.mobatek.net/download-home-edition.html
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
설치후 실행
Session 버튼 클릭
SSH 클릭

Remote host 값을 EC2 인스턴스에서 가져옵니다.
Username 은 ubuntu 입니다. (default 값이라고 하네요 ㅎㅎ)
저장했던 pem 키는 Use private key에 업로드해주면 됩니다.

다 하시고 ok 누르시면 접속되실 겁니다. 아마 무슨 창이 뜰텐데 accept 해주시면 됩니다.
안되면 조금 상세히 뭐가 안되시는지 댓글 남겨주세요 ㅎㅎㅎ
3. 리눅스 패키지 및 파이썬 가상환경(venv) 세팅
1) 시스템 패키지 업데이트
sudo apt update && sudo apt upgrade -y
💡 알아두면 좋은 리눅스 지식: apt vs apt-get
- apt: apt-get과 apt-cache의 주요 기능을 통합하여 일반 사용자가 사용하기 쉽도록 만든 최신 명령어로, 진행률 표시줄 및 권장 패키지 안내 등이 개선되어 대화형 터미널에 적합합니다.
- apt-get: 하위 호환성을 보장하는 오래된 명령어입니다. 동작 결과가 일정하여 쉘 스크립트 기반 자동화 작업 시 안전하게 자주 사용됩니다.
2) 파이썬 pip 및 venv 설치
sudo apt install python3-pip python3-venv -y
💡 왜 파이썬 가상환경(venv)을 사용할까요?
- 하나의 OS 환경에서 여러 파이썬 프로젝트를 구동할 때, 프로젝트 간 라이브러리 패키지 버전 충돌을 방지하고 격리된 독립 환경을 만들어 줍니다.
- 참고: 도커(Docker) 컨테이너 환경에서는 1개의 컨테이너 OS 단위에 단 하나의 애플리케이션만 구동되므로, 컨테이너 내부에서는 가상환경을 별도로 생성하지 않는 경우가 많습니다.
3) 프로젝트 생성 및 패키지 설치
# 프로젝트 디렉토리 생성 및 이동
mkdir projects && cd projects
# 'web'이라는 이름의 가상환경 생성
python3 -m venv web
# 가상환경 활성화 (프롬프트 앞에 (web) 표시 확인)
source web/bin/activate
# 가상환경 내 pip 최신화
pip install --upgrade pip
# 백엔드 필수 패키지 설치
pip install fastapi uvicorn[standard] jinja2
이후 소스 코드(main.py 등)를 SFTP 전송, Git Clone, 혹은 신규 작성을 통해 ~/projects/ 디렉토리에 배치합니다.
4. 백그라운드 서비스를 위한 systemd 파일 구성
터미널 세션을 종료하더라도 서버가 계속해서 실행되고, EC2 인스턴스가 재가동되더라도 서비스가 자동으로 켜지도록 리눅스 시스템 데몬 서비스(systemd)로 등록해 주어야 합니다.
1) 서비스 등록 파일 생성
/etc/systemd/system/ 디렉토리 내의 모든 파일은 root 권한 소유이므로, sudo 명령어를 활용하여 관리자 권한으로 작성합니다.
sudo nano /etc/systemd/system/hello.service
2) 서비스 설정 내용 기재
아래 내용을 편집기에 그대로 입력합니다.
[Unit]
Description=FastAPI WAS (Web Application Service)
After=network.target
[Service]
User=ubuntu
Group=www-data
# 애플리케이션 소스 코드가 위치한 작업 디렉토리
WorkingDirectory=/home/ubuntu/projects
# 환경변수 파일(.env)이 필요하다면 아래 주석 해제 후 연결
# EnvironmentFile=/home/ubuntu/projects/.env
# 가상환경(web) 내부에 설치된 uvicorn으로 FastAPI 앱 실행
ExecStart=/home/ubuntu/projects/web/bin/uvicorn main:app --host 0.0.0.0 --port 8000
# 프로세스가 다운되거나 OS 재부팅 시 항상 자동 재가동
Restart=always
[Install]
WantedBy=multi-user.target
- 저장 및 종료 방법: Ctrl + X ➔ Y 입력 ➔ Enter
5. 서비스 등록 및 제어
작성한 서비스 파일을 시스템에 반영하고 제어합니다.
# 1. systemd 데몬 재로드 (새로 작성된 서비스 파일 인식)
sudo systemctl daemon-reload
# 2. 서비스 상태 확인 (초기 상태: inactive)
sudo systemctl status hello.service
# 3. 서비스 시작
sudo systemctl start hello.service
# 4. 서버(OS) 재부팅 시 서비스가 자동으로 실행되도록 설정
sudo systemctl enable hello.service
# 실행 정상 상태 확인 예시
● hello.service - FastAPI WAS (Web Application Service)
Loaded: loaded (/etc/systemd/system/hello.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-07-23 02:12:42 UTC; 8s ago
Main PID: 50681 (uvicorn)
💡 서비스 관리 주요 명령어 요약
- 중단: sudo systemctl stop hello.service
- 재가동: sudo systemctl restart hello.service
- 상태 확인: sudo systemctl status hello.service
6. 최종 배포 테스트
- 터미널 세션 종료 테스트: SSH 터미널 접속을 종료한 후에도 웹 브라우저에서 http://[EC2-퍼블릭IP]:8000으로 정상 접속되는지 확인합니다.
- 인스턴스 재부팅 테스트: AWS 콘솔에서 EC2 인스턴스를 재시작(Reboot)한 뒤에도 systemd에 의해 FastAPI 서비스가 자동으로 로드되어 정상 응답하는지 테스트합니다.
이로써 EC2 환경에 FastAPI 애플리케이션 수동 배포 및 자동 재시작 환경 세팅이 모두 완료되었습니다! 추후에는 이 환경에 GitHub Actions나 Jenkins를 연동하여 CI/CD 파이프라인으로 발전시킬 수 있습니다.
아 그리고 소스 코드가 필요하시다면 여기서 사용하세요.
main branch에 있는 소스 사용하시면 됩니다.
https://github.com/hosose/my_project
GitHub - hosose/my_project: git 사용 연습
git 사용 연습. Contribute to hosose/my_project development by creating an account on GitHub.
github.com
아무튼 위의 작업을 자동화하여 직접 수동으로 터미널에 작성하지 않게 하기 위해 CI/CD를 반드시 해야합니다! 너무 귀찮거덩요.