PostgreSQL を使用した Python Django Web アプリを Azure にデプロイする
このチュートリアルでは、データドリブン Python Web アプリ (Django) を、Azure Database for PostgreSQL リレーショナル データベース サービスを使用した Azure App Service にデプロイします。 Azure App Service は、Linux サーバー環境で Python をサポートしています。 必要な場合は、Flask チュートリアルまたは FastAPI チュートリアルを参照してください。
このチュートリアルでは、次の作業を行う方法について説明します。
- 既定でセキュリティ保護された App Service、PostgreSQL、Redis Cache アーキテクチャを作成します。
- マネージド ID と Key Vault 参照を使用して接続シークレットをセキュリティで保護する。
- Python サンプル アプリを GitHub リポジトリから App Service にデプロイします。
- アプリケーション コードで App Service の接続文字列とアプリ設定にアクセスします。
- アプリケーション コードを更新して再デプロイする。
- データベース移行を実行して、データベース スキーマを生成します。
- Azure から診断ログをストリーミングする。
- Azure portal でアプリを管理する。
- Azure Developer CLI を使用して、同じアーキテクチャをプロビジョニングし、デプロイする。
- GitHub Codespaces と GitHub Copilot を使用して開発ワークフローを最適化する。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます。
- GitHub アカウント。 1 つ無料で取得することもできます。
- Python と Django による開発に関する知識。
- (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます。
- Azure Developer CLI がインストールされていること。 Azure Developer CLI が既にインストールされているため、Azure Cloud Shell の手順に従うことができます。
- Python と Django による開発に関する知識。
- (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
最後までスキップする
このチュートリアルで Azure で実行されているサンプル アプリを表示したいだけである場合、Azure Cloud Shell で次のコマンドを実行し、プロンプトに従います。
mkdir msdocs-django-postgresql-sample-app
cd msdocs-django-postgresql-sample-app
azd init --template msdocs-django-postgresql-sample-app
azd up
1.サンプルを実行する
最初に、開始点としてサンプルのデータ駆動型アプリを設定します。 便宜のために、サンプル リポジトリには開発コンテナー構成が含まれています。 開発コンテナーには、データベース、キャッシュ、サンプル アプリケーションに必要なすべての環境変数など、アプリケーションの開発に必要なすべてのものが含まれています。 開発コンテナーは、GitHub codespace で実行できます。つまり、Web ブラウザーを使用して任意のコンピューターでサンプルを実行できます。
Note
独自のアプリでこのチュートリアルに従っている場合は、README.md の requirements.txt ファイルの説明を参照して、必要なパッケージを確認します。
手順 1: 新しいブラウザー ウィンドウ内で次を実行します。
- GitHub アカウントにサインインします。
- https://github.com/Azure-Samples/msdocs-django-postgresql-sample-app/fork に移動します。
- [メイン ブランチのみをコピーする] をオフにします。 すべてのブランチが必要です。
- [Create fork] (フォークの作成) を選択します。
手順 2: GitHub フォークで、次の操作を行います。
- スターター ブランチの [メイン]>[starter-no-infra] を選択します。 このブランチにはサンプル プロジェクトだけが含まれており、Azure 関連のファイルや構成はありません。
-
[コード]>[starter-no-infra に codespace を作成する] を選択します。
codespace の設定には数分かかり、最後にリポジトリ用の
pip install -r requirements.txt
が実行されます。 また、指定された .env ファイル には、Django がローカルで実行する必要があるダミーのSECRET_KEY
変数が既に含まれています。
手順 3: codespace ターミナルで次のことを行います。
-
python manage.py migrate
を使用して、データベースの移行を実行します。 -
python manage.py runserver
を使用してアプリを実行します。 - ''
Your application running on port 8000 is available.
'' という通知が表示されたら、[ブラウザーで開く] を選択します。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。アプリケーションを停止するには、Ctrl
+C
と入力します。
ヒント
このリポジトリについて GitHub Copilot に質問できます。 次に例を示します。
- @workspace このプロジェクトは何を行いますか?
- @workspace .devcontainer フォルダーは何を行いますか?
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
2. App Service、データベース、キャッシュを作成する
この手順では、Azure リソースを作成します。 このチュートリアルで使用する手順では、App Service、Azure Database for PostgreSQL、Azure Cache を含む、既定でセキュリティで保護された一連のリソースを作成します。 作成プロセスでは、次のように指定します。
-
名前: Web アプリの名前。 これは、アプリの DNS 名の一部として
https://<app-name>-<hash>.<region>.azurewebsites.net
の形式で使用されます。 - 世界でアプリを物理的に実行するためのリージョン。 これは、アプリの DNS 名の一部としても使用されます。
- アプリのランタイム スタック。 ここで、アプリに使う Python のバージョンを選びます。
- アプリのホスティング プラン。 これは、アプリの一連の機能と容量のスケーリングを含む価格レベルです。
- アプリのリソース グループ。 リソース グループを使うと、アプリケーションに必要なすべての Azure リソースを (論理コンテナーに) グループ化できます。
Azure portal にサインインし、以下の手順に従って Azure App Service リソースを作成します。
手順 1: Azure portal 内で次を実行します。
- Azure portal の上部にある検索バーに「Web app database」と入力します。
- [Marketplace] の見出しの下にある [Web アプリとデータベース] というラベルの付いた項目を選びます。 作成ウィザードに直接移動することもできます。
手順 2:[Web アプリとデータベースの作成] ページ内で、このフォームに次のように入力します。
- リソース グループ: [新規作成] を選択し、msdocs-django-postgres-tutorial という名前を使用します。
- [リージョン]: 近くの任意の Azure リージョン。
- 名前: msdocs-python-postgres-XYZ。
- ランタイム スタック: Python 3.12。
- データベース: 既定でデータベース エンジンとして [PostgreSQL - フレキシブル サーバー] が選択されています。 既定では、サーバー名とデータベース名も適切な値に設定されます。
- Azure Cache for Redis を追加しますか: はい。
- [ホスティング プラン]: [Basic]。 準備ができたら、運用価格レベルにスケールアップできます。
- [Review + create](レビュー + 作成) を選択します。
- 検証が完了した後、 [作成] を選択します。
手順 3: このデプロイは完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 App Service アプリに直接移動しますが、次のリソースが作成されます。
- [リソース グループ]: 作成されたすべてのリソースのコンテナー。
- [App Service プラン]: App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
- [App Service]: アプリを表し、App Service プランで実行されます。
- [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
- プライベート エンドポイント: 仮想ネットワーク内の Redis Cache のアクセス エンドポイント。
- ネットワーク インターフェイス: プライベート エンドポイントごとに 1 つのプライベート IP アドレスを表します。
- Azure Database for PostgreSQL フレキシブル サーバー: 仮想ネットワーク内からのみアクセス可能です。 サーバー上にデータベースとユーザーが作成されます。
- Azure Cache for Redis: プライベート ネットワークの背後からのみアクセスできます。
- プライベート DNS ゾーン: 仮想ネットワーク内のデータベース サーバーと Redis Cache の DNS 解決を有効にします。
3.接続シークレットをセキュリティで保護し、SECRET_KEY を追加する
作成ウィザードにより、接続変数がアプリの設定として自動的に生成されます。 ただし、セキュリティのベスト プラクティスは、App Service からシークレットを完全に排除することです。 シークレットをキー コンテナーに移動し、サービス コネクタのヘルプを使用してアプリ設定を [Key Vault 参照] に変更します。
手順 1: 既存の接続文字列を取得する
- App Service ページの左側のメニューで、[設定] > [環境変数] を選びます。
- [AZURE_POSTGRESQL_CONNECTIONSTRING] を選択します。
- [アプリケーション設定の追加/編集] の [値] フィールドで、文字列の末尾にある password= の部分を見つけます。
- 後で使用するために、password= の後のパスワード文字列をコピーしておきます。
このアプリ設定を使用すると、プライベート エンドポイントの背後でセキュリティ保護された Postgres データベースと Redis Cache に接続できます。 ただし、シークレットは App Service アプリに直接保存されますが、これは最適ではありません。 これを変更します。 また、Django アプリで必要な
SECRET_KEY
設定を追加します。
手順 2: シークレットを安全に管理するためのキー コンテナーを作成する
- 上部の検索バーに「キー コンテナー」と入力し、[Marketplace]>[Key Vault] を選択します。
- [リソース グループ] で、[msdocs-python-postgres-tutorial] を選択します。
- [キー コンテナー名] に、文字と数字のみで構成される名前を入力します。
- [リージョン] をリソース グループと同じ場所に設定します。
手順 3: プライベート エンドポイントを使用してキー コンテナーをセキュリティ保護する
- [ネットワーク] タブを選択します。
- [パブリック アクセスを有効にする] の選択を解除します。
- [プライベート エンドポイントを作成する] を選択します。
- [リソース グループ] で、[msdocs-python-postgres-tutorial] を選択します。
- ダイアログの [場所] で、App Service アプリと同じ場所を選択します。
- [名前] に「msdocs-python-postgres-XYZVaultEndpoint」と入力します。
- [仮想ネットワーク] で、[msdocs-python-postgres-XYZVnet] を選択します。
- [サブネット] で、[msdocs-python-postgres-XYZSubnet] を選択します。
- [OK] を選択します。
- [Review + create](確認と作成) を選択し、次に [作成] を選択します。 キー コンテナーのデプロイが完了するまで待ちます。 "デプロイが完了しました" と表示されます。
手順 4: PostgreSQL コネクタを構成する
- 上部の検索バーに「msdocs-python-postgres」と入力し、msdocs-python-postgres-XYZ という名前の App Service リソースを選択します。
- [App Service] ページの左側にあるメニューで、[設定] > [サービス コネクタ] を選択します。 既に 2 つのコネクタが存在していますが、これらはアプリ作成ウィザードによって作成されたものです。
- PostgreSQL コネクタの横にあるチェックボックスをオンにし、[編集] を選択します。
- [クライアントの種類] で、[Django] を選択します。 PostgreSQL サービス コネクタ内の Django クライアントの種類により、1 つの接続文字列ではなく、個別の設定でデータベース変数が提供されます。 これらの個別の変数の方が、Django の データベース設定で使用しやすいです。
- 認証 タブを選択します。
- [パスワード] に、先ほどコピーしたパスワードを貼り付けます。
- [シークレットを Key Vault に保存する] を選択します。
- [Key Vault 接続] で、[新規作成] を選択します。 [接続の作成] ダイアログが編集ダイアログの上に開きます。
手順 5: Key Vault の接続を確立する
- Key Vault 接続の [接続の作成] ダイアログの [キー コンテナー] で、前に作成したキー コンテナーを選びます。
- [確認および作成] を選択します。
- 検証が完了したら、[作成] を選択します。
手順 6: PostgreSQL コネクタの設定を完了する
- defaultConnector の編集ダイアログに戻ります。 [認証] タブで、キー コンテナー コネクタが作成されるまで待ちます。 完了すると、Key Vault 接続ドロップダウンで自動的に選択されます。
- [次へ: ネットワーク] を選択します。
- [保存] を選択します。 "更新に成功しました" という通知が表示されるまで待ちます。
手順 7: キー コンテナーのシークレットを使用するための Redis コネクタを構成する
- [サービス コネクタ] ページで、Cache for Redis コネクタの横にあるチェックボックスをオンにし、[編集] を選択します。
- 認証 タブを選択します。
- [シークレットを Key Vault に保存する] を選択します。
- [Key Vault 接続] で、作成したキー コンテナーを選択します。
- [次へ: ネットワーク] を選択します。
- [ターゲット サービスへのアクセスを有効にするようにファイアウォール規則を構成する] を選択します。 アプリ作成ウィザードでは、プライベート エンドポイントを使用して SQL データベースが既にセキュリティで保護されています。
- [保存] を選択します。 "更新に成功しました" という通知が表示されるまで待ちます。
手順 8: キー コンテナー統合を確認する
- 左側のメニューで、もう一度 [設定] > [環境変数] を選びます。
-
[AZURE_POSTGRESQL_PASSWORD] の横にある [値の表示] を選択します。 値は
@Microsoft.KeyVault(...)
になります。これは、シークレットがキー コンテナーで管理されるようになったため、これがキー コンテナー参照であることを意味します。 - Redis の接続文字列を確認するには、[AZURE_REDIS_CONNECTIONSTRING] の横にある [値を表示] を選択します。
手順 9: サンプル アプリケーションは、SECRET_KEY 環境変数を読み取り、必要な SECRET_KEY 設定を行います。 この手順では、これをアプリ設定として作成します。
- [アプリ設定] タブで [追加] を選択します。
- [名前] を SECRET_KEY に設定します。
- [値] を長いランダムな文字列に設定します。
- [適用]、[適用]、[確認] の順にクリックします。
まとめると、接続シークレットをセキュリティで保護するためのプロセスには次の作業が含まれます。
- App Service アプリの環境変数から接続シークレットを取得する。
- キー コンテナーを作成する。
- システム割り当てマネージド ID を使用してキー コンテナー接続を作成する。
- キー コンテナーにシークレットを格納するようにサービス コネクタを更新する。
Note
SECRET_KEY
アプリ設定もキー コンテナー参照として構成するのが理想的です。これはマルチステップ プロセスです。 詳細については、「SECRET_KEY アプリ設定をキー コンテナー参照に変更するにはどうすればいいですか?」を参照してください
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
4.サンプル コードをデプロイする
この手順では、GitHub Actions を使用して GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push
があるたびにビルドとデプロイのアクションが起動されます。
手順 1: 左側のメニューで、[デプロイ]>[デプロイ センター] を選択します。
手順 2: [デプロイ センター] ページで次のことを行います。
- [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。
- GitHub アカウントにサインインし、プロンプトに従って Azure を承認します。
- [組織] で、自分のアカウントを選びます。
- [リポジトリ] で msdocs-django-postgresql-sample-app を選びます。
- [ブランチ] で、[starter-no-infra] を選択します。 これは、Azure 関連のファイルや構成を含まない、サンプル アプリで作業したのと同じブランチです。
- [認証の種類] で、[ユーザー割り当て ID] を選択します。
- 上部のメニューから、[保存] を選択します。
App Service は、選んだ GitHub リポジトリの
.github/workflows
ディレクトリに、ワークフロー ファイルをコミットします。 既定では、デプロイ センターでは Microsoft Entra (OIDC 認証) を使用して、認証するワークフローのユーザー割り当て ID を作成します。 代替認証オプションについては、「GitHub Actions を使用した App Service へのデプロイ」を参照してください。
手順 3: サンプル フォークの GitHub codespace に戻り、git pull origin starter-no-infra
を実行します。
これにより、新しくコミットされたワークフロー ファイルが codespace にプルされます。
ステップ 4 (オプション 1: GitHub Copilot を使用する):
- [チャット] ビューを選択し、+ を選択して、新しいチャット セッションを開始します。
- "@workspace アプリはデータベースと Redis にどのように接続しますか?" と質問します。Copilot から、この設定が azureproject/development.py と azureproject/production.py でどのように構成されているかについて何らかの説明が示される場合があります。
- "@workspace 実稼働モードでは、私のアプリは App Service Web アプリで実行されています。この Web アプリは、Azure Service Connector を使用して、Django クライアントの種類を使用して PostgreSQL フレキシブル サーバーに接続します。私が使用する必要がある環境変数は何ですか?" と質問します。Copilot から、後述のオプション 2: GitHub Copilot を使用しないのステップと同様のコード候補が示され、場合によっては azureproject/production.py ファイルで変更を行うように指示されることもあります。
- エクスプローラーで azureproject/production.py を開き、このコード候補を追加します。
- "@workspace 私の App Service アプリは、Azure Service Connector を使用して、Django クライアントの種類を使用して Cache for Redis にも接続します。 私が使用する必要がある環境変数は何ですか?" と質問します。Copilot から、後述のオプション 2: GitHub Copilot を使用しないのステップと同様のコード候補が示され、場合によっては azureproject/production.py ファイルで変更を行うように指示されることもあります。
- コード候補を追加します。 GitHub Copilot は毎回同じ応答を提供するわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。
ステップ 4 (オプション 2: GitHub Copilot を使用しない):
- エクスプローラーで "Program.cs" を開きます。
- コメント化されたコード (行 29-48) を見つけ、それをコメント解除します。
これにより、
AZURE_POSTGRESQL_USER
、AZURE_POSTGRESQL_PASSWORD
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_NAME
、AZURE_REDIS_CONNECTIONSTRING
を使用して PostgreSQL と Redis の接続が作成されます。
手順 5:
- [ソース管理] 拡張機能を選びます。
- テキスト ボックスに、
Configure Azure database and cache connectons
のようなコミット メッセージを入力します。 または、を選択し、GitHub Copilot でコミット メッセージを生成します。
- [コミット] を選択し、[はい] で確定します。
- [変更の同期 1] を選択し、[OK] で確認します。
手順 6: Azure portal 内の [デプロイ センター] ページ内に戻り、次のことを行います。
- [ログ] タブを選択し、[最新の情報に更新] を選択して、新しいデプロイの実行を確認します。
- デプロイの実行のログ項目で、最新のタイムスタンプを持つ [ビルドまたはデプロイ ログ] エントリを選びます。
手順 7: GitHub リポジトリに移動したら、GitHub アクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイという 2 つの異なるステージを定義します。 GitHub が実行され、[Success] の状態が表示されるまで待ちます。 所要時間は約 5 分です。
問題がある場合は、 トラブルシューティング ガイドを確認してください。
5.データベース スキーマを生成する
PostgreSQL データベースは仮想ネットワークによって保護されているため、Django データベースの移行を実行する最も簡単な方法は、SSH セッション内で App Service の Linux コンテナーを使用することです。
手順 1: [App Service] ページに戻り、左側のメニューで
- [開発ツール]>[SSH] を選択します。
- [Go] \(移動) を選択します。
手順 2: SSH セッション内で python manage.py migrate
を実行します。 それに成功すると、App Service はデータベースに正常に接続した状態になります。
ヒント
SSH セッションでは、 /home
内のファイルに対する変更のみが、アプリの再起動後も保持されます。
/home
の外部の変更は永続化されません。 SSH セッションは、python manage.py createsuperuser
を使用したユーザーの作成など、一般的な python manage.py
コマンドを実行する場合に役立ちます。 詳細については、django の django-admin と manage.py に関するドキュメントを参照してください。 Web サイトの /admin
の部分にアクセスするには、スーパーユーザー アカウントを使用します。
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
6.アプリの参照
手順 1: [App Service] ページ内で、次を実行します。
- 左側のメニューから [概要] を選びます。
- アプリの URL を選びます。
手順 2: 一覧にレストランをいくつか追加します。 おめでとうございます。Azure Database for PostgreSQL へのセキュリティで保護された接続を使用して、Azure App Service で Web アプリを実行できました。
7.診断ログをストリーミングする
Azure App Service はコンソール ログをすべてキャプチャするので、アプリケーションに関する問題の診断に役立ちます。 次に示すように、サンプル アプリには、この機能を示す print()
ステートメントが含まれています。
def index(request):
print('Request for index page received')
restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
lastViewedRestaurant = request.session.get("lastViewedRestaurant", False)
手順 1: [App Service] ページ内で、次を実行します。
- 左側のメニューから [監視]>[App Service ログ] を選択します。
- [アプリケーション ログ記録] で [ファイル システム] を選びます。
- 上部のメニューから、[保存] を選択します。
手順 2:左側のメニューから [ログ ストリーム] を選択します。 プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。
Python アプリでのログ記録の詳細については、Python アプリケーション用の Azure Monitor の設定に関するシリーズを参照してください。
8.リソースをクリーンアップする
完了したら、リソース グループを削除することで、Azure サブスクリプションからすべてのリソースを削除できます。
手順 1: Azure portal の上部にある検索バーで次を行います。
- リソース グループ名を入力します。
- リソース グループを選択します。
手順 2: [リソース グループ] ページ内で、[リソース グループの削除] を選びます。
ステップ 3:
- リソース グループの名前を入力して、削除を確定します。
- [削除] を選択します。
2.Azure リソースを作成してサンプル アプリをデプロイする
このステップでは、Azure リソースを作成し、サンプル アプリを App Service on Linux にデプロイします。 このチュートリアルで使用する手順では、App Service、Azure Database for PostgreSQL、Azure Cache for Redis を含む、既定でセキュリティで保護された一連のリソースを作成します。
開発コンテナーには、既に Azure Developer CLI (AZD) が含まれています。
リポジトリのルートから、
azd init
を実行します。azd init --template python-app-service-postgresql-infra
メッセージが表示されたら、次の回答を入力します。
Question Answer The current directory is not empty. (現在のディレクトリが空ではありません。) Would you like to initialize a project here in '<your-directory>'? ('<ディレクトリ>' でプロジェクトを初期化しますか?) Y What would you like to do with these files? (これらのファイルをどうしますか?) Keep my existing files unchanged (既存のファイルを変更しないでそのままにする) Enter a new environment name (新しい環境の名前を入力してください) 一意の名前を入力します。 AZD テンプレートでは、この名前を Azure での Web アプリの DNS 名の一部として使用します ( <app-name>-<hash>.azurewebsites.net
)。 英数字とハイフンを使用できます。azd auth login
コマンドを実行し、プロンプトに従って Azure にサインインします。azd auth login
azd provision
コマンドを使用して必要な Azure リソースを作成します。 プロンプトに従って、Azure リソースの目的のサブスクリプションと場所を選択します。azd provision
azd provision
コマンドが完了するまで約 15 分かかります (大部分の時間は Redis キャッシュに費やされます)。 後で、App Service を操作するためにコードを変更し、azd deploy
を使用して変更をデプロイします。 実行中、このコマンドは、Azure のデプロイへのリンクを含む、プロビジョニングとデプロイのプロセスに関するメッセージを提供します。この AZD テンプレートには、次の Azure リソースを使用して既定でセキュリティ保護されたアーキテクチャを生成するファイル (azure.yaml と infra ディレクトリ) が含まれています。
- [リソース グループ]: 作成されたすべてのリソースのコンテナー。
- [App Service プラン]: App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
- [App Service]: アプリを表し、App Service プランで実行されます。
- [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
- プライベート エンドポイント: 仮想ネットワーク内のキー コンテナーと Redis キャッシュのアクセス エンドポイント。
- ネットワーク インターフェイス: プライベート エンドポイントごとに 1 つのプライベート IP アドレスを表します。
- Azure Database for PostgreSQL フレキシブル サーバー: 仮想ネットワーク内からのみアクセス可能です。 サーバー上にデータベースとユーザーが作成されます。
- プライベート DNS ゾーン: 仮想ネットワーク内の PostgreSQL サーバーの DNS 解決を有効にします。
- [Log Analytics ワークスペース]: アプリでログを配布するためのターゲット コンテナーとして機能します。ここでは、ログにクエリを実行することもできます。
- Azure Cache for Redis: プライベート エンドポイントの背後からのみアクセスできます。
- キー コンテナー: プライベート エンドポイントの背後からのみアクセスできます。 App Service アプリのシークレットを管理するために使用されます。
コマンドによるリソースの作成とアプリケーション コードのデプロイが初めて完了したときには、デプロイされたサンプル アプリはまだ機能しません。これは、Azure のデータベースに接続するために少し変更を加える必要があるためです。
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
3.データベース接続文字列を使用する
使用している AZD テンプレートにより、接続変数がアプリ設定として既に自動的に生成されており、それらが便宜のためにターミナルに出力されます。 アプリの設定は、接続のシークレットをコード リポジトリに残さないための 1 つの方法です。
AZD の出力で、設定
AZURE_POSTGRESQL_USER
、AZURE_POSTGRESQL_PASSWORD
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_NAME
、AZURE_REDIS_CONNECTIONSTRING
を見つけます。 シークレットを安全に保つため、設定の名前のみが表示されます。 これらは、AZD の出力では次のようになります。App Service app has the following connection settings: - AZURE_POSTGRESQL_NAME - AZURE_POSTGRESQL_HOST - AZURE_POSTGRESQL_USER - AZURE_POSTGRESQL_PASSWORD - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE
便宜のために、AZD テンプレートでは、アプリのアプリ設定ページへの直接リンクが示されます。 そのリンクを見つけ、それを新しいブラウザー タブで開きます。
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
4.サンプル コードを変更して再デプロイする
GitHub codespace で、[チャット] ビューを選択し、次に [+] を選択して、新しいチャット セッションを開始します。
"@workspace アプリはデータベースにどのように接続しますか?" と質問します。Copilot から、この接続設定が azureproject/development.py と azureproject/production.py でどのように構成されているかについて何らかの説明が示される場合があります。
"@workspace 実稼働モードでは、私のアプリは App Service Web アプリで実行されています。この Web アプリは、Azure Service Connector を使用して、Django クライアントの種類を使用して PostgreSQL フレキシブル サーバーに接続します。私が使用する必要がある環境変数は何ですか?" と質問します。Copilot から、後述のオプション 2: GitHub Copilot を使用しないのステップと同様のコード候補が示され、場合によっては azureproject/production.py ファイルで変更を行うように指示されることもあります。
エクスプローラーで azureproject/production.py を開き、このコード候補を追加します。
GitHub Copilot は毎回同じ応答を提供するわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。
ターミナルで
azd deploy
を実行します。azd deploy
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
5.データベース スキーマを生成する
PostgreSQL データベースは仮想ネットワークによって保護されているため、Django データベースの移行を実行する最も簡単な方法は、SSH セッション内で App Service の Linux コンテナーを使用することです。
AZD の出力で、SSH セッションの URL を見つけ、ブラウザーでそこに移動します。 出力では次のようになります。
Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
SSH セッション内で
python manage.py migrate
を実行します。 それに成功すると、App Service はデータベースに正常に接続した状態になります。Note
/home
内のファイルへの変更のみが、アプリの再起動後も保持されます。/home
の外部の変更は永続化されません。
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
6.アプリの参照
AZD の出力で、アプリの URL を見つけ、ブラウザーでそこに移動します。 URL は、AZD の出力では次のようになります。
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>.azurewebsites.net/
一覧にいくつかのレストランを追加します。
おめでとうございます。Azure Database for PostgreSQL へのセキュリティで保護された接続を使用して、Azure App Service で Web アプリを実行できました。
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
7.診断ログをストリーミングする
Azure App Service はコンソール ログをキャプチャできるので、アプリケーションに関する問題の診断に役立ちます。 便宜のために、AZD テンプレートでは、既にローカル ファイル システムへのログ記録が有効になっており、それらのログが Log Analytics ワークスペースに配布されています。
サンプル アプリには、次のスニペットに示すように、この機能を実際に行う print()
ステートメントが含まれています。
def index(request):
print('Request for index page received')
restaurants = Restaurant.objects.annotate(avg_rating=Avg('review__rating')).annotate(review_count=Count('review'))
lastViewedRestaurant = request.session.get("lastViewedRestaurant", False)
AZD の出力で、App Service ログをストリーミングするためのリンクを見つけ、ブラウザーでそこに移動します。 このリンクは、AZD の出力では次のようになります。
Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
Python アプリでのログ記録の詳細については、Python アプリケーション用の Azure Monitor の設定に関するシリーズを参照してください。
問題がある場合は、 「トラブルシューティング」セクションを確認してください。
8.リソースをクリーンアップする
現在のデプロイ環境内のすべての Azure リソースを削除するには、azd down
を実行し、プロンプトに従います。
azd down
トラブルシューティング
このチュートリアルの作業中に発生する可能性がある問題と、それらを解決する手順を次に示します。
SSH セッションに接続できません
SSH セッションに接続できない場合は、アプリ自体が起動に失敗しています。 詳細については、診断ログを確認してください。 たとえば、KeyError: 'AZURE_POSTGRESQL_HOST'
のようなエラーが表示された場合は、環境変数が存在しないことを意味する可能性があります (アプリの設定を削除した可能性があります)。
データベース移行の実行時にエラーを受け取ります
データベースへの接続に関連するエラーが発生する場合は、アプリの設定 (AZURE_POSTGRESQL_USER
、AZURE_POSTGRESQL_PASSWORD
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_NAME
) が変更または削除されていないかどうかを確認します。 接続文字列がないと、migrate コマンドでデータベースと通信できません。
よく寄せられる質問
- この設定にはいくらかかりますか。
- 仮想ネットワークの背後でセキュリティ保護されている PostgreSQL サーバーに他のツールで接続するにはどうすればよいですか?
- GitHub Actions でのローカル アプリの開発はどのように行いますか。
- Azure App Service 上で動作する Django サンプルはどのように構成されていますか?
- SECRET_KEY アプリ設定をキー コンテナー参照に変更するにはどうすればいいですか?
- GitHub Actions のデプロイ中に発生したエラーをデバッグする方法を教えてください
- ユーザー割り当て ID を作成するためのアクセス許可がありません
- 自分のコードスペースで GitHub Copilot を使用して何ができますか?
この設定にはいくらかかりますか。
作成したリソースの価格は次のとおりです。
- App Service プランは Basic レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
- PostgreSQL フレキシブル サーバーは、ストレージ サイズが最小な、最も低いバースト可能レベルである Standard_B1ms に作成されます。スケールアップまたはダウンすることができます。 Azure Database for PostgreSQL の価格に関するページを参照してください。
- 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 「Azure Virtual Network の価格」を参照してください。
- プライベート DNS ゾーンでは、少額の料金が発生します。 「Azure DNS の価格」を参照してください。
仮想ネットワークの背後でセキュリティ保護されている PostgreSQL サーバーに他のツールで接続するにはどうすればよいですか?
- コマンドライン ツールからの基本的なアクセスには、アプリの SSH セッションから
psql
を実行できます。 - デスクトップ ツールから接続するには、マシンが仮想ネットワーク内にある必要があります。 たとえば、サブネットの 1 つに接続されている Azure VM、または Azure 仮想ネットワークとサイト間 VPN で接続されているオンプレミス ネットワーク内のマシンが該当します。
- また、仮想ネットワークに Azure Cloud Shell を統合することもできます。
GitHub Actions でのローカル アプリの開発はどのように行いますか。
App Service から自動生成されたワークフロー ファイルを例として使用すると、git push
ごとに新しいビルドとデプロイの実行が起動されます。 GitHub リポジトリのローカル クローンから、必要な更新を行い、GitHub にプッシュします。 次に例を示します。
git add .
git commit -m "<some-message>"
git push origin main
Azure App Service 上で動作する Django サンプルはどのように構成されていますか?
Azure App Service 内で動作するように、Django サンプル アプリケーションによって azureproject/production.py ファイル内の設定が構成されます。 このような変更は、Django を運用環境にデプロイする場合に一般的であり、App Service に固有のものではありません。
Django によって、受信要求の HTTP_HOST ヘッダーが検証されます。 このサンプル コードでは、App Service の
WEBSITE_HOSTNAME
環境変数を使って、アプリのドメイン名を Django の ALLOWED_HOSTS 設定に追加します。# Configure the domain name using the environment variable # that Azure automatically creates for us. ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
Django では、運用環境で静的ファイルを提供することはサポートされていません。 このチュートリアルでは、WhiteNoise を使用して、ファイルを提供できるようにします。 WhiteNoise パッケージは requirements.txt を使って既にインストールされ、そのミドルウェアが一覧に追加されています。
# WhiteNoise configuration MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # Add whitenoise middleware after the security middleware 'whitenoise.middleware.WhiteNoiseMiddleware',
次に、Django のドキュメントに従って静的ファイル設定を構成します。
SESSION_ENGINE = "django.contrib.sessions.backends.cache" STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
詳細については、「Django アプリの運用設定」を参照してください。
SECRET_KEY アプリ設定をキー コンテナー参照に変更するにはどうすればいいですか?
上記のポータルの手順で、Cloud Shell で次の Azure CLI コマンドを実行することで、SECRET_KEY
をキー コンテナー参照に変更できます。
# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=djangoSecretKey
# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID
# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
--assignee $(az ad signed-in-user show --query id -o tsv) \
--role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
--scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)
# Add the secret to the key vault
az keyvault secret set \
--vault-name $KEY_VAULT_NAME \
--name $SECRET_NAME \
--value $(python -c 'import secrets; print(secrets.token_hex())')
# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $APP_SERVICE_NAME \
--settings "SECRET_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"
ポータルで同じ操作を実行することもできます。 詳細については、以下を参照してください:
GitHub Actions のデプロイ中に発生したエラーをデバッグする方法を教えてください
自動生成された GitHub ワークフロー ファイルでステップが失敗した場合は、失敗したコマンドを変更して、より詳細な出力を生成してみてください。 たとえば、-d
オプションを追加することで、python
コマンドからより多くの出力を取得できます。 変更をコミットおよびプッシュして、App Service への別のデプロイをトリガーします。
ユーザー割り当て ID を作成するためのアクセス許可がありません
「デプロイ センターから GitHub Actions デプロイを設定する」を参照してください。
自分のコードスペースで GitHub Copilot を使用して何ができますか?
コードスペースを作成したときに、既に GitHub Copilot チャット ビューが表示されていることに気付かれたかもしれません。 便宜のために、GitHub Copilot チャット拡張機能をコンテナー定義 (.devcontainer/devcontainer.json を参照) に含めています。 ただし、GitHub Copilot アカウント (30 日間の無料試用版を利用できます) が必要です。
GitHub Copilot に話しかけるときのヒントを、いくつか次に示します。
- 1 つのチャット セッションでは、質問と回答は相互に基づいて構築されていくので、質問を調整すると、得られる回答を絞り込むことができます。
- 既定では、GitHub Copilot からリポジトリ内のファイルにはアクセスできません。 ファイルに関する質問を問い合わせるには、まず、エディターでファイルを開きます。
- GitHub Copilot がその回答を準備するときにリポジトリ内のすべてのファイルにアクセスできるようにするには、
@workspace
で質問を開始します。 詳細については、Use the @workspace agentを参照してください。 - チャット セッションでは、GitHub Copilot は変更を提案でき、場合によっては (
@workspace
を使用して) 変更を行う箇所も提案できますが、変更を行うことはできません。 提案された変更を追加してテストするかどうかは、ご自身が決める必要があります。
次のステップ
次のチュートリアルに進み、カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法を学習してください。
App Service で Python アプリが実行される方法を確認する: