チュートリアル:Service Connectorを使ったDjangoのウェブアプリをAzure Database for PostgreSQLに接続する方法

このチュートリアルでは、データドリブン Python Django Web アプリをAzure App Serviceにデプロイし、Service Connector を使用して他のAzure サービスに接続する方法について説明します。 サンプル Web アプリは、レストランを格納し、Azure Database for PostgreSQL データベースに情報を確認し、写真を Azure Storage コンテナーに格納します。

Azure CLIを使用して、次のタスクを実行します。

  • Python Django Web アプリを作成し、Azure App Service にデプロイします。
  • Azure Database for PostgreSQL のフレキシブル サーバーとデータベースを作成します。
  • Azure Storage アカウントとコンテナーを作成します。
  • 管理ID認証付きのService Connectorを使って、ウェブアプリをデータベースおよびストレージコンテナに接続します。
  • Web アプリを操作します。

注

このチュートリアルは、App Service Azureチュートリアルに似ていますが、Azureロールベースのアクセス制御を備えたシステム割り当てパスワードレス マネージド ID を使用して、他のAzure リソースにアクセスします。 この記事の「 パスワードなしのサービス接続の作成 」セクションでは、Service Connector によって接続プロセスがどのように簡略化されるかを示します。

Web アプリは、Python Azure Identity クライアント ライブラリの DefaultAzureCredential> クラスを使用して、マネージド ID が存在するタイミングを自動的に検出し、それを使用して他のリソースにアクセスします。

前提条件

  • サービス コネクタをサポートし、App Service のサポートとクォータが十分にある Azure リージョンの、チュートリアル リソースに対する書き込みおよびロール割り当てのアクセス許可を持つ Azure サブスクリプション。

  • Azure Cloud Shellを使用してチュートリアルの手順を実行するか、ローカルで実行する場合は次のようにします。

    1. 安裝 Azure CLI 2.87.0 或更後版本。 バージョンを確認するには、 az versionを実行します。 アップグレードするには、 az upgradeを実行します。
    2. Python 3 をインストールします。
    3. Git のインストール。
    4. az login を使用して、プロンプトに従ってAzureにサインインします。

環境を設定する

  1. Microsoft.ServiceLinker および Microsoft.DBforPostgreSQL のリソース プロバイダーをサブスクリプションに対して登録してください。

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. 最新バージョンのService Connectorパスワードレス拡張機能をインストールしてください。 --upgradeパラメータは、すでに拡張機能がインストールされている場合に更新します:

    az extension add --name serviceconnector-passwordless --upgrade
    

サンプル アプリの複製

Important

チュートリアルのサンプルリポジトリは2026年6月15日にアーカイブされ、現在は積極的に維持されていません。 このチュートリアルを完了するためだけに使ってください。

  1. サンプル アプリ リポジトリを複製します。

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    あるいは、 serviceconnector-webapp-postgresql-django-passwordless リポジトリからアプリをダウンロードし、 serviceconnector-webapp-postgresql-django-passwordlessというフォルダにアンzipすることもできます。

  2. cd serviceconnector-webapp-postgresql-django-passwordlessを使用してリポジトリ フォルダーにディレクトリを変更し、そのフォルダーから残りのすべてのコマンドを実行します。

サンプルアプリでは、ウェブアプリの本番設定は azureproject/production.py ファイルにあります。 開発設定は AzureProject/settings.py にあります。 運用環境の設定では、任意の運用環境で実行するように Django が構成され、App Service に固有ではありません。

WEBSITE_HOSTNAME環境変数が設定されている場合、アプリは運用環境の設定を使用します。 App Serviceはこの変数をアプリのホスト名(例えば msdocs-django.azurewebsites.net)に設定します。

詳細については、 Django デプロイのチェックリストを参照してください。 Azure の Django のProduction 設定も参照してください。

初期環境変数を定義する

次のコードでは、このチュートリアルに必要な環境変数を定義します。

  • LOCATION は、サブスクリプションがリソースを作成するのに十分なクォータを持ち、サブスクリプションのAzure Database for PostgreSQLを制限しないAzureリージョンである必要があります。
  • PostgreSQL管理者パスワードは、これらのカテゴリのうち少なくとも8〜128文字を含む必要があります:大文字、小文字、数字、非英数字文字です。 このチュートリアルのパスワードに $ は使わないでください。
  1. 以下の環境変数を設定し、 <region> を有効な値に置き換えます。

    LOCATION="<region>"
    RAND_ID=$RANDOM$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app-$RAND_ID"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    APP_SERVICE_PLAN_NAME="$APP_SERVICE_NAME-plan"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    DATABASE_NAME="restaurant"
    STORAGE_ACCOUNT_NAME="account$RAND_ID"
    ADMIN_USER="demoadmin"
    
  2. PostgreSQLの管理者パスワードを表示したりシェル履歴に追加したりせずに読みましょう:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. すべてのプロジェクト リソースを含む リソース グループ を作成します。 リソース グループ名はキャッシュされ、後続のコマンドに自動的に適用されます。

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

