연습 겸 실제 서비스를 AWS에 배포해봤으며 그 과정을 메모 겸 간략하게 정리했다.

로컬

큰 순서 틀

  • db 올리기 (DB 접속하기 : psql -U 유저이름 -d DB이름)

  • init 올리고 컨테이너 들어가서 Flask CLI로 DB 설정해주기 (Readme.md)

    • flask manager add (유저이름) (패스워드) = 로그인페이지 admin
  • 프론트 백 Traefik 설정해주고 올리기

    • docker-compose.yaml 수정
     labels:
          - traefik.frontend.rule=Host:요청을 받을 url (CNAME)
          - traefik.port=요청 url에 대한 포트
          - traefik.enable=true
          - traefik.frontend.entryPoints=http (여기선 http)
          #- traefik.backend=~~ 없어도 동작. 이름 명명
    • traefik.toml 수정
    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)

AWS

  • db 올리기 -> RDS 설정

    • dev.toml
    ...
    [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)

    • flask db upgrade, flask manager add '' '' 까지만 (위에 리커버리에서 나머지 수행)
  • S3 & cloudfront 설정

    • environment에 APIHost/cloudfront 설정, angular.json에 추가
    • dev.toml
    ...
    [asset]
    host = '' #cloudfront
    ...
  • 프론트 백 Traefik 설정해주고 이미지 빌드하기 -> ECR 생성하고 ECS에 올리기

    • 프론트 prod 빌드 (./front-build build-prod)
    #!/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 수정

      • traefik, depends_on 설정 제거 (ECS에서 추가)
      • redis, worker 등 로컬에서 빌드가 필요하지 않은 부분 제거 (ECS에서 추가)
      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로 이미지 실행하기

      • ECS 클러스터 만들기
      • ECS 컨테이너 인스턴스 생성
      • 가비아 DNS 설정 (A, CNAME:cms, manager)
      • 컨테이너 인스턴스에서 DB(RDS) 연결 확인 (EC2에 로그인해서 RDS에 접근이 되는지)
      • CONFIG FILE 전달 (fileReceive.sh -> scp 명령어)
      #!/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 ..
      • CONFIG FILE 경로 수정 (pdf 참고)
      • 작업 생성, ECS 서비스 생성, 작업 실행 (이전 성공한 서비스 참고해서 설정하기)

이슈 트래커

No space left on device 에러

도커 시스템 캐시가 꽉 차서 실행이 안되는 에러였다.

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

https 관련 접속 불가

traefik에서 자동으로 생성해주는 ssl이 가끔 깨진다고 한다.
/opt/letsencrypt/acme.json 확인

백엔드 꺼지는 503, Worker ~ 에러

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)
작업에서 이미지 버전 태그 수정한 새 작업 등록
서비스 업데이트
기존 작업 중지

.sh파일 실행파일로 변환하기

mv a.sh a (이름 바꾸기)
chmod 755 a
실행: ./a


갑자기 한번에 Traefik, ECS, ECR, RDS, S3, Cloudfront 등등 많은 기술들을 접하게 됐지만 하나하나 따라가보니 신기하고 재밌었다. 하지만 베이스 지식은 튼튼히 해야겠다.

profile
백엔드 개발자

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN