빠르게 배포하고 빠르게 시작할 수 있는 프로젝트
Production 배포와 관련된 파일을 배치해 놓는 폴더이다.
- gunicorn
- nginx
- docker
- docker-compose
- ecs-config
테스트 및 Django 실행과 관련된 파일을 배치해 놓는 폴더이다.
- pipenv
- pytest
- flake8
- pylint
- isort
Django APP 을 실행하는데 필요한 앱과 설정을 둔 폴더이다.
- django-secrets
- Django Secret 중앙관리 라이브러리
- Secret을 로컬에서 관리할 필요가 전혀 없다!
- Custom User Model
- S3
- Sentry
- pytest
- flake8
- pylint
- isort
- black
아래 내용을 모두 채우고 일반 텍스트
로 붙여넣어 사용한다.
{
"django-base": {
"base": {},
"dev": {
"DJANGO_SECRET_KEY": "<CUSTOM_SECRET>"
},
"production": {
"DJANGO_SECRET_KEY": "<CUSTOM_SECRET>",
"ALLOWED_HOSTS": [
"*"
],
"DATABASE_ENGINE": "<DATABASE_ENGINE>",
"DATABASE_URL": "<DATABASE_URL>",
"DATABASE_NAME": "<DATABASE_NAME>",
"DATABASE_USER": "<DATABASE_USER>",
"DATABASE_PASSWORD": "<DATABASE_PASSWORD>",
"DATABASE_PORT": "<DATABASE_PORT>",
"DJANGO_AWS_ACCESS_KEY_ID": "<DJANGO_AWS_ACCESS_KEY_ID>",
"DJANGO_AWS_SECRET_ACCESS_KEY": "<DJANGO_AWS_SECRET_ACCESS_KEY>",
"DJANGO_AWS_STORAGE_BUCKET_NAME": "<DJANGO_AWS_STORAGE_BUCKET_NAME>",
"SENTRY_DSN": "<SENTRY_DSN>"
}
}
}
1-4-1. Secrets을 사용하기 위한 사용자
사용자를 만들 때 SecretsManagerReadWrite
권한을 주고 만든다.
[<SECRET_MANAGER_NAME>]
aws_access_key_id=<SECRET_MANAGER_ACCESS_KEY>
aws_secret_access_key=<SECRET_MANAGER_SECRET_ACCESS_KEY>
1-4-2. S3를 사용하기 위한 사용자
사용자를 만들 때 AmazonS3FullAccess
권한을 주고 만든다.
여기서 나온 KEY들은 Secrets-Manager에 채워 넣는다.
- django-secrets-manager 를 사용하기 위해 Secret name과
.aws/credentials
에 등록한 profile label을 등록해주어야한다.
# ENVIRON
# ------------------------------------------------------------------------------
# https://github.com/LeeHanYeong/django-aws-secrets-manager
AWS_SECRETS_MANAGER_SECRETS_NAME = "<SECRET_MANAGER_NAME>"
AWS_SECRETS_MANAGER_PROFILE = "<SECRET_MANAGER_CREDENTIALS_PROFILE>"
- django-secrets-manager에서 사용할 Environment를 설정해준다. (현재 프로젝트에서는 dev, production을 사용함)
# ENVIRON
# ------------------------------------------------------------------------------
# https://github.com/LeeHanYeong/django-aws-secrets-manager
AWS_SECRETS_MANAGER_SECRETS_SECTION = "<SECRETS_DEV_SECTION>"
- Sample
AWS_SECRETS_MANAGER_SECRETS_SECTION = "django-base:dev"
- django-secrets-manager에서 사용할 Environment를 설정해준다. (현재 프로젝트에서는 dev, production을 사용함)
# ENVIRON
# ------------------------------------------------------------------------------
# https://github.com/LeeHanYeong/django-aws-secrets-manager
AWS_SECRETS_MANAGER_SECRETS_SECTION = "<SECRETS_PRODUCTION_SECTION>"
- Sample
AWS_SECRETS_MANAGER_SECRETS_SECTION = "django-base:production"
여기까지 왔으면 Django가 실행되는지 확인해보기위해 sources/
로 이동해서 코드가 잘 동작하는지 tox를 실행해본다.
이번에는 sources/app
으로 들어와서 ./manage.py runserver
를 실행해본다.
이번에는 아래 명령으로 production 환경으로 바꿔준 후 ./manage.py runserver
를 실행해본다.
export DJANGO_SETTINGS_MODULE=config.settings.production
Dockerfile,
nginx/Dockerfile` 두 파일을 build 및 Push 후 아래 내용을 작성한다.
services:
...
nginx:
...
image: <niginx/Dockerfile의 본인이 사용할 DockerImage의 이름을 적는다.>
web:
...
image: <본인이 사용할 DockerImage의 이름을 적는다.>
services:
...
nginx:
...
logging:
...
options:
awslogs-group: <web과 같은 그룹을 지정하거나 자유롭게 지정해도 좋다.>
...
awslogs-stream-prefix: <본인이 nginx를 알아차릴 수 있을만한 Prefix를 지정한다.>
web:
...
logging:
...
options:
awslogs-group: <nginx와 같은 그룹을 지정하거나 자유롭게 지정해도 좋다.>
...
awslogs-stream-prefix: <본인이 web임을 알아차릴 수 있을만한 Prefix를 지정한다.>
nginx, gunicorn이 설정되어 있지 않고 직접 Docker에 들어가서 runserver로 확인할 수 있다.
docker run -it -v $HOME/.aws/credentials:/root/.aws/credentials <DOCKER_FILE_NAME> /bin/bash
실제 서비스환경과 동일하게 실행할 수 있다.
docker-compose up
docker-compose.prod.yml 에 aws logging 설정을 붙여서 실행해줄 수 있다.
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
- ecsTaskExecutionRole 생성
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy 에 Attach
# 클러스터 생성
ecs-cli configure --cluster <Cluster 이름> --default-launch-type EC2 --region ap-northeast-2
- IAMFullAccess
- AmazonECS_FullAccess
- AmazonSSMFullAccess
# 배포!
ecs-cli compose --file docker-compose.yml --file docker-compose.prod.yml --project-name <Task 이름> up
AWS Credentials와 LoadBalancer가 필요해진다. LoadBalaner와 Target 그룹을 생성
ecs-cli compose --file docker-compose.yml --file docker-compose.prod.yml --project-name <Task 이름> service create --target-group-arn <Target GroupARN> --container-name nginx --container-port 443
ecs-cli compose --file docker-compose.yml --file docker-compose.prod.yml --project-name <Task 이름> service up
ecs-cli compose --file docker-compose.yml --file docker-compose.prod.yml --project-name <Task 이름> service up --force-update
- 배포 최종 목적지에 도달했다. 블로그 포스팅하자