본문 바로가기

django/정리

AWS 배포(2) - EC2, RDS, github action

저번에 이어서 배포 준비하기~~

로컬이 아닌 서버에서 돌아가는 파일은 github actions가 실행시켜준다. pr할때마다 action이 새로 실행된다.

수정한 코드를 쉽게 반영할 수 있어서 편리하다..!


# deploy.yml

  • .github/workflows/deploy.yml
  • github actions가 실행시켜준다.
name: Deploy to EC2

on:
  push:
    branches:
      - dev

jobs:

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    - name: checkout
      uses: actions/checkout@master

    - name: create env file
      run: |
        touch .env
        echo "${{ secrets.ENV_VARS }}" >> .env

    - name: create remote directory
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ubuntu
        key: ${{ secrets.KEY }}
        script: mkdir -p /home/ubuntu/srv/ubuntu

    - name: copy source via ssh key
      uses: burnett01/rsync-deployments@4.1
      with:
        switches: -avzr --delete
        remote_path: /home/ubuntu/srv/ubuntu/
        remote_host: ${{ secrets.HOST }}
        remote_user: ubuntu
        remote_key: ${{ secrets.KEY }}

    - name: executing remote ssh commands using password
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ubuntu
        key: ${{ secrets.KEY }}
        script: |
          sh /home/ubuntu/srv/ubuntu/config/scripts/deploy.sh
  • dev branch에 있는 코드를 실행한다.
  • 중간에 있는 secrests 변수들은 github에서 설정해준다. (.env.prod 파일을 만들거라 나중에)
  • 마지막줄 sh/home/ubuntu/srv/ubuntu/config/scripts/deploy.sh를 통해 프로젝트 내 config/scripts/deploy.sh를 실행시킨다. .sh는 linux 계열의 shell script 확장자인데, 호환성이 좋다. 
  • deploy.sh에서는 docker와 docker-compose를 깔아준다.
  • 그리고 마지막에 sudo docker-compose -f /home/ubuntu/srv/ubuntu/docker-compose.prod.yml up --build -d을 실행해준다.  -d는 background에서 서버가 계속 돌아가도록 하는 역할

# EC2

  • 이전에 프리티어 계정이 끝나 비용이 청구되었던 아픈 경험이...있기 때문에 새로운 프리티어 계정을 만들어주었다.
  • console에서 EC2검색 후 인스턴트 시작하기
  • 이름은 암거나 하고...서버를 선택해준다.

ubuntu

  • 서버는 다양하게 있다. linux 계열의 여러 서버들과 윈도우서버.
  • 근데 가장 호환성 좋고 저렴하고..뭐 여러 이유로 Ubuntu를 많이 사용하는 듯??
  • 공부하면서 알았는데 linux의 다른 버전인 unix는 이제 뒤쳐지고...linux(특히 ubuntu)가 서버에서 가장 인기가 많다. 

micro

  • 인스턴스 유형은 일단 프리 티어 선택.
  • 학생 수준의 프로젝트에서 micro말고 더 큰 인스턴스를 쓸 일은 별로 없다...
  • 이전에 학교 축제 사이트 만들 때는 동접자 2-300명 생각하고 medium으로 했었다. 중간에 터져서 large로 바꾸고 별 짓을 다했지만...인스턴스 문제는 아니였음.🥲🥲
  • 키 페어를 만들어준다. 연결을 위한 공인인증서 느낌...없으면 새 키 페어를 생성해준다. 다만 여기서만 다운이 가능하니 반드시 다운 받아서 저장해주기.

보안그룹

  • 보안그룹에서는 ip주소와 port 허용을 설정한다.
  • 이전에 만들어둔게 있으면 그걸 사용하고, 없으면 새로 만든다. 어짜피 나중에 규칙수정 가능함.
  • 여기까지 한 후 인스턴트 생성. 인스턴트를 선택하면 관련된 여러 정보들이 나온다.
  • 인스턴스의 주소는 재부팅할 때마다 바뀌는데, 이와 관련하여 탄력적ip(고정 ip)를 설정할 수 있다.

# RDS

  • 애증의 RDS...자세히 안보면 실수할 수 있다. 이거땜에 몇주를 고생했음.

