このチュートリアルでは、Azure Database for PostgreSQL リレーショナル データベース サービスを使用して、データドリブン Quarkus Web アプリケーションを Azure App Service にデプロイします。 Azure App Service では、Windows または Linux サーバー環境で Java Standard Edition (Java SE) がサポートされています。
このチュートリアルでは、以下の内容を学習します。
- Azure App Service と Azure Database for PostgreSQL フレキシブル サーバー用に既定でセキュリティ保護されるアーキテクチャを作成します。
- マネージド ID と Key Vault 参照を使用して接続シークレットをセキュリティで保護する。
- GitHub リポジトリからサンプルの Quarkus アプリを App Service にデプロイする。
- アプリケーション コード内で App Service アプリの設定にアクセスする。
- アプリケーション コードを更新して再デプロイする。
- データベース移行を実行して、データベース スキーマを生成します。
- Azure から診断ログをストリーミングする。
- Azure portal でアプリを管理する。
- Azure Developer CLI を使用して、同じアーキテクチャをプロビジョニングし、デプロイする。
- GitHub Codespaces と GitHub Copilot を使用して開発ワークフローを最適化する。
[前提条件]
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます。
- GitHub アカウント。 1 つ無料で取得することもできます。
- Quarkus 開発における Java の知識。
- (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
- アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます。
- GitHub アカウント。 1 つ無料で取得することもできます。
- Azure Developer CLI がインストールされていること。 Azure Developer CLI が既にインストールされているため、Azure Cloud Shell を使って手順を進めることができます。
- Quarkus 開発における Java の知識。
- (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
最後までスキップする
このチュートリアルで Azure で実行されているサンプル アプリを表示したいだけである場合、Azure Cloud Shell で次のコマンドを実行し、プロンプトに従います。
mkdir msdocs-quarkus-postgresql-sample-app
cd msdocs-quarkus-postgresql-sample-app
azd init --template msdocs-quarkus-postgresql-sample-app
azd up
1.サンプルを実行する
最初に、開始点としてサンプルのデータ駆動型アプリを設定します。 便宜上、サンプル リポジトリ Hibernate ORM with Panache と RESTEasy には、開発コンテナー構成が含まれています。 開発コンテナーには、データベース、キャッシュ、サンプル アプリケーションに必要なすべての環境変数など、アプリケーションの開発に必要なすべてのものが含まれています。 開発コンテナーは、GitHub codespace で実行できます。つまり、Web ブラウザーを使用して任意のコンピューターでサンプルを実行できます。
手順 1: 新しいブラウザー ウィンドウで次を行います。
- GitHub アカウントにサインインします。
- https://github.com/Azure-Samples/msdocs-quarkus-postgresql-sample-app/fork に移動します。
- [メイン ブランチのみをコピーする] をオフにします。 すべてのブランチが必要です。
- [フォークの作成] を選択します。
手順 2: GitHub フォークで、次の操作を行います。
- スターター ブランチの [メイン]>[starter-no-infra] を選択します。 このブランチにはサンプル プロジェクトだけが含まれており、Azure 関連のファイルや構成はありません。
- [コード]>[starter-no-infra に codespace を作成する] を選択します。 codespace の設定には数分かかります。
手順 3: codespace ターミナルで次のことを行います。
-
mvn quarkus:devを実行します。 - 通知
Your application running on port 5005 is available.は無視します - ''
Your application running on port 8080 is available.'' という通知が表示されたら、[ブラウザーで開く] を選択します。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。Quarkus 開発サーバーを停止するには、Ctrl+Cキーを押します。
Quarkus サンプル アプリケーションの作成方法の詳細については、Quarkus のドキュメント「シンプルになった HIBERNATE ORM WITH PANACHE」と「QUARKUS でデータ ソースを設定」を参照してください。
ヒント
このリポジトリについて GitHub Copilot に質問できます。 次に例を示します。
- @workspace このプロジェクトは何を行いますか?
- @workspace .devcontainer フォルダーは何を行いますか?
問題がありますか。 「トラブルシューティング」セクションを確認してください。
2. App Service と PostgreSQL を作成する
この手順では、Azure リソースを作成します。 このチュートリアルで使用する手順では、App Service と Azure Database for PostgreSQL を含む既定でセキュリティ保護された一連のリソースを作成します。 作成プロセスでは、次のように指定します。
- Web アプリの [名前]。 これは、アプリの DNS 名の一部として
https://<app-name>-<hash>.<region>.azurewebsites.netの形式で使用されます。 - 世界でアプリを物理的に実行するためのリージョン。 これは、アプリの DNS 名の一部としても使用されます。
- アプリの [ランタイム スタック]。 ここで、アプリに使う Java のバージョンを選びます。
- アプリの [ホスティング プラン]。 これは、アプリの一連の機能と容量のスケーリングを含む価格レベルです。
- アプリの [リソース グループ]。 リソース グループを使うと、アプリケーションに必要なすべての Azure リソースを (論理コンテナーに) グループ化できます。
Azure portal にサインインし、以下の手順に従って Azure App Service リソースを作成します。
手順 1: Azure portal で次を行います。
- 上部の検索バーに「app service」と入力します。
- [サービス] の見出しの下にある [App Service] というラベルの付いた項目を選びます。
- [作成]>[Web アプリ] を選びます。 作成ウィザードに直接移動することもできます。
手順 2: 新しいアプリを構成する フォームに次のように入力します。
- 名前: msdocs-quarkus-postgres。 msdocs-quarkus-postgres_group という名前のリソース グループが自動的に生成されます。
- "ランタイム スタック": Java 21。
- Java Web サーバー スタック: Java SE (埋め込み Web サーバー)。
- オペレーティング システム: Linux。
- [リージョン]: 近くの任意の Azure リージョン。
- [Linux プラン]: 新規作成し、msdocs-quarkus-postgres という名前を使用します。
- [価格プラン]: 基本 B1。 準備ができたら、別の価格レベルにスケールアップできます。
手順 3: データベースを追加する
- [ データベース ] タブを選択します。
- [ データベースの作成] を選択します。
- [エンジン] で、[PostgreSQL - フレキシブル サーバー] を選択します。 サーバー名とデータベース名は、既定で適切な値に設定されます。
手順 4: GitHub デプロイを構成する
- [ デプロイ ] タブを選択します。
- [継続的デプロイ] を選択します。
- App Service で GitHub デプロイを初めて構成する場合は、[承認] を選択し、GitHub アカウントで認証します。
- 組織で、GitHub エイリアスを選択します。
- [リポジトリ] で、[msdocs-quarkus-postgresql-sample-app] を選びます。
- [ブランチ] で、[starter-no-infra] を選択します。
- [Review + create]\(レビュー + 作成\) を選択します。
- 検証が完了した後、[作成] を選択します。 既定では、作成ウィザードで、Microsoft Entra (OIDC 認証) を使用して認証するためのワークフロー用にユーザー割り当て ID が作成されます。 代替認証オプションについては、「GitHub Actions を使用した App Service へのデプロイ」を参照してください。
手順 3: デプロイが完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 App Service アプリに直接移動しますが、次のリソースが作成されます。
- [リソース グループ]: 作成されたすべてのリソースのコンテナー。
- [App Service プラン]: App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
- [App Service]: アプリを表し、App Service プランで実行されます。
- [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
- Azure Database for PostgreSQL フレキシブル サーバー: 仮想ネットワーク内からのみアクセス可能です。 サーバー上にデータベースとユーザーが自動的に作成されます。
- プライベート DNS ゾーン: 仮想ネットワーク内のキー コンテナーとデータベース サーバーの DNS 解決を有効にします。
3.セキュリティで保護された接続のシークレット
作成ウィザードにより、すでに接続変数がアプリの設定として自動的に生成されています。 ただし、セキュリティのベスト プラクティスは、App Service からシークレットを完全に排除することです。 シークレットをキー保管庫に移動し、サービスコネクタを使用してアプリ設定を Key Vault の参照 に変更します。
手順 1: 既存の接続文字列を取得する
- App Service ページの左側のメニューで、[設定] > [環境変数] を選びます。
- [接続文字列] を選択します。
- [AZURE_POSTGRESQL_CONNECTIONSTRING] を選択します。
- [アプリケーション設定の追加/編集] 設定の [値] フィールドで、文字列の末尾にある User Id= と Password= の部分を見つけます。
- 後で使用するために、User Id= と Password= の後のユーザー名とパスワードの文字列をコピーします。 このアプリ設定を使用すると、プライベート エンドポイントの背後でセキュリティ保護された Postgres データベースに接続できます。 ただし、シークレットは App Service アプリに直接保存されますが、これは最適ではありません。 これを変更します。
手順 2: Key Vault をセキュリティで保護するためのサブネットを作成する 仮想ネットワークには既に 2 つの既存のサブネットがありますが、1 つは既に App Service に委任されており、もう 1 つは Azure Database for PostgreSQL に既に委任されています。 プライベート エンドポイントを使用して Key Vault に安全にアクセスできるように、もう 1 つサブネットを作成します (詳細については、「Azure Key Vault のネットワーク セキュリティ」を参照してください)。
- App Service ページの左側のメニューで、[概要] タブを選択します。
- アプリのリソース グループを選択します。
- リソース グループ内の仮想ネットワークを選択します。
- 仮想ネットワークの左側のメニューで、[設定] > [サブネット] を選択します。
- [+ サブネット] を選択します。
- [名前] に「subnet-keyvault」と入力します。 既定値を受け入れます。
- [] を選択し、[] を追加します。
手順 3: シークレットを安全に管理するためのキー コンテナーを作成する
- 上部の検索バーに「キー コンテナー」と入力し、[Marketplace]> を選択します。
- [リソース グループ] で、[msdocs-quarkus-postgres_group] を選択します。
- [キー コンテナー名] に、文字と数字のみで構成される名前を入力します。
- [リージョン] をリソース グループと同じ場所に設定します。
手順 4: プライベート エンドポイントを使用してキー コンテナーをセキュリティで保護する
- [ネットワーク] タブを選択します。
- [パブリック アクセスを有効にする] の選択を解除します。
- [プライベート エンドポイントを作成する] を選択します。
- [リソース グループ] で、[msdocs-quarkus-postgres_group] を選択します。
- ダイアログの [場所] で、App Service アプリと同じ場所を選択します。
- [名前] に「msdocs-quarkus-postgresVaultEndpoint」と入力します。
- [仮想ネットワーク] で、[vnet-xxxxxxx] を選択します。
- [サブネット] で、[subnet-keyvault] を選択します。
- [OK] を選択.
- [ 確認と作成] を選択し、[ 作成] を選択します。 キー コンテナーのデプロイが完了するまで待ちます。 "デプロイが完了しました" と表示されます。
手順 5: PostgreSQL コネクタを作成する
- 上部の検索バーに、「msdocs-quarkus-postgres」と入力し、[msdocs-quarkus-postgres] という App Service リソースを選択します。
- [App Service] ページの左側のメニューで、[設定] > [サービス コネクタ] > [作成] を選択します。
- [サービスの種類] で、[DB for PostgreSQL フレキシブル サーバー] を選択します。
- [PostgreSQL フレキシブル サーバー] では、msdocs-quarkus-postgres-server が既に選択されているはずです。
- [PostgreSQL データベース] で、[msdocs-quarkus-postgres-database] を選択します。
- [クライアントの種類] で、[Java] を選択します。
手順 6: キー コンテナーにシークレットを保存する
- 認証 タブを選択します。
- [接続文字列] を選択します。
- [ユーザー名] と [パスワード] に、先ほどコピーしたパスワードを貼り付けます。
- [シークレットを Key Vault に保存する] を選択します。
- [Key Vault 接続] で、[新規作成] を選択します。 [接続の作成] ダイアログが編集ダイアログの上に開きます。
手順 7: Key Vault 接続を確立する
- Key Vault 接続の [接続の作成] ダイアログの [キー コンテナー] で、前に作成したキー コンテナーを選びます。
- [クライアントの種類] で、一貫性を確保するために [Java] を選択します。 アプリケーション コードは実際にはキー コンテナーを直接使用しません。
- [確認および作成]を選択します。
- 検証が完了したら、[作成] を選択します。
手順 8: PostgreSQL コネクタの設定を完了する
- PostgreSQL コネクタの編集ダイアログに戻ります。 [認証] タブで、キー コンテナー コネクタが作成されるまで待ちます。 完了すると、[Key Vault 接続] ドロップダウンでそれが自動的に選択されます。
- [確認および作成]を選択します。
- 検証が完了したら、[作成] を選択します。 作成成功の通知が表示されるまで待ちます。
手順 9: Key Vault の統合を確認する
- 左側のメニューで、もう一度 [設定] > [環境変数] を選びます。
-
[AZURE_POSTGRESQL_CONNECTIONSTRING] の横にある [値の表示] を選択します。 値は
@Microsoft.KeyVault(...)になります。これは、シークレットがキー コンテナーで管理されるようになったため、これがキー コンテナー参照であることを意味します。
手順 10: App Service からデータベース資格情報を削除する
- [接続文字列] タブを選択します。
- AZURE_POSTGRESQL_CONNECTIONSTRINGの右側にある [削除] を選択します。 この接続文字列は、作成ウィザードによって最初に作成されたものであることに注意してください。
まとめると、接続シークレットをセキュリティで保護するためのプロセスには次の作業が含まれます。
- App Service アプリの環境変数から接続シークレットを取得する。
- プライベート エンドポイントを使用してキー コンテナーを作成する。
- システム割り当てマネージド ID を使用して Key Vault 接続を作成する。
- 接続シークレットをキー コンテナーに格納するサービス コネクタを作成する。
- App Service アプリから以前の接続シークレットを削除する。
問題がありますか。 「トラブルシューティング」セクションを確認してください。
4.サンプル コードをデプロイする
作成ウィザードでは、GitHub Actions を使用してサンプル GitHub リポジトリからの継続的デプロイを既に構成しました。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push があるたびにビルドとデプロイのアクションが起動されます。
次のことを考慮してください。
- Quarkus は既定でポート 8080 をリッスンします。 運用環境では、App Service の
PORT環境変数で指定されたポートをリッスンするように構成する必要があります。 - デプロイされた Java パッケージは、Uber-Jar である必要があります。
- このチュートリアルをわかりやすくするために、デプロイ プロセス中はテストを無効にします。 GitHub Actions ランナーは Azure の PostgreSQL データベースにアクセスできないため、Quarkus サンプル アプリケーションの場合など、データベース アクセスを必要とする統合テストは失敗します。
手順 1: サンプル フォークの GitHub コードスペースに戻り、 git pull origin starter-no-infra実行します。
これにより、新しくコミットされた GitHub ワークフロー ファイルが codespace にプルされます。
手順 2 (オプション 1: GitHub Copilot を使用):
- [チャット] ビューを選択し、+ を選択して、新しいチャット セッションを開始します。
- "@workspaceアプリはデータベースにどのように接続しますか?" と質問します。Copilot は、src/main/resources/application.properties で Quarkus データ ソース設定どのように構成されているかについて説明してくれる場合があります。
- たとえば、次のように入力します。"@workspace Azure App Service で Java クライアント タイプを使用して PostgreSQL サービス コネクタを作成しました。アプリ設定名は AZURE_POSTGRESQL_CONNECTIONSTRING です。アプリを運用環境で実行しているときにこの接続文字列を使用したいです。" Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに src/main/resources/application.properties ファイルで変更するように指示する場合もあります。
- エクスプローラーで src/main/resources/application.properties を開き、コード候補を追加します。
- たとえば、次のように入力します。"@workspace このプロジェクトで Uber Jar を作成するにはどう構成すればよいですか?" Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに src/main/resources/application.properties ファイルで変更するように指示する場合もあります。
- エクスプローラーで src/main/resources/application.properties を開き、コード候補を追加します。
- たとえば、次のように入力します。"@workspace App Service のポートを使用するにはどうすればよいですか?" Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに src/main/resources/application.properties ファイルで変更するように指示する場合もあります。
- エクスプローラーで src/main/resources/application.properties を開き、コード候補を追加します。 GitHub Copilot は毎回同じ応答を提供するわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。
手順 2 (オプション 2: GitHub Copilot なし):
- エクスプローラーで src/main/resources/application.properties を開きます。 Quarkus では、Java プロパティを読み込むためにこのファイルが使用されます。
- 10 から 12 行目をコメント解除します。 これらの設定では、PostgreSQL コネクタで作成したアプリ設定を使用し、Uber Jar を作成して、ポートが App Service で使用されるポートに設定されます。
手順 3 (オプション 1: GitHub Copilot を使用):
- "@workspace GitHub Actions でデプロイするときに、データベース関連のエラーを回避するためにテストをスキップしたいです。" と依頼します。Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml ファイルで変更するように指示する場合もあります。
- エクスプローラーで .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml を開き、コード候補を追加します。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。
手順 3 (オプション 2: GitHub Copilot を使用しない):
- エクスプローラーで .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml を開きます。 これは、作成ウィザードによって自動的に作成された GitHub Actions ワークフローです。
-
Build with Mavenステップを見つけて、runコマンドをmvn clean install -DskipTestsに変更します。-DskipTestsは、データベース エラーでデプロイが失敗しないように、テストをスキップするように Maven に指示します。 GitHub Actions コンテナーは PostgreSQL サーバーに接続できません。
手順 4:
- [ソース管理] 拡張機能を選びます。
- テキスト ボックスに、
Configure DB and deploymentのようなコミット メッセージを入力します。 または、
を選択し、GitHub Copilot でコミット メッセージを生成します。 - [コミット] を選択し、[はい] で確定します。
- [変更の同期 1] を選択し、[OK] で確認します。
手順 5:
- 左側のメニューから、[デプロイ]>[デプロイ センター]>[ログ] を選択します。
- デプロイの実行のログ項目で、最新のタイムスタンプを持つ [ビルドまたはデプロイ ログ] エントリを選びます。
手順 6: GitHub リポジトリにアクセスし、GitHub アクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイの 2 つの異なるステージが定義されます。 GitHub が実行され、[Success] の状態が表示されるまで待ちます。 所要時間は約 5 分です。
問題がありますか。 「トラブルシューティング」セクションを確認してください。
5.アプリの参照
手順 1: [App Service] ページで、次を行ないます。
- 左側のメニューから [概要] を選びます。
- アプリの URL を選びます。
手順 2: リストにいくつかの果物を追加します。 おめでとうございます。Azure Database for PostgreSQL へのセキュリティで保護された接続を使用して、Azure App Service で Web アプリを実行できました。
6. 診断ログをストリーミングする
Azure App Service では、アプリケーションに関する問題の診断に役立つように、コンソールに出力されたすべてのメッセージが収集されます。 サンプル アプリケーションには、以下に示すように、この機能を示す標準の JBoss ログ ステートメントが含まれています。
private static final Logger LOGGER = Logger.getLogger(FruitEntityResource.class.getName());
@GET
public List<FruitEntity> get() {
LOGGER.info("In FruitEntityResource.get()");
return FruitEntity.listAll(Sort.by("name"));
}
手順 1: [App Service] ページで、次を行ないます。
- 左側のメニューから [監視]>[App Service ログ] を選択します。
- [アプリケーション ログ記録] で [ファイル システム] を選びます。
- 上部のメニューから、[保存] を選択します。
手順 2: 左側のメニューから [ログ ストリーム] を選択します。 プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。
Java アプリのログ記録の詳細については、シリーズの「.NET、Node.js、Python、Java アプリケーション用の Azure Monitor OpenTelemetry を有効にする」を参照してください。
7. リソースをクリーンアップする
完了したら、リソース グループを削除して、Azure サブスクリプションからすべてのリソースを削除できます。
手順 1: Azure portal の上部にある検索バーで次を行います。
- リソース グループ名を入力します。
- リソース グループを選択します。
手順 2: リソース グループのページで、[リソース グループの削除] を選びます。
手順 3:
- リソース グループの名前を入力して、削除を確定します。
- [削除]を選択します。
- もう一度 [削除] を選択して確定します。
2.Azure リソースを作成してサンプル アプリをデプロイする
このステップでは、Azure リソースを作成し、サンプル アプリを App Service on Linux にデプロイします。 このチュートリアルで使用する手順では、App Service と Azure Database for PostgreSQL を含む既定でセキュリティ保護された一連のリソースを作成します。
開発コンテナーには、既に Azure Developer CLI (AZD) が含まれています。
GitHub codespaceのリポジトリ ルートから、
azd initを実行します。azd init --template javase-app-service-postgresql-infraメッセージが表示されたら、次の応答を入力します。
質問 答え The current directory is not empty. (現在のディレクトリが空ではありません。) Would you like to initialize a project here in '<your-directory>'? ('<ディレクトリ>' でプロジェクトを初期化しますか?) Y これらのファイルをどうしますか? Keep my existing files unchanged (既存のファイルを変更しないでそのままにする) 新しい環境の名前を入力してください 一意の名前を入力します。 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管理Redis:プライベートエンドポイントの背後からのみアクセス可能です。
- キー コンテナー: プライベート エンドポイントの背後からのみアクセスできます。 App Service アプリのシークレットを管理するために使用されます。
プロビジョニングが完了したら、AZD 出力で
AZURE_POSTGRESQL_CONNECTIONSTRING設定を見つけます。 シークレットを安全に保つため、設定の名前のみが表示されます。 これらは、AZD の出力では次のようになります。App Service app has the following connection settings: - AZURE_POSTGRESQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE使用している AZD テンプレートにより、接続変数がアプリ設定として既に自動的に生成されており、それらが便宜のためにターミナルに出力されます。 アプリの設定は、接続のシークレットがコード リポジトリに含まれないようにするための 1 つの方法です。 また、作成された App Service アプリのアプリ設定ページへの直接リンクを見つけることもできます。
問題がありますか。 「トラブルシューティング」セクションを確認してください。
3. サンプル コードを変更して再デプロイする
App Service で動作させるには、アプリケーション コードにいくつかの変更を加える必要があります。
- Quarkus は既定でポート 8080 をリッスンします。 運用環境では、App Service の
PORT環境変数で指定されたポートをリッスンするように構成する必要があります。 - デプロイされた Java パッケージは、Uber-Jar である必要があります。
- このチュートリアルをわかりやすくするために、デプロイ プロセス中はテストを無効にします。 GitHub Actions ランナーは Azure の PostgreSQL データベースにアクセスできないため、Quarkus サンプル アプリケーションの場合など、データベース アクセスを必要とする統合テストは失敗します。
GitHub codespace で、[チャット] ビューを選択し、次に [+] を選択して、新しいチャット セッションを開始します。
"@workspace アプリはどのようにデータベースに接続しますか?" と質問します。Copilot は、src/main/resources/application.properties 内で Quarkus のデータ ソース設定がどのように構成されているかについて説明を返す場合があります。
たとえば、次のように入力します。"@workspace Azure App Service で Java クライアント タイプを使用して PostgreSQL サービス コネクタを作成しました。アプリ設定名は AZURE_POSTGRESQL_CONNECTIONSTRING です。アプリを運用環境で実行しているときにこの接続文字列を使用したいです。" Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに src/main/resources/application.properties ファイルで変更するように指示する場合もあります。
src/main/resources/application.properties にコード候補を追加します。
たとえば、次のように入力します。"@workspace このプロジェクトで Uber Jar を作成するにはどう構成すればよいですか?" Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに src/main/resources/application.properties ファイルで変更するように指示する場合もあります。
src/main/resources/application.properties にコード候補を追加します。
たとえば、次のように入力します。"@workspace App Service のポートを使用するにはどうすればよいですか?" Copilot は、以下のオプション 2: GitHub Copilot を使用しない手順に示されているものと似たコード候補を提供し、さらに src/main/resources/application.properties ファイルで変更するように指示する場合もあります。
src/main/resources/application.properties にコード候補を追加します。
GitHub Copilot は毎回同じ応答を提供するわけではなく、常に正しいとは限りません。 その応答を微調整するために、さらに質問をする必要があるかもしれません。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。
ターミナルで
azd deployを実行します。azd deploy
問題がありますか。 「トラブルシューティング」セクションを確認してください。
5.アプリの参照
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 アプリを実行できました。
問題がありますか。 「トラブルシューティング」セクションを確認してください。
6. 診断ログをストリーミングする
Azure App Service はコンソール ログをキャプチャできるので、アプリケーションに関する問題の診断に役立ちます。 便宜のために、AZD テンプレートでは、既にローカル ファイル システムへのログ記録が有効になっており、それらのログが Log Analytics ワークスペースに配布されています。
サンプル アプリケーションには、以下に示すように、この機能を示す標準の JBoss ログ ステートメントが含まれています。
private static final Logger LOGGER = Logger.getLogger(FruitEntityResource.class.getName());
@GET
public List<FruitEntity> get() {
LOGGER.info("In FruitEntityResource.get()");
return FruitEntity.listAll(Sort.by("name"));
}
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
Java アプリのログ記録の詳細については、シリーズの「.NET、Node.js、Python、Java アプリケーション用の Azure Monitor OpenTelemetry を有効にする」を参照してください。
問題がありますか。 「トラブルシューティング」セクションを確認してください。
7. リソースをクリーンアップする
現在のデプロイ環境内のすべての Azure リソースを削除するには、azd down を実行し、プロンプトに従います。
azd down
トラブルシューティング
ビルド ステージで GitHub Actions の実行に失敗しました
失敗したビルド ステージを選択して、失敗したステップを確認します。
Build with Maven ステージの場合は、ステップを展開して、-DskipTests オプションが使用されていることを確認します。 そうでない場合は、「4. サンプル コードをデプロイする」に戻り、指示に従って GitHub ワークフロー ファイルを修正します。
アプリの起動に失敗し、ログ ストリームに次のエラーが表示されます。"モデル クラスは既定の永続化ユニット <default> に対して定義されていますが、構成されたデータソース <default> が見つかりません: 既定の EntityManagerFactory は作成されません。"
これは、アプリが Azure データベースに接続できないために発生する可能性が最も高い Quarkus エラーです。 アプリ設定 AZURE_POSTGRESQL_CONNECTIONSTRING が変更されていないこと、および application.properties でアプリ設定が正しく使用されていることを確認します。
アプリの起動に失敗し、ログ ストリームに "コンテナーのウォームアップ要求への応答を待機しています" と表示される
App Service の PORT 環境変数で指定されたポートをリッスンするようにアプリケーションが構成されていない可能性があるため、要求に応答できません。 App Service がアプリケーションから応答を受け取らない場合、アプリケーションの起動に失敗したと見なされます。 「4. サンプル コードをデプロイする」に戻り、application.properties が正しく構成されていることを確認してください。
アプリは動作しますが、エラー ログに "ERROR [org.acm.hib.orm.pan.ent.FruitEntityResource] (vert.x-eventloop-thread-0) 要求の処理に失敗しました: jakarta.ws.rs.NotFoundException: HTTP 404 Not Found" と表示されます。
これは、クライアントが不明なパスを要求したことを示す Vert.x エラーです (「QUARKUS リアクティブ アーキテクチャ」を参照)。 これは、休止状態のデータベース移行が行われる前にクライアントが REST API を要求したときに、アプリが初めて起動したときに発生する可能性があります。
App Service では、アプリが起動したことを確認するためにGET に /robots933456.txt 要求を送信するため、アプリの起動ごとにこのエラーが発生します。
よく寄せられる質問
- このセットアップのコストはどのくらいですか?
- 仮想ネットワークの背後でセキュリティ保護されている PostgreSQL サーバーに他のツールで接続するにはどうすればよいですか?
- ローカル環境でのアプリ開発は GitHub Actions とどのように連携しますか?
- GitHub ワークフロー中に PostgreSQL でテストを実行する場合はどうすればよいですか?
- ユーザー割り当て 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 ワークフロー中に PostgreSQL でテストを実行する場合はどうすればよいですか?
既定の Quarkus サンプル アプリケーションには、データベース接続を使用したテストが含まれています。 接続エラーを回避するために、-skipTests プロパティを追加しました。 必要に応じて、PostgreSQL サービス コンテナーに対してテストを実行できます。 たとえば、GitHub フォーク内の自動生成されたワークフロー ファイル (.github/workflows/main_cephalin-quarkus.yml) で、次の変更を行います。
次のスニペットに示すように、PostgreSQL コンテナーの YAML コードを
buildジョブに追加します。... jobs: build: runs-on: ubuntu-latest # BEGIN CODE ADDITION container: ubuntu services: # Hostname for the PostgreSQL container postgresdb: image: postgres env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres POSTGRES_DB: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 # END CODE ADDITION steps: - uses: actions/checkout@v4 ...container: ubuntuは、コンテナーでbuildジョブを実行するように GitHub に示します。 これにより、開発環境の接続文字列 (jdbc:postgresql://postgresdb:5432/postgres) は、ワークフローの実行時にそのまま動作します。 GitHub Actions での PostgreSQL 接続の詳細については、「PostgreSQL サービス コンテナーの作成」を参照してください。Build with Mavenステップで、-DskipTestsを削除します。 次に例を示します。- name: Build with Maven run: mvn clean install -Dquarkus.package.type=uber-jar
ユーザー割り当て ID を作成するためのアクセス許可がありません
「デプロイ センターから GitHub Actions デプロイを設定する」を参照してください。
自分のコードスペースで GitHub Copilot を使用して何ができますか?
コードスペースを作成したときに、既に GitHub Copilot チャット ビューが表示されていることに気付かれたかもしれません。 ただし、GitHub Copilot アカウント (30 日間の無料試用版を利用できます) が必要です。
GitHub Copilot に話しかけるときのヒントを、いくつか次に示します。
- 1 つのチャット セッションでは、質問と回答は相互に基づいて構築されていくので、質問を調整すると、得られる回答を絞り込むことができます。
- 既定では、GitHub Copilot からリポジトリ内のファイルにはアクセスできません。 ファイルに関する質問を問い合わせるには、まず、エディターでファイルを開きます。
- GitHub Copilot がその回答を準備するときにリポジトリ内のすべてのファイルにアクセスできるようにするには、
@workspaceで質問を開始します。 詳細については、Use the @workspace agentを参照してください。 - チャット セッションでは、GitHub Copilot は変更を提案でき、場合によっては (
@workspaceを使用して) 変更を行う箇所も提案できますが、変更を行うことはできません。 提案された変更を追加してテストするかどうかは、ご自身が決める必要があります。
次のステップ
App Service での Java アプリの実行の詳細については、開発者ガイドを参照してください。
カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法について説明します。