チュートリアル: Azure App Service on Linux と PostgreSQL を使用して Quarkus Web アプリを構築する

このチュートリアルでは、PostgreSQL データベースに接続されている Azure App Service で、セキュリティで保護された Quarkus アプリケーションを構築、構成、デプロイする方法を示します (Azure Database for PostgreSQL を使用)。 Azure App Service は、高いスケーラビリティを備え、パッチを自己適用する Web ホスティング サービスであり、アプリを Windows または Linux に簡単にデプロイできます。 このチュートリアルを終了すると、Azure App Service on Linux で実行される Quarkus アプリが完成します。

Screenshot of Quarkus application storing data in PostgreSQL.

このチュートリアルを完了するには、次のものが必要です。

  • アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます
  • Java と Quarkus 開発に関する知識。

1.サンプルを実行する

便宜上、サンプル リポジトリ Hibernate ORM with Panache と RESTEasy には、開発コンテナー構成が含まれています。 開発コンテナーには、データベース、キャッシュ、サンプル アプリケーションに必要なすべての環境変数など、アプリケーションの開発に必要なすべてのものが含まれています。 開発コンテナーは、GitHub codespace で実行できます。つまり、Web ブラウザーを使用して任意のコンピューターでサンプルを実行できます。

手順 1: 新しいブラウザー ウィンドウ内で次を実行します。

  1. GitHub アカウントにサインインします。
  2. https://github.com/Azure-Samples/msdocs-quarkus-postgresql-sample-app に移動します。
  3. [Fork] を選択します。
  4. [Create fork] (フォークの作成) を選択します。

A screenshot showing how to create a fork of the sample GitHub repository.

手順 2: GitHub フォークで、[コード]>[メインに codespace を作成] を選択します。

A screenshot showing how create a codespace in GitHub.

手順 3: codespace ターミナルで次のことを行います。

  1. mvn quarkus:dev を実行します。
  2. ''Your application running on port 8080 is available.'' という通知が表示されたら、[ブラウザーで開く] を選択します。 ポート 5005 を含む通知が表示された場合は、スキップします。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。Quarkus 開発サーバーを停止するには、Ctrl+C キーを押します。

A screenshot showing how to run the sample application inside the GitHub codespace.

Quarkus サンプル アプリケーションの作成方法の詳細については、Quarkus のドキュメント「シンプルになった HIBERNATE ORM WITH PANACHE」と「QUARKUS でデータ ソースを設定」を参照してください。

2.App Service と PostgreSQL を作成する

まず、Azure リソースを作成します。 このチュートリアルで使用する手順では、App Service と Azure Database for PostgreSQL を含む既定でセキュリティで保護された一連のリソースを作成します。 作成手順では、次のように指定します。

  • 名前: Web アプリの名前。 Web アプリの DNS 名の一部として https://<app-name>.azurewebsites.net の形式で使われる名前です。
  • 世界でアプリを物理的に実行するためのリージョン
  • アプリのランタイム スタック。 ここで、アプリに使う Java のバージョンを選びます。
  • アプリのホスティング プラン。 これは、アプリの一連の機能と容量のスケーリングを含む価格レベルです。
  • アプリのリソース グループ。 リソース グループを使うと、アプリケーションに必要なすべての Azure リソースを (論理コンテナーに) グループ化できます。

Azure portal にサインインし、以下の手順に従って Azure App Service リソースを作成します。

手順 1: Azure portal 内で次を実行します。

  1. Azure portal の上部にある検索バーに「Web app database」と入力します。
  2. [Marketplace] の見出しの下にある [Web アプリとデータベース] というラベルの付いた項目を選びます。 作成ウィザードに直接移動することもできます。

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard.

手順 2:[Web アプリとデータベースの作成] ページ内で、このフォームに次のように入力します。

  1. リソース グループ[新規作成] を選び、msdocs-quarkus-postgres-tutorial という名前を使用します。
  2. リージョン → 任意の近くの Azure リージョン。
  3. 名前msdocs-quarkus-postgres-XYZ。ここで、XYZ は任意の 3 つのランダムな文字です。 この名前は Azure 全体で一意である必要があります。
  4. ランタイム スタックJava 17
  5. Java Web サーバー スタックJava SE (埋め込み Web サーバー)
  6. データベースPostgreSQL - フレキシブル サーバー。 サーバー名とデータベース名は、既定で適切な値に設定されます。
  7. ホスティング プラン → Basic 準備ができたら、後で運用価格レベルにスケールアップできます。
  8. [Review + create](レビュー + 作成) を選択します。
  9. 検証が完了した後、 [作成] を選択します。

A screenshot showing how to configure a new app and database in the Web App + Database wizard.

