このチュートリアルでは、データドリブン Python Web アプリ (Flask) を、Azure Database for PostgreSQL リレーショナル データベース サービスを使用した Azure App Service にデプロイします。 Azure App Service は、Linux サーバー環境で Python をサポートしています。 必要な場合は、Django チュートリアルまたは 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 と Flask による開発に関する知識。
- (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます。
- GitHub アカウント。 1 つ無料で取得することもできます。
- Azure Developer CLI がインストールされていること。 Azure Developer CLI が既にインストールされているため、Azure Cloud Shell の手順に従うことができます。
- Python と Flask による開発に関する知識。
- (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
最後までスキップする
このチュートリアルで Azure で実行されているサンプル アプリを表示したいだけである場合、Azure Cloud Shell で次のコマンドを実行し、プロンプトに従います。
mkdir msdocs-flask-postgresql-sample-app
cd msdocs-flask-postgresql-sample-app
azd init --template msdocs-flask-postgresql-sample-app
azd up
1.サンプルを実行する
最初に、開始点としてサンプルのデータ駆動型アプリを設定します。 便宜のために、サンプル リポジトリには開発コンテナー構成が含まれています。 開発コンテナーには、データベース、キャッシュ、サンプル アプリケーションに必要なすべての環境変数など、アプリケーションの開発に必要なすべてのものが含まれています。 開発コンテナーは、GitHub codespace で実行できます。つまり、Web ブラウザーを使用して任意のコンピューターでサンプルを実行できます。
注記
独自のアプリでこのチュートリアルに従っている場合は、README.md の requirements.txt ファイルの説明を参照して、必要なパッケージを確認します。
手順 1: 新しいブラウザー ウィンドウ内で次を実行します。
- GitHub アカウントにサインインします。
- https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app/fork に移動します。
- [メイン ブランチのみをコピーする] の選択を解除します。 すべてのブランチが必要です。
- [Create fork] (フォークの作成) を選択します。
手順 2: GitHub フォークで、次の操作を行います。
- スターターブランチには main>starter-no-infra を選択します。 このブランチにはサンプル プロジェクトだけが含まれており、Azure 関連のファイルや構成はありません。
-
[コード]>[starter-no-infra に codespace を作成する] を選択します。
コードスペースの設定には数分かかり、最後にリポジトリ用の
pip install -r requirements.txtが実行されます。
手順 3: codespace ターミナルで次のことを行います。
-
flask db upgradeを使用して、データベースの移行を実行します。 -
flask runを使用してアプリを実行します。 - ''
Your application running on port 5000 is available.'' という通知が表示されたら、[ブラウザーで開く] を選択します。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。アプリケーションを停止するには、Ctrl+Cと入力します。
ヒント
このリポジトリについて GitHub Copilot に質問できます。 次に例を示します。
- @workspace このプロジェクトは何を行いますか?
- @workspace .devcontainer フォルダーは何を行いますか?
問題がありますか? 「トラブルシューティング」セクションを確認してください。
2.App Service と PostgreSQL を作成する
この手順では、Azure リソースを作成します。 このチュートリアルで使用する手順では、App Service と Azure Database for PostgreSQL を含む既定でセキュリティで保護された一連のリソースを作成します。 作成プロセスでは、次のように指定します。
- 名前: Web アプリの名前。 アプリの DNS 名の一部として使用されます。
- 世界でアプリを物理的に実行するためのリージョン。 これは、アプリの DNS 名の一部としても使用されます。
- アプリのランタイム スタック。 ここで、アプリに使う Python のバージョンを選びます。
- アプリのホスティング プラン。 これは、アプリの一連の機能と容量のスケーリングを含む価格レベルです。
- アプリのリソース グループ。 リソース グループを使うと、アプリケーションに必要なすべての Azure リソースを (論理コンテナーに) グループ化できます。
Azure portal にサインインし、以下の手順に従って Azure App Service リソースを作成します。
手順 1: Azure portal 内で次を実行します。
- Azure portal の上部にある検索バーに「Web app database」と入力します。
- [Marketplace] の見出しの下にある [Web アプリとデータベース] というラベルの付いた項目を選びます。 作成ウィザードに直接移動することもできます。
手順 2:[Web アプリとデータベースの作成] ページ内で、このフォームに次のように入力します。
- リソース グループ: [新規作成] を選択し、msdocs-flask-postgres-tutorial という名前を使用します。
- [リージョン]: 近くの任意の Azure リージョン。
- 名前: msdocs-python-postgres-XYZ。
- ランタイム スタック: Python 3.14。
- データベース: 既定でデータベース エンジンとして [PostgreSQL - フレキシブル サーバー] が選択されています。 既定では、サーバー名とデータベース名も適切な値に設定されます。
- Azure Cache for Redis を追加しますか?: いいえ。
- [ホスティング プラン]: [Basic]。 準備ができたら、運用価格レベルにスケールアップできます。
- [Review + create](レビュー + 作成) を選択します。
- 検証が完了した後、 [作成] を選択します。
手順 3: このデプロイは完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 App Service アプリに直接移動しますが、次のリソースが作成されます。
- [リソース グループ]: 作成されたすべてのリソースのコンテナー。
- [App Service プラン]: App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
- [App Service]: アプリを表し、App Service プランで実行されます。
- [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
- ネットワーク インターフェイス: プライベート エンドポイントごとに 1 つのプライベート IP アドレスを表します。
- Azure Database for PostgreSQL フレキシブル サーバー: 仮想ネットワーク内からのみアクセス可能です。 サーバー上にデータベースとユーザーが作成されます。
- プライベート DNS ゾーン: 仮想ネットワーク内のキー コンテナーとデータベース サーバーの DNS 解決を有効にします。
3.セキュリティで保護された接続のシークレット
作成ウィザードにより、接続変数がアプリの設定として自動的に生成されます。 ただし、セキュリティのベスト プラクティスは、App Service からシークレットを完全に排除することです。 シークレットをキー ボールトに移動し、サービス コネクタを使用してアプリ設定を [Key Vault 参照] に変更します。
手順 1: 既存の接続文字列を取得する
- App Service ページの左側のメニューで、[設定] > [環境変数] を選びます。
- [AZURE_POSTGRESQL_CONNECTIONSTRING] を選択します。
- [アプリケーション設定の追加/編集] の [値] フィールドで、文字列の末尾にある password= の部分を見つけます。
- 後で使用するために、Password= の後のパスワード文字列をコピーしておきます。 このアプリ設定を使用すると、プライベート エンドポイントの背後でセキュリティ保護された Postgres データベースに接続できます。 ただし、シークレットは App Service アプリに直接保存されますが、これは最適ではありません。 これを変更します。
手順 2: シークレットを安全に管理するためのキー コンテナーを作成する
- 上部の検索バーに「キー コンテナー」と入力し、[Marketplace]> を選択します。
- [リソース グループ] で、[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] ページの左側にあるメニューで、[設定] > [サービス コネクタ] を選択します。 既にコネクタが存在しますが、これはアプリ作成ウィザードによって作成されたものです。
- PostgreSQL コネクタの横にあるチェックボックスをオンにし、[編集] を選択します。
- [クライアントの種類] で、[Django] を選択します。 Flask アプリを使用している場合でも、PostgreSQL サービス コネクタ内の Django クライアントの種類により、1 つの接続文字列ではなく、個別の設定でデータベース変数が提供されます。 この個別の変数の方が、SQLAlchemy を使用してデータベースに接続するアプリケーション コードで使用しやすいです。
- 認証 タブを選択します。
- [パスワード] に、先ほどコピーしたパスワードを貼り付けます。
- [シークレットを Key Vault に保存する] を選択します。
- [Key Vault 接続] で、[新規作成] を選択します。 [接続の作成] ダイアログが編集ダイアログの上に開きます。
手順 5: Key Vault の接続を確立する
- Key Vault 接続の [接続の作成] ダイアログの [キー コンテナー] で、前に作成したキー コンテナーを選びます。
- [確認および作成] を選択します。
- 検証が完了したら、[作成] を選択します。
手順 6: PostgreSQL コネクタの設定を完了する
- defaultConnector の編集ダイアログに戻ります。 [認証] タブで、キー コンテナー コネクタが作成されるまで待ちます。 完了すると、[Key Vault 接続]ドロップダウンで自動的に選択されます。
- [次へ: ネットワーク] を選択します。
- [保存] を選択します。 "更新に成功しました" という通知が表示されるまで待ちます。
手順 7: Key Vault 統合を確認する
- 左側のメニューで、もう一度 [設定] > [環境変数] を選びます。
-
[AZURE_POSTGRESQL_PASSWORD] の横にある [値の表示] を選択します。 値は
@Microsoft.KeyVault(...)になります。これは、シークレットがキー コンテナーで管理されるようになったため、これがキー コンテナー参照であることを意味します。
まとめると、接続シークレットをセキュリティで保護するためのプロセスには次の作業が含まれます。
- App Service アプリの環境変数から接続シークレットを取得する。
- キー コンテナーの作成。
- システム割り当てのマネージドアイデンティティを使用してキー保管庫の接続を作成する。
- キー コンテナーにシークレットを格納するようにサービス コネクタを更新する。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
4.サンプル コードをデプロイする
この手順では、GitHub Actions を使用して GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push があるたびにビルドとデプロイのアクションが起動されます。
手順 1: 左側のメニューで、[デプロイ]>[デプロイ センター] を選択します。
手順 2: [デプロイ センター] ページで次のことを行います。
- [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。
- GitHub アカウントにサインインし、プロンプトに従って Azure を承認します。
- [組織] で、自分のアカウントを選びます。
- [リポジトリ] で msdocs-flask-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アプリはデータベースにどのように接続しますか?Copilot では、
SQLAlchemyでの接続 URI の構成方法について説明する場合があります。 - "@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 を使用して何ができますか?」を参照してください。
ステップ 4 (オプション 2: GitHub Copilot を使用しない):
- エクスプローラーで "Program.cs" を開きます。
- コメント化されたコード (行 3-8) を見つけ、それをコメント解除します。
これにより、
AZURE_POSTGRESQL_USER、AZURE_POSTGRESQL_PASSWORD、AZURE_POSTGRESQL_HOST、AZURE_POSTGRESQL_NAMEを使用して SQLAlchemy の接続文字列が作成されます。
手順 5:
- [ソース管理] 拡張機能を選びます。
- テキスト ボックスに、
Configure Azure database connectionのようなコミット メッセージを入力します。 または、
を選択し、GitHub Copilot でコミット メッセージを生成します。 - [コミット] を選択し、[はい] で確定します。
- [変更の同期 1] を選択し、[OK] で確認します。
手順 6: Azure portal 内の [デプロイ センター] ページ内に戻り、次のことを行います。
- [ログ] タブを選択し、[最新の情報に更新] を選択して、新しいデプロイの実行を確認します。
- デプロイの実行のログ項目で、最新のタイムスタンプを持つ [ビルドまたはデプロイ ログ] エントリを選びます。
手順 7: GitHub リポジトリに移動したら、GitHub アクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイという 2 つの異なるステージを定義します。 GitHub が実行され、[Success] の状態が表示されるまで待ちます。 所要時間は約 5 分です。
問題がありますか? トラブルシューティング ガイドを確認してください。
5.データベース スキーマを生成する
PostgreSQL データベースは仮想ネットワークによって保護されているため、Flask データベースの移行を実行する最も簡単な方法は、SSH セッション内で App Service の Linux コンテナーを使用することです。
手順 1: [App Service] ページに戻り、左側のメニューで
- [開発ツール]>[SSH] を選択します。
- [Go] \(移動) を選択します。
手順 2: SSH セッション内で flask db upgrade を実行します。 それに成功すると、App Service はデータベースに正常に接続した状態になります。
ヒント
SSH セッションでは、 /home 内のファイルに対する変更のみが、アプリの再起動後も保持されます。
/home の外部の変更は永続化されません。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
6.アプリを参照する
手順 1: [App Service] ページ内で、次を実行します。
- 左側のメニューから [概要] を選びます。
- アプリの URL を選びます。
手順 2: 一覧にレストランをいくつか追加します。 おめでとうございます。Azure Database for PostgreSQL へのセキュリティで保護された接続を使用して、Azure App Service で Web アプリを実行できました。
7.診断ログをストリーミングする
Azure App Service はコンソール ログをすべてキャプチャするので、アプリケーションに関する問題の診断に役立ちます。 次に示すように、サンプル アプリには、この機能を示す print() ステートメントが含まれています。
@app.route('/', methods=['GET'])
def index():
print('Request for index page received')
restaurants = Restaurant.query.all()
return render_template('index.html', restaurants=restaurants)
手順 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 Developer CLI (AZD) が含まれています。
リポジトリのルートから、
azd initを実行します。azd init --template python-app-service-postgresql-infraメッセージが表示されたら、次の回答を入力します。
質問 回答 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 loginazd provisionコマンドを使用して必要な Azure リソースを作成します。 プロンプトに従って、Azure リソースの目的のサブスクリプションと場所を選択します。azd provisionazd 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を見つけます。 シークレットを安全に保つため、設定の名前のみが表示されます。 これらは、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 では、
SQLAlchemyでの接続 URI の構成方法について説明する場合があります。"@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 データベースは仮想ネットワークによって保護されているため、Flask データベースの移行を実行する最も簡単な方法は、SSH セッション内で App Service の Linux コンテナーを使用することです。
AZD の出力で、SSH セッションの URL を見つけ、ブラウザーでそこに移動します。 出力では次のようになります。
Open SSH session to App Service container at: <URL>
SSH セッション内で
flask db upgradeを実行します。 それに成功すると、App Service はデータベースに正常に接続した状態になります。注記
/home内のファイルへの変更のみが、アプリの再起動後も保持されます。/homeの外部の変更は永続化されません。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
6.アプリを参照する
AZD の出力で、アプリの URL を見つけ、ブラウザーでそこに移動します。 URL は、AZD の出力では次のようになります。
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
一覧にいくつかのレストランを追加します。
おめでとうございます。Azure Database for PostgreSQL へのセキュリティで保護された接続を使用して、Azure App Service で Web アプリを実行できました。
問題がありますか? 「トラブルシューティング」セクションを確認してください。
7.診断ログをストリーミングする
Azure App Service はコンソール ログをキャプチャできるので、アプリケーションに関する問題の診断に役立ちます。 便宜のために、AZD テンプレートでは、既にローカル ファイル システムへのログ記録が有効になっており、それらのログが Log Analytics ワークスペースに配布されています。
サンプル アプリには、次のスニペットに示すように、この機能を実際に行う print() ステートメントが含まれています。
@app.route('/', methods=['GET'])
def index():
print('Request for index page received')
restaurants = Restaurant.query.all()
return render_template('index.html', restaurants=restaurants)
AZD の出力で、App Service ログをストリーミングするためのリンクを見つけ、ブラウザーでそこに移動します。
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 でのローカル アプリの開発はどのように行いますか。
- 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
GitHub Actions のデプロイ中に発生したエラーをデバッグする方法を教えてください
自動生成された GitHub ワークフロー ファイルでステップが失敗した場合は、失敗したコマンドを変更して、より詳細な出力を生成してみてください。 たとえば、python オプションを追加することで、-d コマンドからより多くの出力を取得できます。 変更をコミットおよびプッシュして、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 アプリが実行される方法を確認する: