[AWS] 실제 서비스 AWS에 배포하기 (메모장)

루나·2022년 8월 1일
0

연습 겸 실제 서비스를 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개의 댓글