Azure에서 PostgreSQL을 사용하여 Python(Django 또는 Flask) 웹앱 배포

이 자습서에서는 Azure Database for PostgreSQL 관계형 데이터베이스 서비스를 사용하여 데이터 기반 Python 웹앱(Django 또는 Flask)을 배포합니다. Python 앱은 Linux 서버 환경에서 Python 3.7 이상을 지원하는 완전 관리형 Azure App Service에서 호스트됩니다. 나중에 언제든지 스케일 업할 수 있는 기본 가격 책정 계층으로 시작할 수 있습니다.

An architecture diagram showing an App Service with a PostgreSQL database in Azure.

이 자습서를 완료하려면 다음이 필요합니다.

1 - 샘플 애플리케이션

제공된 Flask 및 Django 프레임워크를 사용하는 샘플 Python 애플리케이션은 이 자습서를 따라가는 데 도움이 됩니다. 샘플 애플리케이션 중 하나를 다운로드하거나 로컬 워크스테이션에 복제합니다.

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app

애플리케이션을 로컬로 실행하려면 애플리케이션 폴더로 이동합니다.

cd msdocs-flask-postgresql-sample-app

앱에 대한 가상 환경을 만듭니다.

py -m venv .venv
.venv/scripts/activate

종속성을 설치합니다.

pip install -r requirements.txt

참고

이 자습서를 사용자 고유의 앱과 함께 사용하는 경우 각 프로젝트의 README.md 파일(Flask, Django)에서 requirements.txt 파일 설명을 확인하여 필요한 패키지를 확인하세요.

환경 변수를 설정하여 로컬 PostgreSQL 인스턴스에 연결하는 방법을 지정합니다.

이 샘플 애플리케이션에는 로컬 PostgreSQL 인스턴스에 연결하는 방법을 설명하는 .env 파일이 필요합니다. .env.sample 파일을 가이드로 사용하여 .env 파일을 만듭니다. DBNAME의 값을 로컬 PostgreSQL 인스턴스의 기존 데이터베이스 이름으로 설정합니다. 이 자습서에서는 데이터베이스 이름이 식당이라고 가정합니다. DBHOST, DBUSER, DBPASS의 값을 로컬 PostgreSQL 인스턴스에 적절하게 설정합니다.

Django의 경우 settings.py 파일의 주석에 있는 지침에 따라 PostgreSQL 대신 로컬로 SQLite를 사용할 수 있습니다.

restaurantreview 데이터베이스 테이블을 만듭니다.

flask db init
flask db migrate -m "initial migration"

앱을 실행합니다.

flask run

웹 브라우저에서 http://localhost:5000의 샘플 애플리케이션으로 이동하여 일부 식당 및 식당 리뷰를 추가하여 앱의 작동 방식을 확인합니다.

A screenshot of the Flask web app with PostgreSQL running locally showing restaurants and restaurant reviews.

Django를 사용하면 일반적인 Django 앱과 python manage.py createsuperuser 같은 명령을 사용하여 사용자를 만들 수 있습니다. 자세한 내용은 django django-admin 및 manage.py에 대한 설명서를 참조하세요. 슈퍼 사용자 계정을 사용하여 웹 사이트의 /admin 부분에 액세스합니다. Flask의 경우 Flask-admin과 같은 확장을 사용하여 동일한 기능을 제공합니다.

문제가 있나요? 알려주세요.

2 - Azure에서 웹앱 만들기

Azure에서 애플리케이션을 호스트하려면 Azure App Service 웹앱을 만들어야 합니다.

Azure Portal에 로그인하고 다음 단계에 따라 Azure App Service 리소스를 만듭니다.

지침 스크린샷
Azure Portal에서 다음을 수행합니다.
  1. Azure Portal 맨 위에 있는 검색 창에 앱 서비스를 입력합니다.

  2. 검색 창 아래에 표시되는 메뉴의 서비스 제목 아래에서 App Services라는 레이블이 지정된 항목을 선택합니다.

A screenshot showing how to use the search box in the top tool bar to find App Services in Azure portal.
App Services 페이지에서 + 만들기를 선택합니다. A screenshot showing the location of the Create button on the App Services page in the Azure portal.
웹앱 만들기 페이지에서 다음과 같이 양식을 작성합니다.
  1. 리소스 그룹새로 만들기 를 선택하고 msdocs-python-postgres-webapp-rg의 이름을 사용합니다.

  2. 이름msdocs-python-postgres-webapp-<unique-id>를 사용합니다. 이름은 웹앱의 URL https://<app-service-name>.azurewebsites.com을 사용하여 Azure에서 고유해야 합니다.

  3. 런타임 스택Python 3.9

  4. 지역 → 가까운 모든 Azure 지역입니다.

  5. App Service 요금제Linux 플랜에서 새로 만들기를 선택하고 msdocs-python-postgres-webapp-plan의 이름을 사용합니다.

  6. App Service 요금제Sku 및 크기에서 크기 변경을 선택하여 다른 App Service 요금제를 선택합니다.

