DRF Elastic Beanstalk & Github Action (1)
.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"
.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"
[ AWS ] 환경 설정 및 데이터베이스 생성
1) elastic beanstalk 에서 해당 환경으로 들어간 후 좌측탭의 구성을 클릭한다.
2) 첫번째 카테고리인 소프트웨어의 편집을 클릭한다.
3) 아래편의 환경속성에서 이름과 값에 django의 .env 파일안의 이름과 값들을 매칭시켜서 작성한다.(단, 이름에는 무조건 영대문자와 '-'이 아닌 '_'을 사용하여야 함)
4) SECURE_SSL_REDIRECT=true 도 추가한 후 저장한다.
5) 구성의 가장 아래에 데이터베이스 생성을 선택 후 프로젝트에 맞는 설정들을 선택 후 데이터베이스를 생성한다.
[ Django ] ALLOWED_HOSTS 를 설정한다.
settings.py에서 ALLOWED_HOSTS=['빈스톡주소']
를 설정하면 된다.
하지만 내가 진행하는 프로젝트는 로드밸런서를 연결하였기 때문에 저거로는 완전하게 동작이 되지 않았다.
로드 밸런서가 ec2를 여러개 생성하면서 여러가지 ip들이 생겨났고 그 ip들을 장고에 일일히 추가할 수 없었다. 백엔드 배포이기에 접속 IP는 프론트 엔드 IP밖에 없어서 로드밸런서에서 접속 ip를 제한하였고 장고에서는 ALLOWED_HOSTS=['*']
로 설정하였다.
[ AWS ] Load Balancer IP 제한
1) EC2로 들어가 좌측 탭에서 네트워크 및 보안의 보안그룹으로 들어간다.
2) 해당 EC2가 가지고 있는 보안그룹들 이름 중에 EBLoadBalancerSecurityGroup
이 들어간 보안 그룹을 클릭한다.
3) 인바운드 규칙을 편집해 허용 IP를 제한한다.
이렇게 하면 정상적으로 빈스톡에 배포가 완료된다👏