次の方法で共有


チュートリアル: Service Connector を使用して、Azure App Service 上の Postgres を使用して Django アプリを構築する

このチュートリアルでは、サービス コネクタを使って Web アプリをデータベース サービスに接続します。 このチュートリアルは App Service チュートリアルの改訂版であるため、いくつかの類似点が見られる場合があります。 どのような場合にサービス コネクタが役に立ち、App Service のチュートリアルで説明されている接続プロセスが簡単になるのかについては、「Postgres データベースへのパスワードレス コネクタを作成する」セクションをご覧ください。

このチュートリアルでは、データ ドリブン Python Django Web アプリを Azure App Service にデプロイし、Azure Database for PostgreSQL フレキシブル サーバー データベースに接続する方法について説明します。

このチュートリアルでは、Azure CLIを使用して次のタスクを実行します。

  • PythonとAzure CLIを使用して初期環境を設定する
  • Azure Database for PostgreSQL フレキシブル サーバー データベースを作成する
  • Azure App Serviceにコードをデプロイし、PostgreSQL フレキシブル サーバーに接続する
  • コードを更新して再デプロイする
  • 診断ログを表示する
  • Azure ポータルで Web アプリを管理する

初期環境を設定する

  • CloudShell
  • ローカル シェル

Azure ポータルで Azure Cloud Shell から起動し、Azure CLIのサービス コネクタのパスワードなしの拡張機能をインストールします。

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

サンプル アプリをクローンまたはダウンロードする

  • git clone
  • ダウンロード

サンプル リポジトリをクローンします。

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

次のフォルダーに移動します。

cd serviceconnector-webapp-postgresql-django-passwordless

このチュートリアルでは、Django Web アプリをAzure App Serviceにデプロイします。 Web アプリは、システム割り当てマネージド アイデンティティ (パスワードレス接続) と Azure のロールベースのアクセス制御を使用して、Azure Storage および Azure Database for PostgreSQL - フレキシブル サーバー リソースにアクセスします。 このコードでは、Pythonの DefaultAzureCredential クラスAzure Id クライアント ライブラリを使用します。 DefaultAzureCredential クラスは、App Service のマネージド ID が存在することを自動的に検出し、それを使用して他のAzure リソースにアクセスします。

  • 運用環境の設定は、azuresite/production.py ファイルにあります。 開発環境の設定は、azuresite/settings.py にあります。
  • 環境変数を設定すると、アプリで運用環境の設定が使用されます。 Azure App Serviceは、この変数を Web アプリの URL (msdocs-django.azurewebsites.net など) に自動的に設定します。

運用環境の設定は、任意の運用環境で実行するために Django を構成する場合に固有であり、App Service に固有なものではありません。 詳細については、Django デプロイ チェックリストに関するページを参照してください。 一部の変更の詳細については、 Azure での Django の再現設定に関するページも参照してください。

お困りですか? お知らせください。

Azure で Postgres データベースを作成する

  1. チュートリアルに必要な環境変数を設定します。

    LOCATION="eastus"
    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="{your database password}"
    

    重要

    には、次のうちの 3 つのカテゴリの、8 から 128 文字が含まれている必要があります。英大文字、英小文字、数字、英数字以外の文字のうち、3 つのカテゴリの文字が含まれている必要があります。 ユーザー名やパスワードを作成する際には、特定の文字を使用しないでください。 後で、これらの値を使用して環境変数を作成します。$ 文字は、Python アプリの実行に使用される Linux コンテナー内で特定の意味を持ちます。

  2. リソース グループを作成します (必要に応じて名前を変更できます)。 リソース グループ名はキャッシュされ、後続のコマンドに自動的に適用されます。

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    
  3. データベース サーバーを作成します。 現在のクライアント IP アドレスへのアクセスを有効にするように求められたら、"はい" を意味する を入力します。 このプロセスには数分かかります。

    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
      --active-directory-auth Enabled
    

    az コマンドが認識されない場合は、「初期環境を設定するで説明されているようにAzure CLIがインストールされていることを確認してください。

    az postgres flexible-server create コマンドでは、次のアクションが実行されます (数分かかります)。

    • キャッシュされた名前がまだ存在していない場合は、既定のリソース グループを作成します。
    • PostgreSQL フレキシブル サーバーを作成します:
      • パラメーターで指定されたサーバー名。 名前は、すべてのAzureで一意である必要があります。
      • SKUがパラメーターで指定されています。
    • と パラメーターで指定されたユーザー名とパスワードを使って、管理者アカウントを作成します。
    • パラメーターで指定された名前のデータベースを作成します。
  4. az postgres flexible-server firewall-rule create コマンドを使用して、サーバーでファイアウォール規則を構成します。 この規則は、ローカル環境からサーバーへのアクセスを許可します。 (前のステップでクライアント IP アドレスからのアクセスを有効にするように求められた場合は、このステップをスキップできます)。

    IP_ADDRESS=<your IP>
    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
    

    任意のツールや Web サイトを使用してあなたの IP アドレスを表示させ、それをコマンドに置き換えてください。 たとえば、「What's My IP Address?」という Web サイトを使用できます。

  5. az postgres flexible-server execute コマンドを使用して、データベースを作成します。

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

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