手順 3: このデプロイは完了するまでに数分かかります。 デプロイが完了したら、[リソースに移動] ボタンを選択します。 App Service アプリに直接移動しますが、次のリソースが作成されます。

  • リソース グループ → 作成されたすべてのリソースのコンテナーです。
  • App Service プラン → App Service のコンピューティング リソースを定義します。 Basic レベルの Linux プランが作成されます。
  • App Service → アプリを表し、App Service プランで実行されます。
  • 仮想ネットワーク → App Service アプリと統合され、バックエンドのネットワーク トラフィックを分離します。
  • Azure Database for PostgreSQL フレキシブル サーバー → 仮想ネットワーク内からのみアクセス可能です。 サーバー上にデータベースとユーザーが作成されます。
  • プライベート DNS ゾーン → 仮想ネットワーク内の PostgreSQL サーバーの DNS 解決を有効にします。

A screenshot showing the deployment process completed.

3.接続設定を確認する

作成ウィザードにより、接続変数がアプリの設定として自動的に生成されます。 アプリの設定は、接続のシークレットをコード リポジトリに残さないための 1 つの方法です。 シークレットをより安全な場所に移動する準備ができたら、代わりに Key Vault 参照を使用できます。

手順 1: [App Service] ページの左側メニューで、[構成] を選択します。

A screenshot showing how to open the configuration page in App Service.

手順 2:[構成] ページの [アプリケーションの設定] タブで、AZURE_POSTGRESQL_CONNECTIONSTRING が存在することを確認します。 実行時に環境変数として挿入されます。

A screenshot showing how to see the autogenerated connection string.

手順 4:[構成] ページの [アプリケーションの設定] タブで、[新しいアプリケーション設定] を選びます。 設定に PORT という名前を付け、その値を、Quarkus アプリケーションの既定のポートである 8080 に設定します。 [OK] を選択します。

A screenshot showing how to set the PORT app setting in the Azure portal.

手順 5:[保存] を選びます。

A screenshot showing how to save the PORT app setting in the Azure portal.

問題がある場合は、 「トラブルシューティング」セクションを確認してください。

4.サンプル コードをデプロイする

この手順では、GitHub Actions を使って GitHub のデプロイを構成します。 これは、App Service にデプロイする多くの方法の 1 つにすぎませんが、デプロイ プロセスで継続的インテグレーションを実現する優れた方法でもあります。 既定では、GitHub リポジトリに git push があるたびにビルドとデプロイのアクションが起動されます。

以下に注意します。

  • デプロイされた Java パッケージは、Uber-Jar である必要があります。
  • このチュートリアルをわかりやすくするために、デプロイ プロセス中はテストを無効にします。 GitHub Actions ランナーは Azure の PostgreSQL データベースにアクセスできないため、Quarkus サンプル アプリケーションの場合など、データベース アクセスを必要とする統合テストは失敗します。

手順 1: [App Service] ページに戻り、左側のメニューで [デプロイ センター] を選択します。

A screenshot showing how to open the deployment center in App Service.

手順 2: [デプロイ センター] ページで次のことを行います。

  1. [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。
  2. GitHub アカウントにサインインし、プロンプトに従って Azure を承認します。
  3. [組織] で、自分のアカウントを選びます。
  4. [リポジトリ] で、[msdocs-quarkus-postgresql-sample-app] を選びます。
  5. [ブランチ][main] を選びます。
  6. [認証の種類] で、[ユーザー割り当て ID (プレビュー)] を選択します。
  7. 上部のメニューから、[保存] を選択します。 App Service は、選んだ GitHub リポジトリの .github/workflows ディレクトリに、ワークフロー ファイルをコミットします。

A screenshot showing how to configure CI/CD using GitHub Actions.

手順 3: サンプル フォークの GitHub codespace に戻り、git pull origin main を実行します。 これにより、新しくコミットされたワークフロー ファイルが codespace にプルされます。

A screenshot showing git pull inside a GitHub codespace.

手順 4:

  1. エクスプローラーで src/main/resources/application.properties を開きます。 Quarkus では、Java プロパティを読み込むためにこのファイルが使用されます。
  2. 運用プロパティ %prod.quarkus.datasource.jdbc.url=${AZURE_POSTGRESQL_CONNECTIONTRING} を追加します。 このプロパティでは、作成ウィザードによって自動的に生成されたアプリ設定に運用データ ソースの URL が設定されます。

A screenshot showing a GitHub codespace and the application.properties file opened.

手順 5:

  1. エクスプローラーで .github/workflows/main_msdocs-quarkus-postgres-XYZ.yml を開きます。 このファイルは、App Service の作成ウィザードによって作成されました。
  2. Build with Maven ステップの下にある Maven コマンドを mvn clean install -DskipTests -Dquarkus.package.type=uber-jar に変更します。 -DskipTests では、Quarkus プロジェクトのテストがスキップされ、-Dquarkus.package.type=uber-jar で、App Service に必要な Uber-Jar が作成されます。

A screenshot showing a GitHub codespace and a GitHub workflow YAML opened.

手順 6:

  1. [ソース管理] 拡張機能を選びます。
  2. テキスト ボックスに、Configure DB and deployment workflow のようなコミット メッセージを入力します。
  3. [コミット] を選択し、[はい] で確定します。
  4. [変更の同期 2] を選択し、[OK] で確定します。

A screenshot showing the changes being committed and pushed to GitHub.

手順 7: Azure portal 内の [デプロイ センター] ページ内に戻り、次のことを行います。

  1. [ログ] を選択します。 新しいデプロイの実行が、コミットされた変更から既に開始されています。
  2. デプロイの実行のログ項目で、最新のタイムスタンプを持つ [ビルドまたはデプロイ ログ] エントリを選びます。

A screenshot showing how to open deployment logs in the deployment center.

手順 8: GitHub リポジトリに移動したら、GitHub アクションが実行されていることを確認します。 ワークフロー ファイルでは、ビルドとデプロイという 2 つの異なるステージを定義します。 GitHub が実行されて、[完了] の状態が表示されるまで待ちます。 所要時間は約 5 分です。

A screenshot showing a GitHub run in progress.

問題がある場合は、 「トラブルシューティング」セクションを確認してください。

5.アプリの参照

手順 1: [App Service] ページ内で、次を実行します。

  1. 左側のメニューから [概要] を選びます。
  2. アプリの URL を選びます。 直接、https://<app-name>.azurewebsites.net に移動することもできます。

A screenshot showing how to launch an App Service from the Azure portal.

手順 2: リストにいくつかの果物を追加します。 おめでとうございます。Azure Database for PostgreSQL へのセキュリティで保護された接続を使用して、Azure App Service で Web アプリを実行できました。

A screenshot of the Quarkus web app with PostgreSQL running in Azure showing a list of fruits.

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] ページ内で、次を実行します。

  1. 左側のメニューから、[App Service ログ] を選びます。
  2. [アプリケーション ログ記録][ファイル システム] を選びます。
  3. 上部のメニューから、[保存] を選択します。

