Search
🛫

배포 시스템 구축(feat. Azure, Django)

가. Static file 설정

1) set storage in django

필요한 패키지 설치
장고앱에 azure container 정의
장고 앱과 azure container 연동

2) Azure Storage 계정 설정

다음과 같은 옵션으로 storage 계정 설정
static, media container 생성
→ 엑세스 수준을 private이 아니라 blob으로 설정해야 함
access key와 access name 확인
access key는 키 표시 활성화에 따라 확인 가능
access name은 002sns

3) upload static in azure storage

임시로 settings/prod에 환경변수값 설정
AZURE_ACCOUNT_NAME = "sns01storage" AZURE_ACCOUNT_KEY = "123mmkn,.;22211"
JavaScript
복사
정적 파일을 모두 집계하여 azure storage로 업로드 명령
→ settings.dev가 아니라 prod 설정을 바탕으로 작업 필요
python manage.py collectstatic --settings=backend.settings.prod

나. Build with Docker

1) add Dockerfile

docker image 생성 시 불필요한 파일을 .dockerignore 파일 내 명시
Dockerfile 작성
→ 버퍼 설정
PYTHONUNBUFFERED=1
→ runserver가 아니라 웹 어플리케이션 서버(gunicorn)을 통해 실행되도록 설정
CMD ["gunicorn", "backend.wsgi:application", "--bind", "0.0.0.0:80"]

2) Test Build & Run

docker image build
→ docker build -t <project> <상대경로>
docker build -t djangosns .
docker run with that image
→ 환경변수 직접 지정에 따른 이미지 실행
docker run --rm --publish 9999:80 -e DJANGO_SETTINGS_MODULE=backend.settings.prod -e AZURE_ACCOUNT_NAME=<account_name> -e AZURE_ACCOUNT_KEY=<account_key> -e ALLOWED_HOSTS=localhost <docker-image-name>
브라우저에 다음과 같이 입력 시 아래와 같이 admin 페이지가 정상 출력여부 확인
→ 정상 출력 화면
→ 만약 400 bad request 이슈가 발생했다면 ALLOWED_HOSTS 환경변수 설정을 settings/prod.py에 안해줬거나 환경변수 주입을 localhost를 넣지 않았기 때문이다
→ ALLOWED_HOSTS 변수를 스트링을 자른 리스트로 받을 경우, 변수 양끝의 큰 따옴표는 생략해야 한다
ex) 환경변수를 다음과 같이 정의했다면 ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(","), 환경변수 주입은 아래와 같이 전달해야 한다
ALLOWED_HOSTS=localhost,127.0.0.1,disease-pest-alarming.azurewebsites.net

다. Link with RDB

1) 기본 설정

테스트 목적의 RDB일 경우, 단일서버의 저렴한 정책 권장
서비스별로 resource group을 하나로 통일하면 관리면에서 편리함
RDB에서 현재 IP에 대한 접근 허용(방화벽 정책 설정)
SSL 연결 적용에 대해 ‘사용 안함' 옵션 선택
(중요!) Azure 서비스 시, 유연한 서버 또는 유동 서버를 활용해서 rdb client 서비스와 연동 가능

2) DB 재설정

3) Docker 작업

docker 이미지 실행
→ prod 설정값을 환경변수로 전달하여 실행
docker run --rm --publish 9999:80 -e DJANGO_SETTINGS_MODULE=backend.settings.prod -e AZURE_ACCOUNT_NAME="sns21storage" -e AZURE_ACCOUNT_KEY="12322222" -e ALLOWED_HOSTS=localhost -e DB_HOST="sns021rdb.postgres.database.azure.com" -e DB_USER="sns21@sns021rdb" -e DB_PASSWORD="111" -e DB_NAME="postgres" -it djangosns sh
배포 환경의 설정값으로 migration 파일 확인
python3 manage.py showmigrations
배포 환경의 설정값을 기준으로 migrate 명령 실행
python3 manage.py migrate
superuser 재생성(azure RDB 상에 superuser 등록)
python3 manage.py createsuperuser
docker 이미지 재실행하여 superuser 정상동작여부 확인
docker run --rm --publish 9999:80 -e DJANGO_SETTINGS_MODULE=backend.settings.prod -e AZURE_ACCOUNT_NAME="sns21storage" -e AZURE_ACCOUNT_KEY="12322222" -e ALLOWED_HOSTS=localhost -e DB_HOST="sns021rdb.postgres.database.azure.com" -e DB_USER="sns21@sns021rdb" -e DB_PASSWORD="111" -e DB_NAME="postgres" djangosns
→ superuser로 admin 로그인 가능여부에 따라 RDB 연동 성공여부 판단

참고) MySQL RDB 설정

Mysql client 설치 이슈
→ linux 전역에 MySQL development headers and libraries 설치
→ pip package로 mysqlclient 가상 설치
connection refused issue
→ SSL 연결 사용 안함

라. Deploy with Azure PaaS

1) Docker Image Push

docker image에 tag 붙이기
→ docker tag <image-name> <image-tag>
docker tag djangosns gentlemj/sns:1.0
docker hub login
docker login
→ ID: gentlemj, PW: Dr**@******
docker image push
→ docker push <image-tag>
docker push gentlemj/sns:1.0

2) Azure App Service 활용

App Service 인스턴스 정보 설정
App Service 요금제 설정
→ 테스트용 인스턴스의 요금제는 ‘크기 변경'을 통해 무료 F1으로 변경 권장(비용 절감)
App Service에서 Docker 이미지 설정
→ Docker Hub 내 push된 이미지 정보를 참고하여 이미지 및 태그란 기입
→ (!주의사항!) Docker Image 변경된 것을 서비스에 반영시 App Service에서 다음의 입력란에 변경사항을 적용해야 함
→ Docker Swarm 또는 CLI 지원 툴을 활용하면 쉽게 작업 가능
→ Docker Hub 내 이미지

3) 환경변수 설정

APP Service - Settings - Configuration - New application setting에서 환경변수 주입
ALLOWED HOST 값 변경(localhost → azure app service)
→ app service url 확인

4) RDB 방화벽 정책 수정

Azure app service의 virtual IP, outbound IP 등을 Azure Database의 방화벽 정책에서 허용
→ Azure Database의 방화벽 정책에서 방화벽 규칙에 App Service의 IP 접근 허용
→ Azure 서비스 방문허용을 ‘예'로 선택할 것
→ App Service의 속성 카테고리에서 가상 IP 주소, 아웃바운드 IP 주소 확인
설정 결과
ADMIN 페이지에서 로그인 시도 시 500에러 발생 시 RDB 정상 연동여부를 확인해야 함
→ 주로 원인은 방화벽에 있음
→ 그래도 500에러가 발생한다면 Azure 서비스 방문 허용여부 확인해볼 것(예로 설정해야 함)
400에러 발생 시 ALLOWD HOST 환경설정값 이슈 의심해볼 것
→ ALLOWD HOST를 *로 설정 후 테스트해볼 것

Reference