연습 겸 실제 서비스를 AWS에 배포해봤으며 그 과정을 메모 겸 간략하게 정리했다.
큰 순서 틀
db 올리기 (DB 접속하기 : psql -U 유저이름 -d DB이름)
init 올리고 컨테이너 들어가서 Flask CLI로 DB 설정해주기 (Readme.md)
프론트 백 Traefik 설정해주고 올리기
labels:
- traefik.frontend.rule=Host:요청을 받을 url (CNAME)
- traefik.port=요청 url에 대한 포트
- traefik.enable=true
- traefik.frontend.entryPoints=http (여기선 http)
#- traefik.backend=~~ 없어도 동작. 이름 명명
logLevel = "INFO"
[api]
entryPoint = "dashboard"
dashboard = true
debug = true
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoint.dashboard]
address = ":8080"
[docker]
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = true
usebindportip = true
domain = 메인 도메인 (A)
db 올리기 -> RDS 설정
...
[database]
connector = 'postgresql'
host = '' #RDS 호스트
port = 5432
user = '' #RDS에서 적은거
password = '' #RDS에서 적은거
name = ''
...
Postgres DB 리커버리
recovery.sh
#!/bin/bash
cd dbcommand
USER=
PASSWORD=
HOST_URL=
DB=
DB_HOST=postgresql://${USER}:${PASSWORD}@${HOST_URL}/${DB}
BACKUP_FILE=~.sql
psql -f ${BACKUP_FILE} ${DB_HOST}
cd ..
init 올리고 컨테이너 들어가서 Flask CLI로 DB 설정해주기 (Readme.md)
S3 & cloudfront 설정
...
[asset]
host = '' #cloudfront
...
프론트 백 Traefik 설정해주고 이미지 빌드하기 -> ECR 생성하고 ECS에 올리기
#!/bin/bash
cd cms-front
if [ "${1}" == "build-prod" ]
then
ng build -c ...-prod;
elif [ "${1}" == "build-dev" ]
then
ng build -c ...-develop;
elif [ "${1}" == "serve" ]
then
ng serve -c ...-develop;
fi
cd ..
ECR 생성
ECR_HOST=
REPOSITORY_PREFIX=
FRONT=front:1.0.1
BACK=back:1.0.0
REGION=ap-northeast-2
docker-compose.yaml 수정
version: '3.2'
volumes:
media-persist: {}
redis-persist: {}
services:
cms-back:
image: ${ECR_HOST}/${REPOSITORY_PREFIX}${BACK}
build: ./cms-back
container_name: cms-back
volumes:
- media-persist:/tmp
- ./config:/etc/app:ro
ports:
- "5000:5000"
environment:
- FLASK_APP=application/bootstrap.py
- FLASK_ENV=development
- CONFIG_FILE=/etc/app/service.toml
cms-front:
image: ${ECR_HOST}/${REPOSITORY_PREFIX}${FRONT}
build: ./cms-front
container_name: cms-front
ports:
- "8001:80"
ECR에 이미지 푸시 ECRPush.sh (호스트에서 AWS CLI을 사용해 docker-compose push)
#!/bin/bash
source .env;
if [ "${1}" == "init" ]
then
docker-compose -f docker-compose-init.yaml up --build
elif [ "${1}" == "push" ]
then
docker-compose --env-file=.env build;
aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin "$ECR_HOST"
docker-compose push
fi
ECS로 이미지 실행하기
#!/bin/bash
cd config
SERVICE_CONFIG=service.toml
TRAEFIK_CONFIG=traefik.toml
GUNICORN_CONFIG=gunicorn-config.py
CELERY_CONFIG=celeryconfig.py
EC2_HOST=~~
scp -i ~~.pem ${GUNICORN_CONFIG} ${SERVICE_CONFIG} ${TRAEFIK_CONFIG} ${CELERY_CONFIG} ${EC2_HOST}:~
cd ..
도커 시스템 캐시가 꽉 차서 실행이 안되는 에러였다.
docker system prune #해결
docker volume prune
#To see all volumes
docker volume ls
#To show docker disk usage
docker system df
참고 : https://blockchainstudy.tistory.com/59
traefik에서 자동으로 생성해주는 ssl이 가끔 깨진다고 한다.
/opt/letsencrypt/acme.json 확인
werkzeug.exceptions.ServiceUnavailable: 503 Service Unavailable: The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
{/usr/src/app/application/controllers/registry.py:46} ERROR - /registry: base data not found. run flask init device
docker-compose-init.yaml 작업을 안했을 때 발생하는 에러였다. Readme에 적혀있는 작업을 꼭 하자...
front 빌드 (front-build build-prod)
.env 버전 태그 바꾸기
이미지 푸시 (. command.sh push)
작업에서 이미지 버전 태그 수정한 새 작업 등록
서비스 업데이트
기존 작업 중지
mv a.sh a (이름 바꾸기)
chmod 755 a
실행: ./a
갑자기 한번에 Traefik, ECS, ECR, RDS, S3, Cloudfront 등등 많은 기술들을 접하게 됐지만 하나하나 따라가보니 신기하고 재밌었다. 하지만 베이스 지식은 튼튼히 해야겠다.