A screenshot showing how to fill out the form to create a new App Service in the Azure portal.
사양 선택기 섹션에서 App Service 요금제를 선택합니다. App Service 요금제는 앱에서 사용할 수 있는 리소스 수(CPU/메모리)와 해당 리소스의 비용을 제어합니다.
  1. 개발/테스트를 선택합니다.

  2. B1(기본) 요금제를 선택합니다.

    B1 기본 요금제는 Azure 계정에 대해 소량의 요금이 부과되지만 F1(무료) 요금제보다 성능이 향상되는 것이 좋습니다.

  3. 적용을 선택합니다.

A screenshot showing how to select the basic App Service plan in the Azure portal.
웹앱 만들기 페이지로 돌아가서 화면 아래쪽에서 검토 + 만들기 단추를 선택합니다.

그러면 구성을 검토하는 페이지로 이동됩니다. 그런 다음, 만들기를 선택하여 App Service를 만듭니다.
A screenshot showing the location of the Review plus Create button in the Azure portal.

문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 그렇지 않으면 알려주세요.

3 - Azure에서 PostgreSQL 데이터베이스 만들기

Azure portal, Visual Studio Code 또는 Azure CLI를 사용하여 Azure에서 PostgreSQL 데이터베이스를 만들 수 있습니다.

Azure Portal에 로그인하고 다음 단계에 따라 Azure Database for PostgreSQL 리소스를 만듭니다.

지침 스크린샷
Azure Portal에서 다음을 수행합니다.
  1. Azure Portal 맨 위에 있는 검색 창에 postgres를 입력합니다.

  2. 검색 창 아래에 표시되는 메뉴의 서비스 제목 아래에서 Azure Database for PostgreSQL 유연한 서버라는 레이블이 지정된 항목을 선택합니다.

A screenshot showing how to use the search box in the top tool bar to find Postgres Services in the Azure portal.
Azure Database for PostgreSQL 유연한 서버 페이지에서 + 만들기를 선택합니다. A screenshot showing the location of the Create button on the Azure Database for PostgreSQL servers page in the Azure portal.
다음 페이지의 유연한 서버 아래에서 만들기를 선택합니다. A screenshot showing the location of the Create Flexible Server button on the Azure Database for PostgreSQL deployment option page in the Azure portal.
유연한 서버 페이지에서 다음과 같이 양식을 작성합니다.
  1. 리소스 그룹 → 선택하고 msdocs-python-postgres-webapp-rg의 이름을 사용합니다.

  2. 서버 이름msdocs-python-postgres-webapp-db-<unique-id>와 같은 이름을 입력합니다. 이름은 데이터베이스 서버의 URL https://<server-name>.postgres.database.azure.com을 사용하여 Azure에서 고유해야 합니다. 허용되는 문자는 A-Z, 0-9-입니다.

  3. 지역 → 웹앱에 사용되는 동일한 Azure 지역입니다.

  4. 데이터 원본없음

  5. 워크로드 유형프로덕션

  6. 컴퓨팅 + 스토리지 → 아래에 설명된 다른 컴퓨팅 + 스토리지 요금제를 선택하려면 서버 구성을 선택합니다.

  7. 가용성 영역 → 기본값(기본 설정 없음)을 유지합니다.

  8. 버전 → 기본값(최신 버전)을 유지합니다.

A screenshot showing how to fill out the form to create a new Azure Database for PostgreSQL in the Azure portal.
컴퓨팅 + 스토리지 페이지에서 유연한 서버를 계속 구성합니다.
  1. 컴퓨팅 계층버스트 가능을 선택합니다.

  2. 컴퓨팅 크기Standard_B1ms를 선택합니다.

  3. 저장을 선택하여 기본 구성 페이지로 돌아갑니다.

A screenshot showing how to select and configure the basic database service plan in the Azure portal.
유연한 서버 페이지로 돌아가서 기본 구성을 완료합니다.
  1. 관리자 계정 → 데이터베이스 관리자 계정에 사용할 관리자 사용자 이름암호를 입력합니다.

  2. 화면 아래쪽에서 다음: 네트워킹을 선택합니다.