このセクションでは App Service アプリでアプリ ホストを作成し、このアプリを Postgres データベースに接続して、そのホストにコードをデプロイします。

App Service アプリを作成する

  1. ターミナルで、現在の場所がアプリ コードを含む serviceconnector-webapp-postgresql-django-passwordless リポジトリ フォルダーであることを確認します。

  2. 次の コマンドを実行して、アプリの App Service ホストを作成します。

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.9 \
      --sku B1
    

    sku は App Service プランのサイズ (CPU、メモリ) とコストを定義します。 B1 (Basic) サービス プランでは、Azure サブスクリプションで少額のコストが発生します。 App Service プラン一覧は、 [App Serviceの価格] のページをご覧ください。

    このコマンドでは、前の コマンドからキャッシュされたリソース グループと場所を使用して (この例では リージョン内のグループ )、次のアクションが実行されます。これには数分かかる場合があります。

    • Basic 価格レベル (B1) で App Service プランを作成します。 を省略すると、既定値を使用できます。
    • App Service アプリを作成します。
    • アプリの既定のログを有効にします。
    • ビルド オートメーションを有効にし、ZIP デプロイを使用してリポジトリをアップロードします。
  3. az webapp config set コマンドを使用して、リポジトリで start.sh を使用するようにアプリ サービスを構成します。

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Postgres データベースへのパスワードレス コネクタを作成する

このコードが App Service にデプロイされたので、次の手順は、Azureの Postgres データベースにアプリを接続することです。 アプリ コードでは、PostgreSQL フレキシブル サーバーの場合は AZURE_POSTGRESQL_CONNECTIONSTRING という名前の環境変数と、Azure Storage アカウントの場合は AZURE_STORAGEBLOB_RESOURCEENDPOINT という名前の環境変数でデータベース情報を検索することが想定されています。

Service Connector コマンドは、Azure StorageリソースとAzure Database for PostgreSQLリソースをマネージドアイデンティティとAzureロールベースのアクセス制御を使用するように構成します。 このコマンドは、Web アプリをこれらのリソースに接続するアプリ設定を App Service で作成します。 コマンドからの出力には、パスワードレス機能を有効にするために実行されたサービス コネクタのアクションが一覧表示されます。

az webapp connection create postgres-flexible コマンドを使用して PostgreSQL サービス コネクタを追加します。 この場合、システム割り当てマネージド ID は、ターゲット リソース PostgreSQL に対して Web アプリを認証するために使用されます。

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

"The subscription is not registered to use Microsoft.ServiceLinker (サブスクリプションが Microsoft.ServiceLinker を使用するように登録されていません)" というエラー メッセージが表示される場合は、 を実行して Service Connector リソース プロバイダーを登録し、接続コマンドを再度実行してください。

Python コードでは、os.environ.get('AZURE_POSTGRESQL_HOST') などのステートメントを使用して、これらの設定に環境変数としてアクセスします。 詳細については、「環境変数へのアクセス」を参照してください。

お困りですか? まず、トラブルシューティング ガイドを参照し、それでも解決しない場合はお知らせください。

ストレージ アカウントを作成して接続する

  1. az webapp connection create storage-blob コマンドを使ってストレージ アカウントを作成し、次の構成を行うサービス コネクタを作成します。
  • Web アプリでシステム割り当てマネージド ID を有効にします

  • 新しく作成されたストレージ アカウントに、"ストレージ BLOB データ共同作成者" ロールを持つ Web アプリを追加します。

  • Web アプリからのアクセスを受け入れるように、ストレージ アカウントのネットワークを構成します。

    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))
    
  1. ストレージ アカウントを更新して、"レストラン アプリ" のユーザーが画像にアクセスするための BLOB パブリック アクセスを許可します。

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  2. az storage container create コマンドを使用して、ストレージ アカウントにコンテナーを作成します。 新しく作成されたコンテナー内の 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 アプリをテストする

サンプル Python アプリでは、azure.identity パッケージとそのDefaultAzureCredential クラスを使用します。 アプリがAzureで実行されている場合、DefaultAzureCredential は App Service のマネージド ID が存在するかどうかを自動的に検出し、存在する場合は、それを使用して他のAzure リソース (この場合はストレージと PostgreSQL) にアクセスします。 これらのリソースにアクセスするために、ストレージ キー、証明書、または資格情報を App Service に提供する必要はありません。

  1. デプロイされたアプリケーションの URL () を参照します。

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

  2. サンプル アプリの機能をテストするには、レストランと、レストランの写真付きのレビューをいくつか追加します。 レストランやレビュー情報はAzure Database for PostgreSQLに保存され、写真はAzure Storageに保存されます。 スクリーンショットの例を次に示します。

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

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

アプリを残しておく場合、または別のチュートリアルに進む場合は、「次のステップ」に進んでください。 それ以外の場合は、継続して料金が発生しないように、このチュートリアルで作成したリソース グループを削除します。

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

リソース グループを削除することによって、その中に含まれるすべてのリソースの割り当て解除と削除も行われます。 このコマンドを使用する前に、グループ内のリソースが不要になったことを確認してください。

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

お困りですか? お知らせください。

次のステップ

Service Connector の概念について学習する