오늘은 EC2 위에 Python 기반 개발 환경을 구성하고,
FastAPI로 서버를 실행한 뒤 간단한 응답까지 확인하는 작업을 진행했다.
EC2 재시작 및 SSH 접속
어제 작업 후 EC2를 stop 해둔 상태이므로
오늘은 start부터 시작했다.
aws ec2 start-instances --instance-ids [instance id]
ssh -i ~/.ssh/[key] ubuntu@[ip]
EC2 인스턴스를 중단해두면 컴퓨팅 비용은 부과되지 않는다.
다만 다시 시작하면 Public IP가 변경된다.
Elastic IP를 사용하면 고정 IP를 유지할 수 있지만,
현재는 콘솔을 오가며 구조에 익숙해지는 단계이므로
직접 확인 후 접속하는 방식을 사용 중이다.
시스템 업데이트
sudo apt update && sudo apt upgrade -y
- apt update는 패키지 목록을 최신 상태로 갱신한다.
- apt upgrade는 실제 설치된 패키지를 최신 버전으로 업그레이드한다.
Ubuntu 22.04 기본 이미지에는 Python 3.10이 포함되어 있다.
Python 개발 환경 구성
Node 환경에 익숙하다 보니 npm install처럼 간단히 끝날 것이라 예상했다.
하지만 Python 환경에서는 OS 패키지 정책과 충돌하는 문제를 먼저 마주했다.
pip 설치
sudo apt install python3-pip -y
pip는 Python Package Manager이다.
Node.js의 npm과 동일한 역할을 한다.
FastAPI, Whisper, boto3는 기본 패키지가 아니다.
pip을 통해 별도로 설치해야 한다.
Whisper 설치 중 발생한 문제
pip3 install openai-whisper
다음과 같은 에러가 발생했다.
externally-managed-environment
이 오류는 Ubuntu가 시스템 Python 환경을 보호하고 있기 때문에 발생한다.
Ubuntu 22.04부터는 apt가 관리하는 전역 Python 환경에 pip가 직접 개입하지 못하도록 제한하고 있다.
OS 동작에 영향을 줄 수 있기 때문이다.
즉, “설치가 안 되는 것”이 아니라
“시스템 영역에 설치하려 했기 때문에 차단된 것”이다.
--break-system-packages 옵션
에러 메시지에 안내된 대로 다음과 같이 시도했다.
pip3 install openai-whisper --break-system-packages
이 옵션은 Ubuntu의 보호 정책을 무시하고
apt가 관리하는 영역에 pip 패키지를 강제로 설치하겠다는 의미다.
하지만 이번에는 또 다른 에러가 발생했다.
no such option: --break-system-packages
현재 pip 버전이 해당 옵션을 지원하지 않는 구버전이었기 때문이다.
정리하면 다음과 같은 상황이었다.
- 기본 설치는 Ubuntu 정책에 의해 차단된다.
- 정책 우회 옵션은 pip 버전 문제로 사용할 수 없다.
해결 방법 3가지
1. pip 업그레이드 후 전역 설치
pip를 최신 버전으로 올린 뒤 --break-system-packages를 사용하는 방법이다.
하지만 여전히 시스템 전역을 수정하는 방식이다.
2. --user 옵션 사용
pip3 install openai-whisper --user
이 방식은 ~/.local/ 경로에만 설치한다.
시스템 Python 영역과 분리된다.
3. Python 가상환경 사용
python3 -m venv venv
source venv/bin/activate
pip install openai-whisper
가상환경은 프로젝트 전용 Python 실행 환경을 새로 생성한다.
독립된 site-packages 디렉터리를 사용하므로
시스템 Python과 완전히 분리된다.
왜 가상환경에서는 문제가 발생하지 않는가
핵심은 “설치 위치”이다.
- 전역 설치 → apt 관리 영역과 충돌
- --break-system-packages → 정책을 무시하고 강행
- --user → 사용자 홈 디렉터리에 설치
- venv → 완전히 독립된 Python 환경에 설치
Ubuntu가 차단하는 대상은 “시스템 전역 영역”이다.
가상환경은 이 영역을 건드리지 않기 때문에 정책 충돌이 발생하지 않는다.
권장 방식은 venv를 사용하는 것이다.
다만 현재 프로젝트는 단일 EC2 기반의 단순 구조이며,
빠른 실험이 목적이므로 --user 방식을 선택했다.
기본 기능 구현 이후 가상환경 기반으로 정리할 계획이다.
디스크 용량 부족
Whisper 설치가 잘 진행되는 듯 보였으나, 또 다른 문제가 발생했다
[Errno 28] No space left on device
이 메시지는 인스턴스의 디스크 공간이 부족하다는 의미다.
EC2는 “클라우드에 있는 서버 한 대”이다.
로컬 컴퓨터에서 저장 공간이 부족하면 파일 저장이 실패하는 것과 동일한 상황이다.
현재 디스크 상태를 확인했다.
df -h
- 전체 용량: 8GB
- 사용 중: 약 5GB
- 남은 공간: 약 2.5GB
Whisper와 PyTorch는 설치 과정에서 수 GB 단위 파일을 다운로드한다.
디스크 용량을 확장해야 한다...
EC2의 저장 구조 이해하기
EC2 인스턴스는 크게 두 가지 자원으로 구성된다.
- 컴퓨팅 자원 (CPU, RAM)
- 저장 자원 (EBS)
위의 오류는 EBS 용량 부족때문에 발생했다
EBS
- 비휘발성 디스크
- EC2를 stop해도 데이터 유지
- Ubuntu OS, Python, Whisper, 코드가 모두 저장되는 공간
RAM
- 휘발성 메모리
- 실행 중인 프로그램이 사용하는 작업 공간
- 인스턴스를 종료하면 데이터가 사라진다
해결 방법: EBS 용량 확장
로컬 컴퓨터에서 저장 공간이 부족하면 SSD를 교체하거나 확장한다.
EC2도 동일하다.
EBS 볼륨 크기를 늘리면 된다.
기본 AMI 설정으로 인해 디스크가 8GB로 생성되어 있었다.
이를 30GB로 여유있게 확장했다.
EBS 확장의 구조
EBS 확장은 단순히 숫자만 늘리는 작업이 아니다.
저장 구조는 다음 3단계로 구성된다.
- Volume – AWS가 제공하는 물리적 저장 공간
- Partition – 볼륨을 나눈 영역
- Filesystem – 실제 파일을 저장하는 구조
비유하면 다음과 같다.
- 볼륨 = 땅
- 파티션 = 구획
- 파일시스템 = 건물
볼륨만 확장하면 “땅”만 넓어진다.
파일시스템까지 확장해야 실제 사용 가능 공간이 늘어난다.
일반적인 확장 과정
일반적으로는 다음 단계를 거친다.
- 콘솔 또는 CLI로 EBS 볼륨 크기 수정
- growpart로 파티션 확장
- resize2fs로 파일시스템 확장
Ubuntu 22.04 공식 AMI는 cloud-init을 포함하고 있다.
cloud-init은 클라우드 인스턴스가 처음 부팅될 때 자동으로 실행되는 초기 설정 프로그램이다.
이녀석이 디스크 확장을 자동으로 처리해준다.
덕분에 별다른 설정 없이 30GB로 확장된 것을 확인할 수 있었다.
그리고 중단됐던 Whisper를 마무리했다.
FastAPI + Uvicorn
pip3 install fastapi uvicorn --user
FastAPI는 애플리케이션 정의를 담당한다.
실제 서버 역할은 Uvicorn이 수행한다.
Node.js와 달리 Python에서는
프레임워크와 서버 실행기가 분리되어 있는 구조이다.
테스트 서버 실행
uvicorn test_api:app --host 0.0.0.0 --port 8000
- 0.0.0.0은 모든 네트워크 인터페이스에서 접속을 허용한다는 의미다.
보안 그룹 설정
EC2 보안 그룹에서 8000 포트를 열어야 외부 접근이 가능하다.
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxx \
--protocol tcp \
--port 8000 \
--cidr [내IP]/32
Uvicorn은 모든 IP에서의 접속을 허용하도록 실행했다.
하지만 보안 그룹에서 [내IP]/32로 제한했기 때문에
내 IP → EC2:8000 경로만 허용된다.
curl 테스트
curl http://[PublicIP]:8000
응답:
{"message":"Video Transcription API","status":"running"}
서버가 정상적으로 외부 요청을 처리하는 것을 확인했다.
boto3 설치
마지막으로 S3와 DynamoDB 연동을 위해 AWS SDK를 설치했다.
boto3는 Python용 AWS SDK이다.
AWS 공식 라이브러리이며, Python 코드에서 AWS 서비스를 직접 제어할 수 있게 해준다.
Node.js에서 aws-sdk 또는 @aws-sdk/client-s3를 사용하는 것과 동일한 개념이다.
pip3 install boto3 --user
'Project > CloudNote' 카테고리의 다른 글
| S3, DynamoDB, EC2 세팅 (3) (0) | 2026.02.22 |
|---|---|
| IAM Identity Center & CLI 설정 (2) (0) | 2026.02.18 |
| AI 강의 요약 서비스 만들기 (1) (0) | 2026.02.18 |