このチュートリアルでは、データドリブン 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 アプリをデータベースとストレージ コンテナーに接続します。
- Web アプリを操作します。
注
このチュートリアルは、App Service
Web アプリは、Python
前提条件
サービス コネクタをサポートし、App Service のサポートとクォータが十分にある Azure リージョンの、チュートリアル リソースに対する書き込みおよびロール割り当てのアクセス許可を持つ Azure サブスクリプション。
Azure Cloud Shellを使用してチュートリアルの手順を実行するか、ローカルで実行する場合は次のようにします。
-
Azure CLI 2.30.0 以降をインストールします。 バージョンを確認するには、
az --versionを実行します。 アップグレードするには、az upgradeを実行します。 -
az loginを使用して、プロンプトに従ってAzureにサインインします。
-
Azure CLI 2.30.0 以降をインストールします。 バージョンを確認するには、
環境を設定する
Microsoft.ServiceLinkerとMicrosoft.DBforPostgreSQLリソース プロバイダーを使用するようにサブスクリプションが登録されていることを確認します。 そうでない場合は、az provider register -n Microsoft.[name of service]を実行してプロバイダーを登録します。次のAzure CLI拡張機能をインストールします。
az extension add --name serviceconnector-passwordless --upgrade az extension add --name rdbms-connect
サンプル アプリの複製
サンプル アプリ リポジトリを複製します。
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.gitまたは、https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless からアプリをダウンロードし、serviceconnector-webapp-postgresql-django-passwordless という名前のフォルダーに解凍することもできます。
cd serviceconnector-webapp-postgresql-django-passwordlessを使用してリポジトリ フォルダーにディレクトリを変更し、そのフォルダーから残りのすべてのコマンドを実行します。
サンプル アプリでは、Web アプリの運用設定は azuresite/production.py ファイルにあります。 開発設定は azuresite/settings.py にあります。 運用環境の設定では、任意の運用環境で実行するように Django が構成され、App Service に固有ではありません。
WEBSITE_HOSTNAME環境変数が設定されている場合、アプリは運用環境の設定を使用します。 Azure Postgres 接続文字列の場合、App Service はこの変数を Web アプリの URL (https://msdocs-django.azurewebsites.net など) に自動的に設定します。
詳細については、 Django デプロイのチェックリストを参照してください。 Azure の Django の
初期環境変数を定義する
次のコードでは、このチュートリアルに必要な環境変数を定義します。
-
LOCATIONは、サブスクリプションがリソースを作成するのに十分なクォータを持ち、サブスクリプションのAzure Database for PostgreSQLを制限しないAzureリージョンである必要があります。 -
ADMIN_PWには、大文字、小文字、数字、および英数字以外の 4 つのカテゴリのうち少なくとも 3 つの文字のうち、$を除く 8 ~ 128 文字を含める必要があります。
次の環境変数を設定し、
<region>と<database password>のプレースホルダーを有効な値に置き換えます。LOCATION="<region>" RAND_ID=$RANDOM RESOURCE_GROUP_NAME="msdocs-mi-web-app" APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID" DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID" ADMIN_USER="demoadmin" ADMIN_PW="<database password>"すべてのプロジェクト リソースを含む リソース グループ を作成します。 リソース グループ名はキャッシュされ、後続のコマンドに自動的に適用されます。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
App Service にアプリ コードをデプロイする
App Service でアプリ ホストを作成し、そのホストにサンプル アプリ コードをデプロイします。
az webapp up コマンドは、次のアクションを実行します。
- Basic (B1) 価格レベルで App Service プラン を作成します。
- App Service アプリを作成します。
- アプリの既定のログ記録を有効にします。
- ビルド自動化が有効になっている ZIP デプロイを使用してリポジトリをアップロードします。
- アプリをビルドします。
このコードでは、 sku によって App Service プランの CPU、メモリ、コストが定義されます。 Basic (B1) サービス プランでは、Azure サブスクリプションにわずかなコストが発生します。 既定の SKU (通常は P1v3 (Premium v3) を使用するには、 --sku パラメーターを省略できます。 App Service プランの完全な一覧については、「 App Service の価格」を参照してください。
serviceconnector-webapp-postgresql-django-passwordless リポジトリ フォルダーから、次の
az webapp upコマンドを実行します。az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.10 \ --sku B1注
デプロイには数分かかります。特に Basic SKU では、コマンドがハングしたりタイムアウトしたりする可能性があります。 アプリが正常にビルドされ、出力に
Starting the siteが表示されたら、Ctrl + C キーを押してコマンドを終了できます。az webapp config set コマンドを実行して、リポジトリ start.sh ファイルを使用するようにアプリを構成します。
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Azure で Postgres データベースを作成する
アプリ情報を格納するAzure Database for PostgreSQL データベースを作成します。 az postgres flexible-server create コマンドは、指定されたリソース グループに次のAzure Database for PostgreSQLフレキシブル サーバーを作成します。
-
--nameパラメーターで指定されたサーバー名。 名前は、すべてのAzureで一意である必要があります。 -
--sku-nameパラメーターで指定された SKU。 -
--admin-userパラメーターと--admin-passwordパラメーターで指定された管理者アカウントのユーザー名とパスワード。
Azure Database for PostgreSQL サーバーを作成します。 現在のクライアント IP アドレスへのアクセスを有効にするように求められたら、「はい」
y入力します。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現在のクライアント IP アドレスへのアクセスを有効にするメッセージが表示されない場合は、 az postgres flexible-server firewall-rule create コマンドを使用してサーバー上のファイアウォール規則を構成します。 この規則は、ローカル環境からサーバーへのアクセスを許可します。
IP_ADDRESS=<your IP address> az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --rule-name AllowMyIP \ --start-ip-address $IP_ADDRESS \ --end-ip-address $IP_ADDRESSヒント
IP アドレスを表示するツールやウェブサイトを使って、コマンドの
<your IP address>を置き換えます。 たとえば、What's My IP Address?(自分の IP アドレス)を使用できます。restaurantコマンドを使用して、という名前のデータベースをサーバーに作成します。az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --database-name postgres \ --querytext 'create database restaurant;'
パスワードなしのサービス接続を作成する
az webapp connection create postgres-flexible を使用して、Azure Web アプリをパスワードレス マネージド ID 認証を使用して Postgres データベースに接続するサービス コネクタを追加します。 次のコマンドは、マネージド ID とロールベースのアクセス制御Azure使用するようにAzure Database for PostgreSQLを構成します。 コマンド出力には、Service Connector が実行するアクションが一覧表示されます。
このコマンドは、アプリのデータベース接続情報を提供する AZURE_POSTGRESQL_CONNECTIONSTRING という名前の環境変数を作成します。 アプリ コードは、 os.environ.get('AZURE_POSTGRESQL_HOST')などのステートメントを使用してアプリ環境変数にアクセスします。 詳細については、「 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 restaurant \
--client-type python \
--system-identity
ストレージ アカウントを作成して接続する
az webapp connection create storage-blob を使用して、Azure ストレージ アカウントとサービス コネクタを作成します。 このコマンドは、次のアクションを実行します。
- Web アプリでシステム割り当てマネージド ID を有効にします。
- ストレージ BLOB データ共同作成者 ロールを持つ Web アプリを新しいストレージ アカウントに追加します。
- Web アプリからのアクセスを受け入れるようにストレージ アカウント ネットワークを構成します。
- Azure Storage アカウントの
AZURE_STORAGEBLOB_RESOURCEENDPOINTという名前の環境変数を作成します。
次のコマンドを実行して、ストレージ アカウントと接続を作成します。
STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \ --new true \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --target-resource-group $RESOURCE_GROUP_NAME \ --client-type python \ --system-identity \ --query configurations[].value \ --output tsv) STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))アプリ ユーザーが写真にアクセスできるように、BLOB パブリック アクセスを許可するようにストレージ アカウントを更新します。
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-accessaz storage container create を使用して、ストレージ アカウントに
photosという名前のコンテナーを作成し、新しいコンテナー内の BLOB への匿名パブリック読み取りアクセスを許可します。# Set the BLOB_ENDPOINT variable BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g') echo $BLOB_ENDPOINT # Create the storage container using the BLOB_ENDPOINT variable az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --auth-mode login \ --blob-endpoint $BLOB_ENDPOINT
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.azurewebsites.net --resource-group $RESOURCE_GROUP_NAMEAzure Cloud Shellローカル ブラウザーを開くことができないため、
az webapp browseコマンドはサポートされません。 Cloud Shellから Web アプリを開く最も簡単な方法は、アプリのAzure ポータル ページの右上にある Default domain リンクを選択することです。
アプリが開始されるまでに 1 から 2 分かかる場合があります。 サンプル アプリではない既定のアプリ ページが表示される場合は、少し待ってからブラウザーを更新します。
レストランと写真付きのレビューを追加して、サンプル アプリの機能をテストします。 アプリは次のスクリーンショットのようになります。
リソースをクリーンアップする
継続的な料金を回避するには、このチュートリアル用に作成したリソースを削除するには、そのリソースを含むリソース グループを削除します。 コマンドを実行する前に、アプリやリソースが不要になっていることを確認してください。
az group delete --name $RESOURCE_GROUP_NAME --no-wait
すべてのリソースが削除されるまでには多少時間がかかります。
--no-wait引数を指定すると、コマンドはすぐに戻ることができます。
Troubleshooting
このチュートリアルの実行に問題がある場合は、次のリソースを参照してください。
Azure App Service - サポートを要求する
関連するコンテンツ
- Quickstart: Service Connector を使用してデータベースとサービスにAzure App Serviceを接続します
- IaC ツールを使用してサービス接続を作成する
PostgreSQL を使用して Python Django Web アプリを Azure