최근에 구현한 gemini 모델을 사용하여 디스코드 채널 메세지를 시간/메세지갯수 별로 요약해주는 디스코드-봇을 클라우드 환경에 배포하는 과정을 담아보았습니다! Python 코드를 Docker를 사용하여 컨테이너화하고, AWS ECR(Elastic Container Registry)에 이미지를 publish한 후, AWS EC2(Elastic Compute Cloud) 인스턴스에 배포하여 호스팅하는 전 과정을 쓱 다뤄보겠습니다...
이 글의 구축 과정은 소규모 24/7 호스팅에 적합하며, 최대한 AWS 프리 티어(Free Tier) 범위 내에서 운영하여 비용 발생을 최소화하는 것을 목표로 하므로 참고바랍니다!
git clone https://github.com/squatboy/gemini-discord-summarizer-bot.git
cd gemini-discord-summarizer-botaws configure
# AWS Access Key ID 입력
# AWS Secret Access Key 입력
# Default region name 입력 (예: ap-northeast-2)
# Default output format 입력 (예: json)프로젝트 루트 디렉토리(gemini-discord-summarizer-bot)에 Dockerfile이라는 이름의 파일을 생성하고 다음 내용을 작성합니다. 이 파일은 Docker 이미지를 빌드하는 방법을 정의합니다.
# 1. 베이스 이미지 선택 (Python 3.10 슬림 버전 사용)
FROM python:3.10-slim
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 필요한 파일 복사 (먼저 requirements.txt만 복사하여 의존성 캐싱 활용)
COPY requirements.txt ./
# 4. Python 의존성 설치
# --no-cache-dir: 불필요한 캐시 저장 방지하여 이미지 크기 줄임
# --upgrade pip: pip 최신 버전으로 업그레이드
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
# 5. 나머지 프로젝트 파일 복사
COPY . .
# 6. 환경 변수 설정 (실제 값은 실행 시 주입)
# Dockerfile에는 실제 키를 넣지 않습니다!
ENV DISCORD_BOT_TOKEN=YOUR_DISCORD_BOT_TOKEN_PLACEHOLDER
ENV GOOGLE_API_KEY=YOUR_GOOGLE_API_KEY_PLACEHOLDER
# 7. 컨테이너 실행 시 실행될 명령어 정의 (봇 실행 파일 확인 필요, 여기서는 bot.py로 가정)
CMD ["python", "bot.py"]
주의:
bot.py가 봇을 실행하는 메인 파이썬 파일이 맞는지 확인하세요. 만약 다른 파일이라면 CMD 부분을 수정해야 합니다.ENV 부분은 플레이스홀더이며, 실제 토큰/키는 보안을 위해 컨테이너 실행 시점에 주입할 것입니다. 절대 Dockerfile에 실제 키를 하드코딩하지 마세요.Docker 이미지를 저장할 ECR 리포지토리를 생성합니다.
ap-northeast-2) EC2 인스턴스와 같은 리전을 사용하는 것이 좋습니다.프라이빗(Private) (기본값, 권장)gemini-discord-bot)
ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/REPOSITORY_NAME)
로컬 컴퓨터에서 Docker 이미지를 빌드하고 생성된 ECR 리포지토리로 푸시합니다.
ECR 로그인: 로컬 Docker CLI가 ECR에 인증하도록 합니다. 터미널에서 다음 명령어를 실행합니다. (AWS CLI가 구성되어 있어야 함)
<REGION>: ECR 리포지토리를 생성한 리전 (예: ap-northeast-2)<ACCOUNT_ID>: 본인의 AWS 계정 IDaws ecr get-login-password --region <REGION> | docker login --username AWS --password-stdin <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com
"Login Succeeded" 메시지가 표시되면 성공입니다.
Docker 이미지 빌드: Dockerfile이 있는 디렉토리(gemini-discord-summarizer-bot)에서 다음 명령어를 실행합니다.
<REPOSITORY_URI>: 2단계에서 확인한 ECR 리포지토리 URI (예: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/gemini-discord-bot)<TAG>: 이미지 버전 또는 식별자 (예: latest)docker build -t <REPOSITORY_URI>:<TAG> .
⚠️ 주의!! EC2에 맞는 amd64(x86_64) 아키텍처로 이미지 빌드해야됨!!
저는 buildx를 사용해 멀티 아키텍처 이미지를 빌드했습니다!
예시:
docker buildx build --platform linux/amd64 \
-t 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/discord-summary-bot:latest \
--push .
Docker 이미지 푸시: 빌드된 이미지를 ECR로 푸시합니다.
docker push <REPOSITORY_URI>:<TAG>
예시:
docker push 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/gemini-discord-bot:latest
푸시가 완료되면 AWS ECR 콘솔에서 해당 리포지토리에 이미지가 업로드된 것을 확인할 수 있습니다

봇을 실행할 EC2 인스턴스를 생성합니다.
AWS Management Console에서 EC2 서비스를 선택합니다.
ECR 리포지토리를 생성한 리전과 동일한 리전을 선택합니다.
인스턴스 시작(Launch instances) 버튼을 클릭합니다.
이름 및 태그(Name and tags): 인스턴스를 식별할 이름을 입력합니다. (예: discord-bot-server)
애플리케이션 및 OS 이미지(AMI): 프리 티어 사용 가능 옵션을 선택합니다.
인스턴스 유형(Instance type): t2.micro 또는 t3.micro (리전에 따라 프리 티어 제공 여부 확인)를 선택합니다. t2.micro가 가장 일반적인 프리 티어 옵션입니다.


