このチュートリアルでは、データドリブン 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
Web アプリは、Python
前提条件
サービス コネクタをサポートし、App Service のサポートとクォータが十分にある Azure リージョンの、チュートリアル リソースに対する書き込みおよびロール割り当てのアクセス許可を持つ Azure サブスクリプション。
Azure Cloud Shellを使用してチュートリアルの手順を実行するか、ローカルで実行する場合は次のようにします。
環境を設定する
Microsoft.ServiceLinkerおよびMicrosoft.DBforPostgreSQLのリソース プロバイダーをサブスクリプションに対して登録してください。az provider register --namespace Microsoft.ServiceLinker az provider register --namespace Microsoft.DBforPostgreSQL最新バージョンのService Connectorパスワードレス拡張機能をインストールしてください。
--upgradeパラメータは、すでに拡張機能がインストールされている場合に更新します:az extension add --name serviceconnector-passwordless --upgrade
サンプル アプリの複製
Important
チュートリアルのサンプルリポジトリは2026年6月15日にアーカイブされ、現在は積極的に維持されていません。 このチュートリアルを完了するためだけに使ってください。
サンプル アプリ リポジトリを複製します。
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.gitあるいは、 serviceconnector-webapp-postgresql-django-passwordless リポジトリからアプリをダウンロードし、 serviceconnector-webapp-postgresql-django-passwordlessというフォルダにアンzipすることもできます。
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 の
初期環境変数を定義する
次のコードでは、このチュートリアルに必要な環境変数を定義します。
-
LOCATIONは、サブスクリプションがリソースを作成するのに十分なクォータを持ち、サブスクリプションのAzure Database for PostgreSQLを制限しないAzureリージョンである必要があります。 - PostgreSQL管理者パスワードは、これらのカテゴリのうち少なくとも8〜128文字を含む必要があります:大文字、小文字、数字、非英数字文字です。 このチュートリアルのパスワードに
$は使わないでください。
以下の環境変数を設定し、
<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"PostgreSQLの管理者パスワードを表示したりシェル履歴に追加したりせずに読みましょう:
read -s -p "PostgreSQL administrator password: " ADMIN_PW && echoすべてのプロジェクト リソースを含む リソース グループ を作成します。 リソース グループ名はキャッシュされ、後続のコマンドに自動的に適用されます。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
App Service にアプリ コードをデプロイする
App Serviceでアプリホストを作成し、ビルド自動化を有効にし、サンプルアプリコードをデプロイします。 このチュートリアルで使用しているBasic(B1)App Serviceプランは、Azureのサブスクリプションにコストがかかります。 現在の価格については、App Service の価格をご覧ください。
アーカイブされたサンプルの requirements.txt ファイルには 、start.sh が使用しているGunicornサーバーが記載されていません。もしまだ存在していなければ、ローカルコピーに追加してください:
grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txtBasic (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"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リポジトリのルートからサンプルアプリの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 の柔軟なサーバーとデータベースを作成してアプリデータを保存します。
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されたときに成功します。サーバー作成後に現在のシェルから管理者パスワードを削除してください:
unset ADMIN_PWaz 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 アプリ設定が作成される時点で接続は準備完了です。
サンプルフォトコンテナの設定
このアーカイブ済みのサンプル アプリについて、BLOB へのパブリック読み取りアクセスを許可するように Azure Storage アカウントを更新してください。
注
このアーカイブされたサンプルは直接ブロブURLを使って写真を表示しているため、チュートリアルでは
photosコンテナへの匿名読み取りが可能です。 この設定はサンプル固有のものであり、Service Connectorでは必須ではありません。 本番環境のアプリでは、コンテナをプライベートに保ち、認証済みアプリケーションエンドポイントなどの制御された配信方法を用いましょう。az storage account update \ --resource-group $RESOURCE_GROUP_NAME \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-access trueMicrosoft 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環境には影響がありません。 役割割り当ては効果的になるまでに数分かかることがあります。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_NAMEAzure Cloud Shellローカル ブラウザーを開くことができないため、
az webapp browseコマンドはサポートされません。 Cloud Shellから、アプリのAzureポータルページ右上にあるデフォルトドメインリンクを選択します。
アプリが開始されるまでに 1 から 2 分かかる場合があります。 サンプル アプリではない既定のアプリ ページが表示される場合は、少し待ってからブラウザーを更新します。
レストランと写真付きのレビューを追加して、サンプル アプリの機能をテストします。 アプリは次のスクリーンショットのようになります。
リソースをクリーンアップする
継続的な料金を回避するには、このチュートリアル用に作成したリソースを削除するには、そのリソースを含むリソース グループを削除します。 コマンドを実行する前に、アプリやリソースが不要になっていることを確認してください。
az group delete --name $RESOURCE_GROUP_NAME --no-wait
コマンドはすぐに戻り、Azureはリソースを削除します。
Troubleshooting
アプリが起動せずリソースに接続できない場合は、App Serviceのデプロイログを確認し、AZURE_POSTGRESQL_CONNECTIONSTRINGとAZURE_STORAGEBLOB_RESOURCEENDPOINTアプリ設定が存在しているか確認し、Azure役割割り当てが有効になるまで数分待ってください。 Pythonアプリの起動に関する問題については、以下の記事をご覧ください:
Azure App Service
関連するコンテンツ
- Quickstart: Service Connector を使用してデータベースとサービスにAzure App Serviceを接続します
- IaC ツールを使用してサービス接続を作成する
PostgreSQL を使用して Python Django Web アプリを Azure