Creating administrator account information for the PostgreSQL Flexible server in the Azure portal.
네트워킹 페이지에서 로컬 환경에서 데이터베이스 서버에 액세스할 수 있도록 하는 방화벽 규칙을 추가합니다.
  1. 로컬 환경에서 액세스할 수 있도록 현재 클라이언트 IP 주소 추가를 선택합니다.

  2. 화면 아래쪽에서 검토 + 만들기를 선택합니다.

    검토 페이지로 이동하게 됩니다. 만들기를 선택하여 Azure Database for PostgreSQL 유연한 서버 서비스를 만듭니다.

A screenshot showing adding current IP as a firewall rule for the PostgreSQL Flexible server in the Azure portal.

PostgreSQL 대화형 터미널 psql을 사용하여 로컬 환경에서 PostgreSQL 데이터베이스 서버에 연결하고 restaurant 데이터베이스를 만듭니다.

psql --host=<server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=<admin-user> \
     --dbname=postgres

postgres=> CREATE DATABASE restaurant;

이전 단계의 값은 <server-name><admin-user>의 값입니다. 연결하는 데 문제가 있는 경우 데이터베이스를 다시 시작하고 다시 시도합니다.

필요에 따라 프롬프트를 postgres(기본값)에서 restaurant로 변경하기 위해 \c restaurant를 실행하여 restaurant 데이터베이스가 성공적으로 만들어졌는지 확인합니다. 도움말을 표시하려면 \?를, 종료하려면 \q를 입력합니다.

문제가 있나요? 알려주세요.

4 - 웹앱이 데이터베이스에 액세스하도록 허용

Azure Database for PostgreSQL 서버를 만든 후 방화벽 규칙을 추가하여 웹앱에서 서버에 대한 액세스를 구성합니다. 이 작업은 Azure Portal 또는 Azure CLI를 통해 수행할 수 있습니다.

VS Code에서 작업하는 경우 데이터베이스 서버를 마우스 오른쪽 단추로 클릭하고 포털에서 열기를 선택하여 Azure Portal로 이동합니다. 또는 Azure Cloud Shell로 이동하여 Azure CLI 명령을 실행합니다.

지침 스크린샷
웹앱이 PostgreSQL 유연한 서버에 액세스할 수 있도록 하는 규칙을 추가합니다.
  1. 서버의 왼쪽 리소스 페이지에서 네트워킹을 선택합니다.

  2. Azure 내의 모든 Azure 서비스에서 이 서버로의 퍼블릭 액세스 허용 옆의 확인란을 선택합니다.

  3. 저장을 선택하여 변경 내용을 저장합니다.

프로덕션 웹앱과 데이터베이스 서버 간의 통신을 더욱 안전하게 보호하려면 Azure Virtual Network를 사용해야 합니다.
A screenshot showing how to add access from other Azure services to a PostgreSQL database in the Azure portal.

문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 그렇지 않으면 알려주세요.

5 - 웹앱을 데이터베이스에 커넥트

웹앱 및 PostgreSQL 데이터베이스를 만든 다음 단계는 Azure의 PostgreSQL 데이터베이스에 웹앱을 연결하는 것입니다.

웹앱 코드는 4개의 환경 변수인 DBHOST, DBNAME, DBUSER, DBPASS에서 데이터베이스 정보를 사용하여 PostgresSQL 서버에 연결합니다.

지침 스크린샷
포털에서 웹앱에 대한 App Service 페이지로 이동합니다.
  1. 왼쪽 메뉴의 설정에서 구성을 선택합니다.

  2. 페이지 맨 위에서 애플리케이션 설정을 선택합니다.

A screenshot showing how to navigate to App Settings in the Azure portal.
애플리케이션 설정을 만듭니다.
  1. + 새 애플리케이션 설정을 선택하여 django 샘플 앱에서 기대하는 다음 각 값에 대한 설정을 만듭니다.

    • DBHOST → 데이터베이스를 만들 때 이전에 사용한 서버 이름(예: msdocs-python-postgres-webapp-db-<unique id>)을 사용합니다. azuresite/production.py의 코드는 자동으로 .postgres.database.azure.com을 추가하여 전체 PostgreSQL 서버 URL을 만듭니다.
    • DBNAME → 애플리케이션 데이터베이스의 이름인 restaurant를 입력합니다.
    • DBUSER → 데이터베이스를 프로비저닝할 때 사용되는 관리자 사용자 이름입니다.
    • DBPASS → 이전에 만든 관리자 보안 암호입니다.
  2. 네 가지 설정이 있는지 확인하고 숨겨진 값을 봅니다.

  3. 저장을 선택하고 설정을 적용합니다.

