가. 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
•