키 페어(로그인)(Key pair (login)): SSH 접속에 사용할 키 페어를 생성하거나 기존 키 페어를 선택합니다.
.pem 파일을 다운로드하여 안전한 곳에 보관합니다. 이 파일은 인스턴스 접속에 필수적이므로 분실하지 않도록 주의하세요.네트워크 설정(Network settings):
discord-bot-sg)

스토리지 구성(Configure storage): 프리 티어는 최대 30GB의 EBS 범용(SSD) 스토리지를 제공합니다. 기본값(8GB 또는 10GB)으로도 충분합니다.
고급 세부 정보(Advanced details): IAM 인스턴스 프로파일(IAM instance profile) 항목이 중요합니다.
AWS 서비스 선택EC2 선택 후 다음.AmazonEC2ContainerRegistryReadOnly 정책을 검색하여 선택합니다. 이 정책은 ECR에서 이미지를 가져올(pull) 수 있는 권한만 부여합니다.EC2-ECR-Pull-Role) -> 역할 만들기(Create role).EC2-ECR-Pull-Role)을 선택합니다.
요약(Summary): 설정을 검토하고 인스턴스 시작(Launch instance) 버튼을 클릭합니다.

생성된 EC2 인스턴스에 SSH로 접속하여 Docker를 설치하고 설정합니다.
실행 중(Running)이 될 때까지 기다립니다.ssh -i "your-key.pem" ec2-user@ec2-XX-XX-XX-XX.REGION.compute.amazonaws.com)
.pem 키 파일이 있는 디렉토리로 이동한 후, 복사한 명령어를 실행하여 인스턴스에 접속합니다. (키 파일 권한 오류 시 chmod 400 your-key.pem 실행)ec2-userubuntusudo yum update -ysudo apt update && sudo apt upgrade -ysudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker # 부팅 시 Docker 자동 시작
sudo usermod -a -G docker ec2-user # ec2-user가 sudo 없이 docker 명령어 사용하도록 (재로그인 필요)
newgrp docker # 현재 세션에 그룹 변경 적용 (또는 재로그인)sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ubuntu # ubuntu 사용자를 docker 그룹에 추가 (재로그인 필요)
newgrp docker # 현재 세션에 그룹 변경 적용 (또는 재로그인)
docker --versionEC2 인스턴스에서 ECR 이미지를 가져와 Discord 봇 컨테이너를 실행합니다.
(선택사항 - IAM 역할 미사용 시) ECR 로그인: 4단계에서 IAM 역할을 설정했다면 이 단계는 필요 없습니다. 역할을 사용하지 않았다면, EC2 인스턴스에 AWS CLI를 설치하고 구성한 후 다음 명령어로 ECR에 로그인해야 합니다.
# AWS CLI 설치 (Amazon Linux 2에는 보통 기본 설치됨)
# sudo yum install aws-cli -y (Amazon Linux)
# sudo apt install awscli -y (Ubuntu)
# AWS CLI 구성 (Access Key/Secret Key 입력)
# aws configure
# ECR 로그인
aws ecr get-login-password --region <REGION> | docker login --username AWS --password-stdin <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com
보안상 IAM 역할을 사용하는 것이 강력히 권장됩니다.
ECR 이미지 가져오기(Pull):
docker pull <REPOSITORY_URI>:<TAG>
예시:
docker pull 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/gemini-discord-bot:latest
Docker 컨테이너 실행: -e 옵션을 사용하여 환경 변수(봇 토큰, API 키)를 주입하고, -d 옵션으로 백그라운드에서 실행합니다. --restart unless-stopped 옵션은 예기치 않게 컨테이너가 종료되거나 서버가 재부팅될 경우 자동으로 컨테이너를 다시 시작해줍니다.
docker run -d \
--name gemini-discord-bot \
-e DISCORD_BOT_TOKEN="여기에_실제_디스코드_봇_토큰_입력" \
-e GOOGLE_API_KEY="여기에_실제_구글_API_키_입력" \
--restart unless-stopped \
<REPOSITORY_URI>:<TAG>
예시:
docker run -d \
--name gemini-discord-bot \
-e DISCORD_BOT_TOKEN="Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-e GOOGLE_API_KEY="AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--restart unless-stopped \
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/gemini-discord-bot:latest
명령어 입력 시 실제 토큰과 키 값으로 바꿔주세요!
컨테이너 실행 상태 확인:
docker ps
gemini-discord-bot 컨테이너가 Up 상태로 표시되는지 확인합니다.
컨테이너 로그 확인: 봇이 정상적으로 시작되었는지, 오류는 없는지 로그를 확인합니다.
docker logs gemini-discord-bot
실시간으로 로그를 보려면 -f 옵션을 추가합니다:
docker logs -f gemini-discord-bot
(로그 보기를 중지하려면 Ctrl + C)
Discord 확인: Discord 서버에서 봇이 온라인 상태인지 확인하고, 정상적으로 작동하는지 테스트합니다.


t2.micro 또는 t3.micro 인스턴스는 월 750시간까지 무료입니다. (한 달 내내 1개의 인스턴스를 실행하기에 충분)git push.docker build ...).docker push ...).docker stop gemini-discord-bot, docker rm gemini-discord-bot).docker pull ...).docker run ...).sudo yum update 또는 sudo apt update && sudo apt upgrade)를 수행하는 것이 좋습니다.