A screenshot showing how to configure the App Settings in the Azure portal.

문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 그렇지 않으면 알려주세요.

6 - Azure에 애플리케이션 코드 배포

Azure App Service는 GitHub Actions 및 모든 주요 CI/CD 도구에 대한 지원을 포함하여 애플리케이션 코드를 Azure에 배포하는 여러 메서드를 지원합니다. 이 문서에서는 로컬 워크스테이션에서 Azure로 코드를 배포하는 방법에 중점을 둡니다.

VS Code에서 웹앱을 배포하려면 Azure Tools 확장 팩을 설치하고 VS Code에서 Azure로 로그인해야 합니다.

지침 스크린샷
왼쪽 도구 모음에서 Azure 아이콘을 찾아 선택하여 Azure Tools for VS Code 확장을 표시합니다. A screenshot showing how to locate the Azure Tools extension in VS Code.
Azure 도구 확장에서:
  1. RESOURCES를 확장합니다. (리소스가 리소스 종류별로 정렬되어 있는지 확인합니다.)

  2. 웹앱을 마우스 오른쪽 단추로 클릭하여 바로 가기 메뉴를 표시합니다.

  3. 메뉴에서 웹앱에 배포...를 선택합니다.

A screenshot showing how to deploy a web app in VS Code.
웹앱을 웹앱으로 선택하여 화면 맨 위에 있는 대화 상자에 배포합니다.

대화 상자에서 배포를 선택합니다.
A screenshot showing how to deploy a web app in VS Code: selecting the code to deploy.A screenshot showing how to deploy a web app in VS Code: a dialog box to confirm deployment.
를 선택하여 빌드 구성을 업데이트하고 배포 성능을 향상시킵니다. A screenshot showing how to deploy a web app in VS Code: a dialog box to choose to always deploy to the app service.
배포가 완료되면 화면의 오른쪽 아래 모서리에 웹 사이트로 이동할 수 있는 옵션이 있는 대화 상자가 나타납니다. 이 링크를 사용하는 경우 다음 단계에서 마이그레이션을 수행할 때까지 웹앱이 준비되지 않았기 때문에 웹 페이지에서 오류를 보고합니다. 이 문제에 대한 다른 대화 상자 경고가 표시될 수 있습니다. A screenshot showing how to deploy a web app in VS Code: a dialog box with choice to browse to website.A screenshot showing how to deploy a web app in VS Code: a dialog box with choice to view deployment details.

문제가 있나요? 먼저 문제 해결 가이드를 참조하세요. 그렇지 않으면 알려주세요.

7 - 앱 데이터베이스 마이그레이션

코드가 배포되고 데이터베이스가 준비되면 앱을 거의 사용할 수 있습니다. 먼저 데이터베이스 자체에 필요한 스키마를 설정해야 합니다. 이렇게 하려면 Django 앱의 데이터 모델을 데이터베이스로 "마이그레이션"합니다.

1단계. SSH 세션을 만들고 웹앱 서버에 연결합니다.

Azure Portal에서 App Service 인스턴스의 페이지로 이동합니다.

  1. 왼쪽의 개발 도구에서 SSH를 선택합니다.
  2. 그런 다음, 이동하여 웹앱 서버에서 SSH 콘솔을 엽니다. (웹앱 컨테이너에서 시작해야 하므로 처음 연결하는 데 1분 정도 걸릴 수 있습니다.)

참고

SSH 세션에 연결할 수 없으면 앱 자체를 시작하지 못한 것입니다. 자세한 내용은 진단 로그를 확인하세요. 예를 들어 이전 섹션에서 필요한 앱 설정을 만들지 않은 경우 로그에 KeyError: 'DBNAME'이 표시됩니다.

2단계. SSH 세션에서 다음 명령을 실행하여 모델을 데이터베이스 스키마로 마이그레이션합니다(Ctrl+Shift+V를 사용하여 명령을 붙여넣을 수 있음).

Flask 샘플 앱을 Azure App Service에 배포할 때 데이터베이스 테이블은 Azure PostgreSQL에서 자동으로 만들어집니다. 테이블을 만들지 않은 경우 다음 명령을 시도합니다.

# Create database tables
flask db init

데이터베이스 연결과 관련된 오류가 발생하는 경우 이전 섹션에서 만든 App Service의 애플리케이션 설정 값(즉, DBHOST, DBNAME, DBUSER, DBPASS)을 확인합니다. 이러한 설정이 없으면 마이그레이션 명령이 데이터베이스와 통신할 수 없습니다.

SSH 세션에서 Django를 사용하면 일반적인 Django 앱과 같은 python manage.py createsuperuser 명령을 사용하여 사용자를 만들 수도 있습니다. 자세한 내용은 django django-admin 및 manage.py에 대한 설명서를 참조하세요. 슈퍼 사용자 계정을 사용하여 웹 사이트의 /admin 부분에 액세스합니다. Flask의 경우 Flask-admin과 같은 확장을 사용하여 동일한 기능을 제공합니다.

문제가 있나요? 알려주세요.

8 - 앱 찾아보기

웹 브라우저에서 배포된 애플리케이션(URL: http://<app-name>.azurewebsites.net)으로 이동합니다. 앱이 시작되는 데 1~2분 정도 걸릴 수 있으므로 기본 앱 페이지가 표시되면 잠시 기다렸다가 브라우저를 새로 고칩니다.

샘플 웹앱이 표시되면 기본 제공 이미지인 축하합니다! App Service에 Python 앱을 배포했습니다를 사용하여 App Service의 Linux 컨테이너에서 실행됩니다.

문제가 있나요? 알려주세요.

9 - 진단 로그 스트림

Azure App Service는 애플리케이션 문제를 진단하는 데 도움이 되도록 콘솔에 모든 메시지 출력을 캡처합니다. 샘플 앱에는 아래와 같이 이 기능을 보여 주는 print() 문이 포함되어 있습니다.

def index(request):
    print('Request for index page received')

    restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
    return render(request, 'restaurant_review/index.html', {'restaurants': restaurants })

Azure에서 앱을 호스팅하는 컨테이너 내에서 생성된 콘솔 로그에 액세스할 수 있습니다.

지침 스크린샷
먼저, Azure App Service에서 스트리밍 로그를 사용하도록 설정해야 합니다. Azure Portal에서 App Service 인스턴스의 페이지로 이동합니다.
  1. 페이지 왼쪽 메뉴의 모니터링 제목 아래에서 App Service 로그를 선택합니다.

  2. 애플리케이션 로깅 속성을 끄기에서 파일 시스템으로 변경합니다.

  3. 로그에 대해 30일의 보존 기간을 입력합니다.

  4. 저장을 선택하여 변경 내용을 저장합니다.

A screenshot showing how to set application logging in the Azure portal.
모니터링 섹션 아래의 메뉴에서 로그 스트림 항목을 선택합니다. 앱에서 홈페이지를 새로 고치거나 다른 요청을 시도하여 일부 로그 메시지를 생성합니다.

앱에서 생성된 로그 메시지와 서비스에서 생성한 메시지가 출력에 표시됩니다.
A screenshot showing how to stream logs in the Azure portal.

문제가 있나요? 알려주세요.

리소스 정리

추가 개발 작업에 필요한 경우 실행 중인 앱 및 데이터베이스를 그대로 두고 다음 단계로 건너뛸 수 있습니다.

그러나 샘플 앱을 완료하면 Azure에서 앱에 대한 모든 리소스를 제거하여 다른 요금이 발생하지 않도록 하고 Azure 구독을 깔끔하게 유지할 수 있습니다. 리소스 그룹을 제거하면 리소스 그룹의 모든 리소스도 제거되며 이것이 앱에 대한 모든 Azure 리소스를 제거하는 가장 빠른 방법입니다.

Azure Portal에 로그인하는 동안 다음 단계에 따라 리소스 그룹을 삭제합니다.

지침 스크린샷
Azure Portal에서 리소스 그룹으로 이동합니다.
  1. 페이지 맨 위에 있는 검색 창에 리소스 그룹의 이름을 입력합니다.
  2. 리소스 그룹 머리글 아래에서 리소스 그룹의 이름을 선택하여 해당 이름으로 이동합니다.
A screenshot showing how to find resource group in the Azure portal.
페이지 맨 위에서 리소스 그룹 삭제 단추를 선택합니다. A screenshot showing how to delete a resource group in the Azure portal.
확인 대화 상자에서 리소스 그룹의 이름을 입력하여 삭제를 확인합니다. 삭제를 선택하여 리소스 그룹을 삭제합니다.

문제가 있나요? 알려주세요.

다음 단계

사용자 지정 DNS 이름을 앱에 매핑하는 방법을 알아봅니다.

App Service에서 Python 앱을 실행하는 방법을 알아봅니다.