App Service にアプリ コードをデプロイする

App Serviceでアプリホストを作成し、ビルド自動化を有効にし、サンプルアプリコードをデプロイします。 このチュートリアルで使用しているBasic(B1)App Serviceプランは、Azureのサブスクリプションにコストがかかります。 現在の価格については、App Service の価格をご覧ください。

  1. アーカイブされたサンプルの requirements.txt ファイルには 、start.sh が使用しているGunicornサーバーが記載されていません。もしまだ存在していなければ、ローカルコピーに追加してください:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Basic (B1)料金ティアでLinux App Serviceプランを作成し、サンプルの起動コマンドでウェブアプリを作成します:

    az appservice plan create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_PLAN_NAME \
      --location $LOCATION \
      --sku B1 \
      --is-linux
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --runtime "PYTHON:3.14" \
      --startup-file "start.sh"
    
  3. App Serviceのビルド自動化を有効にして、デプロイメントがパッケージを requirements.txtインストールできるようにします:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. リポジトリのルートからサンプルアプリのZIPファイルを作成し、 az webapp deployを使ってデプロイします:

    rm -f app.zip
    python -m zipfile -c app.zip *
    
    az webapp deploy \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --src-path app.zip \
      --type zip \
      --track-status false
    
    rm app.zip
    

    デプロイコマンドはApp ServiceがZIPファイルを受け入れると成功します。 ビルドはApp Serviceで続き、数分かかることもあります。

AzureでPostgreSQLデータベースを作成

Azure Database for PostgreSQL の柔軟なサーバーとデータベースを作成してアプリデータを保存します。

  1. Azure Database for PostgreSQL サーバーを作成します:

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4 \
      --microsoft-entra-auth Enabled
    

    このコマンドは、PostgreSQLのフレキシブルサーバープロビジョニング状態が Succeededされたときに成功します。

  2. サーバー作成後に現在のシェルから管理者パスワードを削除してください:

    unset ADMIN_PW
    
  3. az postgres flexible-server db createを使ってデータベースを作成します:

    az postgres flexible-server db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --name $DATABASE_NAME
    

パスワードなしのサービス接続を作成する

az webapp connection create postgres-flexibleを使って、パスワードレス管理ID認証でAzure webアプリをPostgreSQLデータベースに接続するサービスコネクターを追加してください。 次のコマンドは、マネージド ID とロールベースのアクセス制御Azure使用するようにAzure Database for PostgreSQLを構成します。 コマンド出力には、Service Connector が実行するアクションが一覧表示されます。

このコマンドは、データベース接続情報を含む「 AZURE_POSTGRESQL_CONNECTIONSTRING 」というアプリ設定を作成します。 サンプルは AzureProject/production.py でこの設定と書かれています。 詳細については、「 Access 環境変数」を参照してください。

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database $DATABASE_NAME \
  --client-type python \
  --system-identity \
  --yes

コマンドがPostgreSQLのフレキシブルサーバー接続を報告し、 AZURE_POSTGRESQL_CONNECTIONSTRING アプリ設定を作成するときに接続が準備完了です。

Service Connector を使用して Django Web アプリを Azure Storage に接続する

Azureストレージアカウントを作成し、az webapp connection create storage-blobを使ってウェブアプリに接続します。 接続コマンドは以下の動作を行います:

  • Web アプリでシステム割り当てマネージド ID を有効にします。
  • Storage Blob Data Contributor ロールを持つ Web アプリをストレージ アカウントに追加します。
  • Web アプリからのアクセスを受け入れるようにストレージ アカウント ネットワークを構成します。
  • Azure Storage アカウントの AZURE_STORAGEBLOB_RESOURCEENDPOINT という名前の環境変数を作成します。

Azure Storage アカウントを作成する

ローカル冗長なストレージを備えた汎用v2ストレージアカウントを作成しましょう:

az storage account create \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $STORAGE_ACCOUNT_NAME \
  --location $LOCATION \
  --sku Standard_LRS \
  --kind StorageV2

パスワードレスストレージ接続を作成

ストレージアカウントへのパスワードレス接続を作成する:

az webapp connection create storage-blob \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --account $STORAGE_ACCOUNT_NAME \
  --client-type python \
  --system-identity

コマンドがストレージアカウント接続を報告し、 AZURE_STORAGEBLOB_RESOURCEENDPOINT アプリ設定が作成される時点で接続は準備完了です。

サンプルフォトコンテナの設定

  1. このアーカイブ済みのサンプル アプリについて、BLOB へのパブリック読み取りアクセスを許可するように Azure Storage アカウントを更新してください。

    注

    このアーカイブされたサンプルは直接ブロブURLを使って写真を表示しているため、チュートリアルでは photos コンテナへの匿名読み取りが可能です。 この設定はサンプル固有のものであり、Service Connectorでは必須ではありません。 本番環境のアプリでは、コンテナをプライベートに保ち、認証済みアプリケーションエンドポイントなどの制御された配信方法を用いましょう。

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Microsoft Entra認証を使ってコンテナを作成するためのサインイン済みユーザー権限を割り当ててください:

    SIGNED_IN_USER_ID=$(az ad signed-in-user show --query id --output tsv)
    STORAGE_ACCOUNT_ID=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query id \
      --output tsv)
    
    MSYS_NO_PATHCONV=1 az role assignment create \
      --assignee-object-id $SIGNED_IN_USER_ID \
      --assignee-principal-type User \
      --role "Storage Blob Data Contributor" \
      --scope $STORAGE_ACCOUNT_ID
    

    このコマンドのMSYS_NO_PATHCONVを設定すると、Git Bash on WindowsがAzureリソースIDをWindowsパスに変換するのを防ぎます。 Azure Cloud Shellや他のBash環境には影響がありません。 役割割り当ては効果的になるまでに数分かかることがあります。

  3. az storage container createを使ってphotosというコンテナを作成し、そのコンテナ内のブロブへの匿名読み取りを可能にします:

    BLOB_ENDPOINT=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query primaryEndpoints.blob \
      --output tsv)
    
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

    レスポンスがphotosコンテナの"created": trueを示した時点でコンテナは準備完了です。

Azure でPython Web アプリをテストする

Azure Restaurant Review Web アプリを開いてテストします。 アプリでは、 azure.identity パッケージとその DefaultAzureCredential クラスが使用されます。 アプリがAzureで実行されている場合、DefaultAzureCredential は App Service のマネージド ID が存在するタイミングを自動的に検出し、それを使用してAzure StorageとAzure Database for PostgreSQLリソースにアクセスします。 アプリは、これらのリソースにアクセスするためにストレージ キー、証明書、または資格情報を提供する必要はありません。

  • ローカル Azure CLI インストールの場合は、az webapp browse を使用して、既定のブラウザーでアプリを開くことができます。

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shellローカル ブラウザーを開くことができないため、az webapp browse コマンドはサポートされません。 Cloud Shellから、アプリのAzureポータルページ右上にあるデフォルトドメインリンクを選択します。

アプリが開始されるまでに 1 から 2 分かかる場合があります。 サンプル アプリではない既定のアプリ ページが表示される場合は、少し待ってからブラウザーを更新します。

レストランと写真付きのレビューを追加して、サンプル アプリの機能をテストします。 アプリは次のスクリーンショットのようになります。

顧客レビューとアップロードされた写真を含むレストランの項目が表示された、サンプルのレストランレビュー Web アプリのスクリーンショット。

リソースをクリーンアップする

継続的な料金を回避するには、このチュートリアル用に作成したリソースを削除するには、そのリソースを含むリソース グループを削除します。 コマンドを実行する前に、アプリやリソースが不要になっていることを確認してください。

az group delete --name $RESOURCE_GROUP_NAME --no-wait

コマンドはすぐに戻り、Azureはリソースを削除します。

Troubleshooting

アプリが起動せずリソースに接続できない場合は、App Serviceのデプロイログを確認し、AZURE_POSTGRESQL_CONNECTIONSTRINGとAZURE_STORAGEBLOB_RESOURCEENDPOINTアプリ設定が存在しているか確認し、Azure役割割り当てが有効になるまで数分待ってください。 Pythonアプリの起動に関する問題については、以下の記事をご覧ください:

  • Azure App Service