A screenshot showing how to enable native logs in App Service in the Azure portal.

手順 2:左側のメニューから [ログ ストリーム] を選択します。 プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。

A screenshot showing how to view the log stream in the Azure portal.

Java アプリのログ記録の詳細については、シリーズの「.NET、Node.js、Python、Java アプリケーション用の Azure Monitor OpenTelemetry を有効にする」を参照してください。

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

完了したら、リソース グループを削除することで、Azure サブスクリプションからすべてのリソースを削除できます。

手順 1: Azure portal の上部にある検索バーで次を行います。

  1. リソース グループ名を入力します。
  2. リソース グループを選択します。

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

手順 2: [リソース グループ] ページ内で、[リソース グループの削除] を選びます。

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

ステップ 3:

  1. リソース グループの名前を入力して、削除を確定します。
  2. [削除] を選択します。
  3. もう一度 [削除] を選択して確定します。

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

トラブルシューティング

エラー ログ "ERROR [org.acm.hib.orm.pan.ent.FruitEntityResource] (vert.x-eventloop-thread-0) 要求を処理できませんでした: jakarta.ws.rs.NotFoundException: HTTP 404 見つかりません" が表示されます。

これは、クライアントが不明なパスを要求したことを示す Vert.x エラーです (「QUARKUS リアクティブ アーキテクチャ」を参照)。 このエラーは、App Service で GET 要求を /robots933456.txt に送信することにより、アプリが起動することが確認されるため、すべてのアプリの起動時に発生します。

アプリの起動に失敗し、ログに次のようなエラーが表示されます。"モデル クラスは既定の永続化ユニット <既定値> に対して定義されていますが、構成されたデータソース <既定値> が見つかりません: 既定の EntityManagerFactory は作成されません"

これは、アプリが Azure データベースに接続できないために発生する可能性が最も高い Quarkus エラーです。 アプリ設定 AZURE_POSTGRESQL_CONNECTIONSTRING が変更されていないこと、および application.properties でアプリ設定が正しく使用されていることを確認します。

よく寄せられる質問

この設定にはいくらかかりますか。

作成したリソースの価格は次のとおりです。

  • App Service プランは Basic レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
  • PostgreSQL フレキシブル サーバーは、ストレージ サイズが最小な、最も低いバースト可能レベルである Standard_B1ms に作成されます。スケールアップまたはダウンすることができます。 Azure Database for PostgreSQL の価格に関するページを参照してください。
  • 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 「Azure Virtual Network の価格」を参照してください。
  • プライベート DNS ゾーンでは、少額の料金が発生します。 「Azure DNS の価格」を参照してください。

仮想ネットワークの背後でセキュリティ保護されている PostgreSQL サーバーに他のツールで接続するにはどうすればよいですか?

  • コマンドライン ツールからの基本的なアクセスには、アプリの SSH ターミナルから psql を実行できます。
  • デスクトップ ツールから接続するには、マシンが仮想ネットワーク内にある必要があります。 たとえば、いずれかのサブネット内の 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) で、次の変更を行います。

  1. 次のスニペットに示すように、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 サービス コンテナーの作成」を参照してください。

  2. Build with Maven ステップで、-DskipTests を削除します。 次に例を示します。

          - name: Build with Maven
            run: mvn clean install -Dquarkus.package.type=uber-jar
    

次のステップ

App Service での Java アプリの実行の詳細については、開発者ガイドを参照してください。

カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法について説明します。