TIL#166 DRF Elastic Beanstalk & Github Action (2)

Dasom·2022년 9월 13일
0

Django

목록 보기
31/34

DRF Elastic Beanstalk & Github Action (1)

  1. [Django] master branch 로 push 하거나 merge될 때 자동으로 beanstalk으로 배포되게 하고 싶었기 때문에 django 파일에도 github action file 을 생성하여 로직을 작성한다.
    • github 이 경로를 인식해야 하기 때문에 파일 구조는 무조건 .github/workflows/deploy.yml 로 생성해야 한다.
name: CI-CD pipeline to AWS
env:
  EB_S3_BUCKET_NAME: ""  # 만들었던 S3 bucket 이름
  EB_APPLICATION_NAME: ""  # 만들었던 Application 이름
  EB_ENVIRONMENT_NAME: "" # 만들었던 환경 이름 / 보통 앱 이름에 -env 형태로 자동 생성
  DEPLOY_PACKAGE_NAME: "django-app-${{ github.sha }}.zip"
  AWS_REGION_NAME: "" # Application이 위치하는 지역 ex) ap-northeast-2

on:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone on our repo
        uses: actions/checkout@v2

      - name: Create zip delployment package
        run: zip -r ${{ env.DEPLOY_PACKAGE_NAME }} ./ -x *.git*

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.aws_access_key_id }}  # github repository secret 에서 access key 로 설정했던 이름
          aws-secret-access-key: ${{ secrets.aws_secret_access_key }}  # github repository secret 에서 access password 로 설정했던 이름
          aws-region: ${{ env.AWS_REGION_NAME }}

      - name: Copying file to S3
        run:  aws s3 cp ${{ env.DEPLOY_PACKAGE_NAME }} s3://${{ env.EB_S3_BUCKET_NAME }}/

      - name: Print message on success finish
        run: echo "CI part finished successfully"

  deploy:
    runs-on: ubuntu-latest
    needs: [build]
    steps:
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.aws_access_key_id }}
          aws-secret-access-key: ${{ secrets.aws_secret_access_key }}
          aws-region: ${{ env.AWS_REGION_NAME }}

      - name: Create new EBL app ver
        run: |
          aws elasticbeanstalk create-application-version \
          --application-name ${{ env.EB_APPLICATION_NAME }} \
          --source-bundle S3Bucket="${{ env.EB_S3_BUCKET_NAME }}",S3Key="${{ env.DEPLOY_PACKAGE_NAME }}" \
          --version-label "${{ github.sha }}"

      - name: Deploy new app
        run: aws elasticbeanstalk update-environment --environment-name ${{ env.EB_ENVIRONMENT_NAME }} --version-label "${{ github.sha }}"
      - name: Print message on success finish
        run: echo "CD part finished successfully"
  1. [ Django ] elastic beanstalk 의 설정을 위해 파일을 생성한다.
    • .ebextensions/django.config 파일을 생성한다.
    • 프로젝트에 맞는 설정들을 추가하거나 삭제하면 된다.
packages:
  yum:
    python3-devel: []
    mariadb-devel: []  # mariadb 로 진행되는 프로젝트여서 beanstalk db 환경을 mysql 선택(mariadb 없음) 후 해당 패키지를 설치하여 mariadb 사용

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: configs.wsgi:application  # 프로젝트의 설정 파일 경로
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: configs.settings  # 세팅 파일 위치
    "PYTHONPATH": "/var/app/current:$PYTHONPATH"
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: static

container_commands:
  01_migrate:
    command: "/var/app/venv/*/bin/python3 manage.py migrate"
    leader_only: true
    ignoreErrors: true
  02_collectstatic:
    command: "/var/app/venv/*/bin/python3 manage.py collectstatic --noinput"
  1. [ AWS ] 환경 설정 및 데이터베이스 생성
    1) elastic beanstalk 에서 해당 환경으로 들어간 후 좌측탭의 구성을 클릭한다.
    2) 첫번째 카테고리인 소프트웨어의 편집을 클릭한다.
    3) 아래편의 환경속성에서 이름과 값에 django의 .env 파일안의 이름과 값들을 매칭시켜서 작성한다.(단, 이름에는 무조건 영대문자와 '-'이 아닌 '_'을 사용하여야 함)
    4) SECURE_SSL_REDIRECT=true 도 추가한 후 저장한다.
    5) 구성의 가장 아래에 데이터베이스 생성을 선택 후 프로젝트에 맞는 설정들을 선택 후 데이터베이스를 생성한다.

  2. [ Django ] ALLOWED_HOSTS 를 설정한다.

    • settings.py에서 ALLOWED_HOSTS=['빈스톡주소'] 를 설정하면 된다.

    • 하지만 내가 진행하는 프로젝트는 로드밸런서를 연결하였기 때문에 저거로는 완전하게 동작이 되지 않았다.

    • 로드 밸런서가 ec2를 여러개 생성하면서 여러가지 ip들이 생겨났고 그 ip들을 장고에 일일히 추가할 수 없었다. 백엔드 배포이기에 접속 IP는 프론트 엔드 IP밖에 없어서 로드밸런서에서 접속 ip를 제한하였고 장고에서는 ALLOWED_HOSTS=['*'] 로 설정하였다.

  3. [ AWS ] Load Balancer IP 제한
    1) EC2로 들어가 좌측 탭에서 네트워크 및 보안의 보안그룹으로 들어간다.
    2) 해당 EC2가 가지고 있는 보안그룹들 이름 중에 EBLoadBalancerSecurityGroup이 들어간 보안 그룹을 클릭한다.
    3) 인바운드 규칙을 편집해 허용 IP를 제한한다.

이렇게 하면 정상적으로 빈스톡에 배포가 완료된다👏

profile
개발자꿈나무🌲

0개의 댓글