チュートリアル: Service Connector を使用して Django Web アプリを PostgreSQL Azure接続する

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

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

前提条件

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

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

    1. Azure CLI 2.30.0 以降をインストールします。 バージョンを確認するには、 az --versionを実行します。 アップグレードするには、 az upgradeを実行します。
    2. az login を使用して、プロンプトに従ってAzureにサインインします。

環境を設定する

  1. Microsoft.ServiceLinkerMicrosoft.DBforPostgreSQL リソース プロバイダーを使用するようにサブスクリプションが登録されていることを確認します。 そうでない場合は、az provider register -n Microsoft.[name of service] を実行してプロバイダーを登録します。

  2. 次のAzure CLI拡張機能をインストールします。

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

サンプル アプリの複製

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

    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 という名前のフォルダーに解凍することもできます。

  2. 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 のProduction 設定も参照してください。

初期環境変数を定義する

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

  • LOCATION は、サブスクリプションがリソースを作成するのに十分なクォータを持ち、サブスクリプションのAzure Database for PostgreSQLを制限しないAzureリージョンである必要があります。
  • ADMIN_PWには、大文字、小文字、数字、および英数字以外の 4 つのカテゴリのうち少なくとも 3 つの文字のうち、$を除く 8 ~ 128 文字を含める必要があります。
  1. 次の環境変数を設定し、 <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>"
    
  2. すべてのプロジェクト リソースを含む リソース グループ を作成します。 リソース グループ名はキャッシュされ、後続のコマンドに自動的に適用されます。

    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 の価格」を参照してください。

  1. 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 キーを押してコマンドを終了できます。

  2. 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 パラメーターで指定された管理者アカウントのユーザー名とパスワード。
  1. 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
    
  2. 現在のクライアント 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 アドレス)を使用できます。

  3. 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 という名前の環境変数を作成します。
  1. 次のコマンドを実行して、ストレージ アカウントと接続を作成します。

    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))
    
  2. アプリ ユーザーが写真にアクセスできるように、BLOB パブリック アクセスを許可するようにストレージ アカウントを更新します。

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. az 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_NAME
    
  • Azure Cloud Shellローカル ブラウザーを開くことができないため、az webapp browse コマンドはサポートされません。 Cloud Shellから Web アプリを開く最も簡単な方法は、アプリのAzure ポータル ページの右上にある Default domain リンクを選択することです。

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

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

App Service、Azure Database for PostgreSQL、Azure Storage を使用したレストランレビュー機能を示すサンプルアプリのスクリーンショット

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

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

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

すべてのリソースが削除されるまでには多少時間がかかります。 --no-wait引数を指定すると、コマンドはすぐに戻ることができます。

Troubleshooting

このチュートリアルの実行に問題がある場合は、次のリソースを参照してください。