알고리즘을 게임처럼 즐기면서 공부할 수 있도록 도와주는 알고리즘 게임 플랫폼 AlgoSports의 백엔드 저장소입니다.
master
: 실제 배포에 사용되는 브랜치develop
: 개발 및 테스트에 사용되는 브랜치- temporary branches
feat/<branch_name>
:기능 개발을 다루는 branch.bugfix/<branch_name>
: feature에서 발생한 버그를 다루는 branch.hotfix/<branch_name>
: master 브랜치에 바로 반영해야하는 버그를 다루는 branch.
- 가상환경 활성화
python -m venv venv
source venv/bin/activate
- 패키지 설치
pip install -r requirements/local.txt
docker compose -f local.yml up -d
# pytest
docker compose -f local.yml exec -T django coverage run -m pytest
# coverage
docker compose -f local.yml exec -T django coverage run -m pytest
docker compose -f local.yml exec -T django coverage report
아래 명령어를 통해서 사용할 수 있는 명령어 목록을 확인할 수 있습니다.
fab -l
- AWS CLI2 설치
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
- ECS-CLI 설치
sudo curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest sudo chmod +x /usr/local/bin/ecs-cli
- IAM 계정 생성 및 정책 연결
- 생성 후 만들어진 VPC, Subnets을 저장해둬야 합니다.
- key-pair를 먼저 생성하고 key-pair이름을 저장해둡니다.
# 환경변수 설정
AWS_DEFAULT_REGION=ap-northeast-2
CLUSTER_NAME=algo-cluster2
CONFIG_NAME=algo-config
PROFILE_NAME=algo-profile
INSTANCE_SIZE=3
KEY_PAIR=algo-keypair
# 클러스터 및 프로필 설정
ecs-cli configure --cluster $CLUSTER_NAME --region $AWS_DEFAULT_REGION --default-launch-type EC2 --config-name $CONFIG_NAME
ecs-cli configure profile --access-key $AWS_ACCESS_KEY_ID --secret-key $AWS_SECRET_ACCESS_KEY --profile-name $PROFILE_NAME
ecs-cli configure profile default --profile-name $PROFILE_NAME
# user-data 생성 (ecs-cluster에 연결하는 역할)
echo "#!/bin/bash \necho ECS_CLUSTER=jts-cluster >> /etc/ecs/ecs.config" > user_data.sh
# 클러스터 생성
ecs-cli up \
--capability-iam \
--keypair $KEY_PAIR \
--size $INSTANCE_SIZE \
--launch-type EC2 \
--extra-user-data ./aws/user_data.sh
VPC_ID=<Your VPC ID Here>
SG_NAME=algo-sg
# Security group 생성 및 GROUP_ID 저장
SG_GROUP_ID=$(aws ec2 create-security-group \
--group-name "$SG_NAME" \
--description "Security Group for ECS $CLUSTER_NAME" \
--vpc-id $VPC_ID |
jq -r ".GroupId")
aws ec2 authorize-security-group-ingress \
--group-id $SG_GROUP_ID \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0
# ECR 레포지토리 생성
aws ecr create-repository --repository-name django |
jq ".repository | .repositoryUri"
aws ecr create-repository --repository-name nginx |
jq ".repository | .repositoryUri"
# ECR, Docker 로그인
aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $(aws sts get-caller-identity --query Account --output text).dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/
docker-compose -f staging.yml -f production.yml build
docker-compose -f staging.yml -f production.yml push django nginx
# 빈 iam role 생성
aws iam create-role --role-name ecs-instance --assume-role-policy-document file://aws/assume-role.json
# 필요한 정책 추가
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role --role-name ecs-instance
# 인스턴스 프로필 생성
aws iam create-instance-profile --instance-profile-name ecs-instance-profile
# 해당 프로필에 롤 추가
aws iam add-role-to-instance-profile --instance-profile-name ecs-instance-profile --role-name ecs-instance
# instasnce profiles 출력
aws iam list-instance-profiles
CONFIG_NAME=algo-config
PROJECT_NAME=algo-service
ecs-cli compose \
--project-name $PROJECT_NAME \
--file staging.yml \
--file production.yml \
--ecs-params ./aws/ecs-params.yml \
service up \
--create-log-groups \
--cluster-config $CONFIG_NAME \
--container-name nginx \
--container-port 80 \
--target-group-arn arn:aws:elasticloadbalancing:ap-northeast-2:648240308375:targetgroup/target/e3086c4f494a30c4 \
--launch-type EC2
- 문제 상황: AWS에 배포 후 로컬에서는 작동하던 Celery worker들이 Redis를 인식하지 못함
- 해결 방안:
docker-compose.yml
파일에서redis
를links
와depends_on
섹션에 모두 지정하여 문제를 해결함- Celery worker들이 Redis 서비스가 활성화된 후 실행되는 것을 보장함
- 문제 상황: 애플리케이션이 RDS 인스턴스에 연결하지 못함
- 해결 방안:
- 애플리케이션과 RDS 인스턴스가 모두 같은 VPC 내에 있도록 설정함
- 그럼에도 문제가 발생한다면 제대로 연결을 요청하고 있는지 확인이 필요함
entrypoint.sh
에서 내보낸 환경 변수가 적용되지 않았던 것이도 문제였어서 환경 변수를.django
및.postgres
로 분리하기DATABASE_URL
환경 변수를 설정하여 문제를 해결했음
- 문제 상황: Nginx와 Elastic Load Balancer(ELB)를 통해 애플리케이션에 접근하려고 할 때 502 오류 발생
- 해결 방안:
- ECS tasks의 상태가 unhealthy 하여 문제가 발생함
- ELB의 target group의 health check 설정을 변경하거나 nginx에서 200 OK 만을 반환하는 health check 라우트를 만들어 해결