mysql

  • 나는 mysql database를 설정했으므로 mysql선택.
  • 템플릿은 프리 티어로 설정해준다.

암호기억하기!!

  • 식별자, 이름, 암호 모두 필요하니 기억해두자.
  • 인스턴스는 micro, 스토리지는 20GiB. 이때 스토리지 자동활성화는 해제해준다!
  • 연결은 default값으로 둔다. 다만 퍼블릭 액세스는 예로 바꾸기
  • 보안그룹은 EC2에서 사용한 것이랑 같은걸로 선택하고 생성해주었다.
  • 추가구성에서 이름을 설정하고 파라미터 그룹의 이름을 확인한다. 파라미터 그룹은 새로 만들어줄 건데 여기서 선택된 default 그룹을 그냥 수정하기만 해도 된다.

파라미터 그룹

  • 파라미터 그룹을 수정하거나 생성해준다.

파라미터 설정

  • 수정할 파라미터 그룹을 선택 후 파라미터 그룹 편집 선택
  • time_zone의 값을 Asia/Seoul로 바꾼 뒤 재설정해준다.
  • 위와 마찬가지로 아래의 값들을 utf8mb4로 수정
    • character_set_client
    • character_set_connection
    • character_set_database
    • character_set_filesystem
    • character_set_results
    • character_set_server
  • 아래의 값들은 utf8mb4_general_ci로 수정
    • collation_connection
    • collation_server
  • 전부 완료하면 변경사항 저장

파라미터 그룹 수정

  • 아까 만든 RDS를 선택 후 수정해서 파라미터 그룹을 설정해둔 그룹으로 바꿔준다.
  • 이제 서버와 데이터베이스를 만들었으니 내 프로젝트와 연결만 해주자

# 연결하기

  • 내 프로젝트의 최상위폴더 안에 .env.prod를 만들어준다.
DATABASE_HOST={RDS db 주소}
DATABASE_DB=mysql
DATABASE_NAME={RDS 기본 database 이름}
DATABASE_USER={RDS User 이름}
DATABASE_PASSWORD={RDS master 비밀번호}
DATABASE_PORT=3306
DEBUG=False
DJANGO_ALLOWED_HOSTS={EC2 서버 ip 주소}
DJANGO_SECRET_KEY={django secret key}
  • 아까 만든 EC2와 RDS의 정보를 넣어준다.
  • RDS의 db 주소는 엔드포인트의 주소, EC2 서버 ip주소는 퍼블릭 DNS주소를 넣어준다. 만약 탄력적 ip를 설정해주었다면 DJANGO_ALLOWED_HOSTS=* 로 작성
  • 참고로 .env.prod는 .gitinore에 없어 github에 그대로 올라가게 된다(!) 반드시 .gitinore에 적어주자.

# github actions

  • 이제 진짜 마지막...
  • 프로젝트를 올리는 레포지토리의 settings -> Secrets and variables (Security) -> Actions -> New repository secret

보이면 안되는 값들

  • ENV_VARS : .env.prod값 전체 복붙
  • HOST : 배포할 EC2서버의 퍼블릭 DNS 주소. 만약 탄력적 IP를 설정했으면 그 주소를 적어준다.
  • KEY : EC2서버로 접근하기 위한 ssh 키페어(.pem)
    • cmd에서 키페어가 있는 주소로 이동 후 type (키페어 이름).pem으로 값을 알 수 있다.
    • ----까지 모두 복사해준다.
    • mac은 type 대신 cat 🐱
  • 전부 해주었으면 dev branch에 내가 만든 프로젝트를 push해주기!!
  • 새롭게 push할때마다 actions가 돌아간다.

내 로그들
당연하지만 이렇게 보인다...어짜피 백엔드니까^^

  • 이제 선택이긴 하지만...https설정과 domain 연결이 남았다!
  • 그리고 내가 겪었던 오류와 window에서 ssh 연결하는 방법도 정리해야겠다.

# 참고

 

AWS RDS(mySql) 프리티어 생성하기

AWS 프리티어 뽕 뽑으려면 DB까지,,,💫

velog.io