次の方法で共有


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

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

MySQL にデータを格納している JBoss アプリケーションのスクリーンショット。

このチュートリアルでは、次の作業を行う方法について説明します。

  • Azure App Service と Azure Database for MySQL フレキシブル サーバー用に既定でセキュリティ保護されるアーキテクチャを作成します。
  • パスワードレス接続文字列を使ってデータベース接続をセキュリティ保護する。
  • JBoss CLI を使って App Service の JBoss データ ソースを検証する。
  • JBoss サンプル アプリを GitHub リポジトリから App Service にデプロイする。
  • アプリケーション コード内で App Service アプリの設定にアクセスする。
  • アプリケーション コードを更新して再デプロイする。
  • App Service から診断ログをストリーム配信する。
  • Azure portal でアプリを管理する。
  • Azure Developer CLI を使用して、同じアーキテクチャをプロビジョニングし、デプロイする。
  • GitHub Codespaces と GitHub Copilot を使用して開発ワークフローを最適化する。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます
  • GitHub アカウント。 1 つ無料で取得することもできます。
  • Java と JBoss の開発に関する知識。
  • (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。
  • アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントがない場合は、無料で作成できます
  • Azure Developer CLI がインストールされていること。 Azure Developer CLI が既にインストールされているため、Azure Cloud Shell の手順に従うことができます。
  • Java と JBoss の開発に関する知識。
  • (オプション) GitHub Copilot を試す場合は、GitHub Copilot アカウント。 30 日間の無料試用版が提供されています。

最後までスキップする

このチュートリアルでは、サンプル アプリをすばやくデプロイし、それが Azure で動作していることを確認できます。 単に Azure Cloud Shell で次のコマンドを実行し、プロンプトに従うだけです。

mkdir msdocs-jboss-mysql-sample-app
cd msdocs-jboss-mysql-sample-app
azd init --template msdocs-jboss-mysql-sample-app
azd up

1.サンプルを実行する

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

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

  1. GitHub アカウントにサインインします。
  2. https://github.com/Azure-Samples/msdocs-jboss-mysql-sample-app/fork に移動します。
  3. [メイン ブランチのみをコピーする] をオフにします。 すべてのブランチが必要です。
  4. [Create fork] (フォークの作成) を選択します。

サンプル GitHub リポジトリのフォークを作成する方法を示すスクリーンショット。

手順 2: GitHub フォークで、次の操作を行います。

  1. スターター ブランチの [メイン]>[starter-no-infra] を選択します。 このブランチにはサンプル プロジェクトだけが含まれており、Azure 関連のファイルや構成はありません。 [コード]>[starter-no-infra に codespace を作成する] を選択します。 codespace の設定には数分かかります。

GitHub で codespace を作成する方法を示すスクリーンショット。

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

  1. mvn clean wildfly:run を実行します。
  2. Your application running on port 8080 is available. という通知が表示されたら、WildFly サーバーがアプリケーションの読み込みを完了するまで、さらに数秒待ちます。 その後、[ブラウザーで開く] を選びます。 新しいブラウザー タブにサンプル アプリケーションが表示されるはずです。WildFly サーバーを停止するには、「Ctrl+C」と入力します。

GitHub codespace 内でサンプル アプリケーションを実行する方法を示すスクリーンショット。

ヒント

このリポジトリについて GitHub Copilot に質問できます。 次に例を示します。

  • @workspace このプロジェクトは何を行いますか?
  • @workspace .devcontainer フォルダーは何を行いますか?

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

2.App Service と MySQL を作成する

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

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

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

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

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

上部にあるツール バーの検索ボックスを使って、Web アプリ作成ウィザードを検索する方法を示すスクリーンショット。

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

  1. [名前]: msdocs-jboss-mysql msdocs-jboss-mysql_group という名前のリソース グループが自動的に生成されます。
  2. [ランタイム スタック]: Java 17
  3. [Java Web サーバーのスタック]: [Red Hat JBoss EAP 8] Azure で Red Hat サブスクリプションを既に構成している場合は、[Red Hat JBoss EAP 8 BYO ライセンス] を選びます。
  4. [リージョン]: 近くの任意の Azure リージョン。
  5. [Linux プラン]: [新規作成] を選び、名前「msdocs-jboss-mysql」を使います。
  6. [価格プラン]: [Premium V3 P0V3] 準備ができたら、別の価格レベルにスケールアップできます。
  7. [お客様のアプリと共にデプロイする]: [データベース] を選びます。 Azure Database for MySQL - フレキシブル サーバーが既定で自動的に選ばれています。 それは、フル マネージド MySQL の Azure でのサービスとしてのデータベースであり、最新のコミュニティ エディションと互換性があります。
  8. [Review + create](レビュー + 作成) を選択します。
  9. 検証が完了した後、 [作成] を選択します。

Web アプリ ウィザードで新しいアプリとデータベースを構成する方法を示すスクリーンショット。

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

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

デプロイ プロセスが完了したことを示すスクリーンショット。

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

3. パスワードレス接続を作成する

このステップでは、マネージド ID ベースのサービス接続を生成します。後でこれを使って、JBoss サーバーにデータ ソースを作成できます。 マネージド ID を使って MySQL データベースに接続すると、コードは偶発的なシークレットの漏洩に対して安全です。

手順 1: マネージド ID を作成します。

  1. 上部の検索バーに、「マネージド ID」と入力します。
  2. [サービス] の見出しの下にある [マネージド ID] というラベルの付いた項目を選択します。
  3. [作成] を選択します
  4. [リソース グループ] で、[msdocs-jboss-mysql_group] を選びます。
  5. [リージョン] で、Web アプリに使ったのと同じリージョンを選びます。
  6. [名前] に、「msdocs-jboss-mysql-server-identity」と入力します。
  7. [Review + create](レビュー + 作成) を選択します。
  8. [作成] を選択します

新しいマネージド ID を構成する方法を示すスクリーンショット。

手順 2: MySQL サーバーで Microsoft Entra 認証を有効にします。

  1. 上部の検索バーに、「msdocs-jboss-mysql-server」と入力します。
  2. msdocs-jboss-mysql-server という Azure Database for MySQL フレキシブル サーバー リソースを選択します。
  3. 左側のメニューから [セキュリティ]>[認証] を選びます。
  4. [アクセスの割り当て先] で、[Microsoft Entra 認証のみ] を選びます。
  5. [ユーザー割り当てマネージド ID] で、[選択] を選びます。
  6. msdocs-jboss-mysql-server-identity を選んでから、[追加] を選びます。 ID が MySQL サーバーに割り当てられるまでしばらくかかります。
  7. [Microsoft Entra 管理者名] で、[選択] を選びます。
  8. 自分の Azure アカウントを見つけて選んでから、[選択] を選びます。
  9. [保存] を選び、処理が完了するまで待ちます。

Azure Database for MySQL フレキシブル サーバー用に Microsoft Entra 認証を構成する方法を示すスクリーンショット。

手順 3: マネージド ID ベースのサービス コネクタを追加します。

  1. 上部の検索バーに、「msdocs-jboss-mysql」と入力します。
  2. msdocs-jboss-mysql という名前の App Service リソースを選びます。
  3. [App Service] ページの左側にあるメニューで、[設定] > [サービス コネクタ] を選択します。
  4. [作成] を選択します
  5. [基本] タブを次のように設定します。
  6. [サービスの種類][DB for MySQL フレキシブル サーバー] に設定します。
  7. [MySQL フレキシブル サーバー]msdocs-jboss-mysql-server に設定します。
  8. [MySQL データベース]msdocs-jboss-mysql-database に設定します。
  9. [クライアントの種類][Java] に設定します。
  10. 認証 タブを選択します。
  11. [システム割り当てマネージド ID] を選びます。
  12. [確認および作成] タブを選択します。
  13. 検証が終わったら、[Cloud Shell で作成] を選んで、Cloud Shell で操作が完了するまで待ちます。
  14. 出力の JSON が表示されたら、Cloud Shell を閉じてかまいません。 また、[接続の作成] ダイアログも閉じます。
  15. [更新] を選んで、新しいサービス コネクタを表示します。

Cloud Shell で作成する準備ができた、完全に構成されたサービス コネクタを示すスクリーンショット。

手順 4: 接続文字列に認証プラグインを追加すします。

  1. 左側のメニューから [環境変数] を選択します。
  2. [AZURE_MYSQL_CONNECTIONSTRING] を選択します。 [値] フィールドには user は含まれていますが、password はないはずです。 ユーザーはマネージド ID です。
  3. App Service アプリの JBoss サーバーには、マネージド ID を認証する認証プラグインがありますが、それでも接続文字列にそれを追加する必要があります。 値の末尾までスクロールして、&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin を追加します。
  4. 適用を選択します。
  5. [適用] を選んでから、[確認] を選びます。

Azure で MySQL 環境変数の値を変更する方法を示すスクリーンショット。

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

4.JNDI データ ソースを確認する

Oracle、SQL Server、PostgreSQL、または MySQL の有効な JDBC 接続文字列を含むアプリ設定を追加すると、App Service によって、それに対する Java Naming and Directory Interface (JNDI) データ ソースが JBoss サーバーに追加されます。 この手順では、アプリ コンテナーへの SSH 接続を使用して、JNDI データ ソースを検証します。 このプロセスでは、SSH シェルにアクセスして JBoss CLI を実行する方法を説明します。

手順 1: [App Service] ページに戻り、次の操作を行います。

  1. 左側のメニューで、[開発ツール] > [SSH] を選びます。
  2. [Go] \(移動) を選択します。

Azure portal からアプリの SSH シェルを開く方法を示すスクリーンショット。

手順 2: SSH ターミナル内で次を実行します。

  1. $JBOSS_HOME/bin/jboss-cli.sh --connect を実行します。
  2. JBoss CLI 接続で、ls subsystem=datasources/data-source を実行します。 AZURE_MYSQL_CONNECTIONSTRING_DS という名前の自動生成されたデータ ソースが表示されます。
  3. /subsystem=datasources/data-source=AZURE_MYSQL_CONNECTIONSTRING_DS:read-attribute(name=jndi-name) を使って、データ ソースの JNDI 名を取得します。 これで JNDI 名 java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS がわかりました。この後、それをアプリケーションのコードで使用できます。

SSH シェルで実行する JBoss CLI コマンドとその出力を示すスクリーンショット。

Note

/home 内のファイルへの変更のみが、アプリの再起動後も保持されます。 たとえば、JBoss CLI で /opt/eap/standalone/configuration/standalone.xml を編集したり、サーバー構成を変更したりした場合、アプリを再起動すると変更は保持されません。 変更を保持するには、「Azure App Service で Tomcat、JBoss、または Java SE アプリのデータ ソースを構成する」で示されているように、スタートアップ スクリプトを使います

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

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

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

JBoss の規則と同様に、JBoss のルート コンテキストにデプロイする場合は、ビルドされた成果物に ROOT.war という名前を付けます。

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

App Service でデプロイ センターを開く方法を示すスクリーンショット。

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

  1. [ソース] で、[GitHub] を選びます。 既定では、ビルド プロバイダーとして GitHub Actions が選ばれます。
  2. GitHub アカウントにサインインし、プロンプトに従って Azure を承認します。
  3. [組織] で、自分のアカウントを選びます。
  4. [リポジトリ] で、[msdocs-jboss-mysql-sample-app] を選びます。
  5. [ブランチ] で、[starter-no-infra] を選択します。 これは、Azure 関連のファイルや構成を含まない、サンプル アプリで作業したのと同じブランチです。
  6. [認証の種類] で、[ユーザー割り当て ID] を選択します。
  7. 上部のメニューから、[保存] を選択します。 App Service は、選んだ GitHub リポジトリの .github/workflows ディレクトリに、ワークフロー ファイルをコミットします。 既定では、デプロイ センターでは Microsoft Entra (OIDC 認証) を使用して、認証するワークフローのユーザー割り当て ID を作成します。 代替認証オプションについては、「GitHub Actions を使用した App Service へのデプロイ」を参照してください。

GitHub Actions を使って CI/CD を構成する方法を示すスクリーンショット。

手順 3: サンプル フォークの GitHub codespace に戻り、git pull origin starter-no-infra を実行します。 これにより、新しくコミットされたワークフロー ファイルが codespace にプルされます。 ニーズに応じて、.github/workflows/starter-no-infra_msdocs-jboss-mysql.yml でそれを変更できます。

GitHub codespace 内の Git プルを示すスクリーンショット。

ステップ 4 (オプション 1: GitHub Copilot を使用する):

  1. チャット ビューをクリックし、次に [+] をクリックして、新しいチャット セッションを開始します。
  2. "@workspace アプリはデータベースにどのように接続しますか?" と質問すると、Copilot が java:jboss/MySQLDS データ ソースとその構成方法について説明してくれる場合があります。
  3. "Azure の JBoss のデータ ソースでは、java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS という JNDI 名を使います" と音声入力します。Copilot から、以下の「オプション 2: GitHub Copilot を使用しない」のステップにあるものと同様のコードの提案が示され、場合によってはクラスで変更を行うように指示されることもあります。 GitHub Copilot では毎回同じ応答が返されるわけではありません。応答を絞り込むために、さらなる質問が必要になる場合があります。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。

新しい GitHub Copilot チャット セッションで質問する方法を示すスクリーンショット。

ステップ 4 (オプション 2: GitHub Copilot を使用しない):

  1. エクスプローラーで src/main/resources/META-INF/persistence.xml を開きます。 アプリケーションは、開始すると、このファイルのデータベース設定を読み込みます。
  2. <jta-data-source> の値を java:jboss/MySQLDS から java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS に変更します。これは、前に SSH シェル内で JBoss CLI を使用して見つけたデータ ソースです。

GitHub codespace と、開かれた ContextListener.java ファイルを示すスクリーンショット。

手順 5:

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

コミットされ、GitHub にプッシュされる変更を示すスクリーンショット。

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

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

デプロイ センターでデプロイ ログを開く方法を示すスクリーンショット。

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

GitHub の実行が進行中であることを示すスクリーンショット。

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

6.アプリの参照

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

  1. 左側のメニューから [概要] を選びます。
  2. [既定のドメイン] で、アプリの URL を選びます。

Azure portal から App Service を起動する方法を示すスクリーンショット。

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

Azure で実行されている JBoss Web アプリと MySQL のスクリーンショット。

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

7.診断ログをストリーミングする

Azure App Service では、アプリケーションに関する問題の診断に役立つように、コンソールに出力されたすべてのメッセージが収集されます。 次のスニペットに示すように、このサンプル アプリケーションには、この機能を示す標準の Log4j ログ記録ステートメントが含まれています。

private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());

@PersistenceContext
private EntityManager entityManager;

public List<Task> getAllTasks() {
    logger.log(Level.INFO, "Finding all tasks. ");

    return this.entityManager.createNamedQuery("findAllTasks", Task.class).getResultList();
}

App Service のページの左側のメニューで、[ログ ストリーム] を選びます。 プラットフォーム ログとコンテナー内のログを含む、アプリのログが表示されます。

Azure portal でログ ストリームを表示する方法を示すスクリーンショット。

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

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

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

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

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

  1. リソース グループ名に「msdocs-jboss-mysql_group」と入力します。
  2. リソース グループを選択します。

Azure portal でリソース グループを検索し、そこに移動する方法を示すスクリーンショット。

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

Azure portal 内の [リソース グループの削除] ボタンの場所を示すスクリーンショット。

ステップ 3:

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

Azure portal でリソース グループを削除するための確認ダイアログを示すスクリーンショット。

2.Azure リソースを作成してサンプル アプリをデプロイする

このステップでは、Azure リソースを作成し、サンプル アプリを App Service on Linux にデプロイします。 このチュートリアルで使用される手順では、App Service と Azure Database for MySQL を含む既定でセキュリティ保護された一連のリソースを作成します。

開発コンテナーには、既に Azure Developer CLI (AZD) が含まれています。

  1. リポジトリのルートから、azd init を実行します。

    azd init --template jboss-app-service-mysql-infra
    
  2. メッセージが表示されたら、次の回答を入力します。

    Question Answer
    '<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)。 英数字とハイフンを使用できます。
  3. azd auth login コマンドを実行し、プロンプトに従って Azure にサインインします。

    azd auth login
    
  4. 必要な Azure リソースを作成し、azd up コマンドを使用してアプリ コードをデプロイします。 プロンプトに従って、Azure リソースの目的のサブスクリプションと場所を選択します。

    azd up
    

    azd up コマンドが完了するまで約 15 分かかります (大部分の時間は Redis キャッシュに費やされます)。 また、アプリケーション コードのコンパイルとデプロイも行われますが、後でコードを変更して App Service で動作するようにします。 実行中、このコマンドは、Azure のデプロイへのリンクを含む、プロビジョニングとデプロイのプロセスに関するメッセージを提供します。 完了すると、コマンドはデプロイ アプリケーションへのリンクも表示します。

    この AZD テンプレートには、次の Azure リソースを使用して既定でセキュリティ保護されたアーキテクチャを生成するファイル (azure.yamlinfra ディレクトリ) が含まれています。

    • [リソース グループ]: 作成されたすべてのリソースのコンテナー。
    • [App Service プラン]: App Service のコンピューティング リソースを定義します。 B1 レベルの Linux プランが作成されます。
    • [App Service]: アプリを表し、App Service プランで実行されます。
    • [仮想ネットワーク]: App Service アプリと統合され、バックエンド ネットワーク トラフィックを分離します。
    • Azure Database for MySQL Flexible Server: 仮想ネットワークからのみアクセス可能です。 サーバー上にデータベースが自動的に作成されます。
    • [Azure Cache for Redis]: 仮想ネットワーク内からのみアクセスできます。
    • プライベート エンドポイント: 仮想ネットワーク内のキー コンテナーと Redis キャッシュのアクセス エンドポイント。
    • [プライベート DNS ゾーン]: 仮想ネットワーク内のキー コンテナー、データベース サーバー、Redis キャッシュの DNS 解決を可能にします。
    • [Log Analytics ワークスペース]: アプリでログを配布するためのターゲット コンテナーとして機能します。ここでは、ログにクエリを実行することもできます。
    • [キー コンテナー]: AZD を使用して再デプロイしたときにデータベース パスワードを同じに維持するために使用されます。

    コマンドによるリソースの作成とアプリケーション コードのデプロイが初めて完了したときには、デプロイされたサンプル アプリはまだ機能しません。これは、Azure のデータベースに接続するために少し変更を加える必要があるためです。

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

3.接続文字列を確認する

使用している AZD テンプレートにより、接続変数がアプリ設定として既に自動的に生成されており、それらが便宜のためにターミナルに出力されます。 アプリの設定は、接続のシークレットをコード リポジトリに残さないための 1 つの方法です。

  1. AZD の出力で、アプリ設定 AZURE_MYSQL_CONNECTIONSTRING を見つけます。 設定名のみが表示されます。 これらは、AZD の出力では次のようになります。

     App Service app has the following app settings:
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
             - AZURE_MYSQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
     

    AZURE_MYSQL_CONNECTIONSTRING には、Azure の MySQL データベースへの接続文字列が含まれています。 これは、後でコードで使用する必要があります。

  2. 便宜のために、AZD テンプレートでは、アプリのアプリ設定ページへの直接リンクが示されます。 そのリンクを見つけ、それを新しいブラウザー タブで開きます。

    有効な Oracle、SQL Server、PostgreSQL、または MySQL の接続文字列を含むアプリ設定を追加すると、App Service はそれを Java Naming and Directory Interface (JNDI) データ ソースとして、JBoss サーバーの context.xml ファイル内に追加します。

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

4.JNDI データ ソースを確認する

この手順では、アプリ コンテナーへの SSH 接続を使用して、JBoss サーバー内の JNDI データ ソースを確認します。 このプロセスでは、JBoss コンテナーの SSH シェルにアクセスする方法について説明します。

  1. AZD の出力で、SSH セッションの URL を見つけ、ブラウザーでそこに移動します。 出力では次のようになります。

     Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
     
  2. SSH ターミナルで $JBOSS_HOME/bin/jboss-cli.sh --connect を実行します。

  3. JBoss CLI 接続で、ls subsystem=datasources/data-source を実行します。 AZURE_MYSQL_CONNECTIONSTRING_DS という名前の自動生成されたデータ ソースが表示されます。

  4. /subsystem=datasources/data-source=AZURE_MYSQL_CONNECTIONSTRING_DS:read-attribute(name=jndi-name) を使って、データ ソースの JNDI 名を取得します。 これで JNDI 名 java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS がわかりました。この後、それをアプリケーションのコードで使用できます。

    SSH シェルで実行するコマンドとその出力を示すスクリーンショット。

Note

/home 内のファイルへの変更のみが、アプリの再起動後も保持されます。 たとえば、JBoss CLI で /opt/eap/standalone/configuration/standalone.xml を編集したり、サーバー構成を変更したりした場合、アプリを再起動すると変更は保持されません。 変更を保持するには、「Azure App Service で Tomcat、JBoss、または Java SE アプリのデータ ソースを構成する」で示されているように、スタートアップ スクリプトを使います

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

5.サンプル コードを変更して再デプロイする

  1. GitHub codespace で、[チャット] ビューをクリックし、次に + をクリックして、新しいチャット セッションを開始します。

  2. "@workspace アプリはデータベースにどのように接続しますか?" と質問すると、Copilot が java:jboss/MySQLDS データ ソースとその構成方法について説明してくれる場合があります。

  3. 「@workspace persistence.xml 内で定義されているデータ ソースを JBoss 内にある既存の JNDI データ ソースと置き換えたいです」と質問します。Copilot は、次のオプション 2: GitHub Copilot を使用しない内の手順のものと同様のコード候補を提示し、persistence.xml ファイル内に変更を加えるように指示する場合があります。

  4. エクスプローラー内で src/main/resources/META-INF/persistence.xml を開き、推奨された JNDI の変更を加えます。

    GitHub Copilot から返される応答は毎回同じではありません。応答を微調整するために、他の質問が必要になる場合があります。 ヒントについては、「自分の codespace で GitHub Copilot を使用して何ができますか?」を参照してください。

  5. codespace ターミナルで azd deploy を実行します。

    azd deploy
    

ヒント

また、azd packageazd provisionazd deploy のすべてを実行する azd up だけを常に使用することもできます。

War ファイルのパッケージ化方法を確認するには、azd package --debug を単独で実行します。

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

6.アプリの参照

  1. AZD の出力で、アプリの URL を見つけ、ブラウザーでそこに移動します。 URL は、AZD の出力では次のようになります。

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
     
  2. 一覧にいくつかのタスクを追加します。

    Azure 内で実行されている、タスクが表示された JBoss Web アプリ (MySQL を使用) のスクリーンショット。

    おめでとうございます。Azure Database for MySQL へのセキュリティで保護された接続を使用して、Web アプリが Azure App Service で実行されています。

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

7.診断ログをストリーミングする

Azure App Service はコンソール ログをキャプチャできるので、アプリケーションに関する問題の診断に役立ちます。 便宜のために、AZD テンプレートでは、既にローカル ファイル システムへのログ記録が有効になっており、それらのログが Log Analytics ワークスペースに配布されています

次のスニペットに示すように、このサンプル アプリケーションには、この機能を示す標準の Log4j ログ記録ステートメントが含まれています。

private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());

@PersistenceContext
private EntityManager entityManager;

public List<Task> getAllTasks() {
    logger.log(Level.INFO, "Finding all tasks. ");

    return this.entityManager.createNamedQuery("findAllTasks", Task.class).getResultList();
}

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 を有効にする」をご覧ください。

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

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

現在のデプロイ環境内のすべての Azure リソースを削除するには、azd down を実行し、プロンプトに従います。

azd down

トラブルシューティング

作成ウィザードで 'ライセンス持ち込み機能を使用する権利がありません' というエラーが表示される。

The subscription '701ea799-fb46-4407-bb67-9cbcf289f1c7' is not entitled to use the Bring Your Own License feature when creating the application というエラーが表示される場合は、[Java Web サーバー スタック][Red Hat JBoss EAP 7/8 BYO ライセンス] を選びましたが、Red Hat Cloud Access で Azure アカウントを設定していないか、Red Hat Cloud Access にアクティブな JBoss EAP ライセンスがないことを意味します。

Azure Database for MySQL フレキシブル サーバーのポータル デプロイ ビューに競合状態が表示される。

サブスクリプションや選択したリージョンによっては、Azure Database for MySQL フレキシブル サーバーのデプロイの状態が Conflict になり、[操作の詳細] に次のメッセージが表示されることがあります。

InternalServerError: An unexpected error occured while processing the request.

このエラーの原因である可能性が最も高いのは、選択したリージョンのサブスクリプションに対する制限です。 デプロイのために別のリージョンを選択してみてください。

[接続の作成] ダイアログに [Cloud Shell で作成] ボタンは表示されるが、有効になっていない。

ダイアログに次のエラー メッセージが表示される場合もあります: The database server is in Virtual Network and Cloud Shell can't connect to it. Please copy the commands and execute on an environment which can connect to the database server in Virtual Network.

サービス コネクタの自動化には、MySQL サーバーへのネットワーク アクセスが必要です。 MySQL サーバー リソースでネットワークの設定を確認し、少なくとも [パブリック IP アドレスを使用したインターネット経由でのこのリソースへのパブリック アクセスを許可する] がオンになっていることを確認します。 Service Connector はそこからそれを取得できます。

このチェックボックスが表示されない場合は、代わりに Web アプリとデータベース ウィザードを使ってデプロイを作成し、MySQL サーバーへのすべてのパブリック ネットワーク アクセスがロックダウンされている可能性があります。 構成を変更する方法はありません。 アプリの Linux コンテナーは仮想ネットワーク統合を通じて MySQL にアクセスできるため、アプリの SSH セッションで Azure CLI をインストールし、そこで指定された Cloud Shell コマンドを実行できます。

デプロイされたサンプル アプリにタスク リスト アプリが表示されない。

タスク リスト アプリの代わりに JBoss スプラッシュ ページが表示される場合は、App Service がまだ最新のコード デプロイから更新されたコンテナーを読み込んでいる最中である可能性があります。 数分待ってからページを更新してください。

アプリの起動が失敗し、ログで 'ユーザーのアクセスが拒否されました... (パスワードの使用: NO)' と表示される。

このエラーが発生する可能性が最も高いのは、接続文字列にパスワードレス認証プラグインを追加しなかった場合です (「Azure Database for MySQL を Service Connector と統合する」の Java サンプル コードを参照してください)。 「3. パスワードレス接続を作成する」の手順に従って、MySQL の接続文字列を変更します。

診断ログに "テーブル 'Task' は既に存在します" というエラーが表示される。

この休止状態エラーは、アプリケーション コードが MySQL データベースに接続されていることを示しているため無視できます。 アプリケーションは、起動時に必要なテーブルを作成するように構成されています (src/main/resources/META-INF/persistence.xml を参照)。 アプリケーションは、初めて起動するときにテーブルを正しく作成するはずですが、その後の再起動時には、テーブルが既に存在するため、このエラーが表示されます。

よく寄せられる質問

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

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

  • App Service プランは P0v3 レベルで作成され、スケールアップまたはスケールダウンできます。 「App Service の価格」をご覧ください。
  • MySQL フレキシブル サーバーは D2ds レベルで作成され、スケールアップまたはスケールダウンできます。 「Azure Database for MySQL の価格」をご確認ください。
  • Azure Cache for Redis は、最小キャッシュ サイズの Basic レベルで作成されます。 このレベルには少ないコストがかかります。 高い可用性、クラスタリング、およびその他の機能のために、より高いパフォーマンス レベルにスケールアップできます。 「Azure Cache for Redis の価格」を参照してください。
  • 仮想ネットワークでは、ピアリングなどの追加機能を構成しない限り、料金は発生しません。 「Azure Virtual Network の価格」を参照してください。
  • プライベート DNS ゾーンでは、少額の料金が発生します。 「Azure DNS の価格」を参照してください。

他のツールを使用して仮想ネットワークの背後の MySQL サーバーに接続するにはどうすればよいですか?

このチュートリアルでは、App Service アプリには既に MySQL サーバーへのネットワーク接続があり、そのシステム割り当てマネージド ID を使用して Microsoft Entra で認証できます。 SSH セッション内で次のコマンドを実行することで、アプリ コンテナー内から直接 MySQL に接続できます (AZURE_MYSQL_CONNECTIONSTRING アプリ設定から <server><user><database> の値を取得してください)。

apt-get update
apt-get install curl less mysql-client jq -y
mysql -h <server> --user <user> --database <database> --enable-cleartext-plugin --password=`curl "${IDENTITY_ENDPOINT}?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01" -H "X-IDENTITY-HEADER: $IDENTITY_HEADER" -s | jq -r '.access_token'`

いくつかの考慮事項があります。

  • SSH セッション内にインストールするツールは、アプリの再起動後に保持されません。
  • ポータルの手順に従い、管理者として Microsoft Entra ユーザーを使用して MySQL を構成した場合は、その Microsoft Entra ユーザーを使用して MySQL に接続できます。
  • MySQL Workbench などのデスクトップ ツールから接続するには、マシンがその仮想ネットワーク内に存在する必要があります (同じ仮想ネットワーク内にデプロイされた Azure VM など)。 また、マネージド ID または Microsoft Entra ユーザーのいずれかを使用して、認証を個別に構成する必要があります。
  • Azure 仮想ネットワークとのサイト間 VPN 接続があるオンプレミス ネットワーク内のマシンから接続するには、マネージド ID では認証を構成できませんが、Microsoft Entra ユーザーを使用して認証を構成できます。
  • Azure Cloud Shell を統合し、Azure CLI または MySQL CLI を使用して接続することもできます。 認証するには、Microsoft Entra ユーザーを構成してください。

Microsoft Entra 認証を使用して MySQL 接続の有効なアクセス トークンを取得するにはどうすればよいですか?

MySQL データベースへのアクセスが認可されている Microsoft Entra ユーザー、システム割り当てマネージド ID、またはユーザー割り当てマネージド ID の場合、Azure CLI を使用してアクセス トークンを生成できます。 マネージド ID の場合、Azure CLI を実行する App Service アプリまたは VM 上でその ID を構成する必要があります。

# Sign in as a Microsoft Entra user
az login
# Sign in as the system-assigned managed identity
az login --identity
# Sign in as a user-assigned managed identity
az login --identity --username <client-id-of-user-assigned-identity>

# Get an access token
az account get-access-token --resource-type oss-rdbms

必要に応じて、「az mysql flexible-server connect」Azure CLI コマンドを使用して MySQL に接続することもできます。 プロンプトが表示されたら、アクセス トークンをパスワードとして使用します。

az mysql flexible-server connect -n <server-name-only> -u <user> -d <database> --interactive

詳細については、以下を参照してください:

GitHub Actions でのローカル アプリの開発はどのように行いますか。

App Service から自動生成されたワークフロー ファイルを例として使用すると、git push ごとに新しいビルドとデプロイの実行が起動されます。 GitHub リポジトリのローカル クローンから、必要な更新を行い、GitHub にプッシュします。 次に例を示します。

git add .
git commit -m "<some-message>"
git push origin starter-no-infra

ユーザー割り当て ID を作成するためのアクセス許可がありません

デプロイ センターから GitHub Actions デプロイを設定する」を参照してください。

自分のコードスペースで GitHub Copilot を使用して何ができますか?

codespace を作成したときに、既に 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 を使用して) 変更を行う箇所も提案できますが、変更を行うことはできません。 提案された変更を追加してテストするかどうかは、ご自身が決める必要があります。

次のように、得られる回答を微調整するために役立つことが他にもあります。

  • データ ソース jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS を使うように、このコードを変更してください。
  • コード内のいくつかのインポートでは javax を使用していますが、私は Jakarta アプリを使用しています。
  • 私は、環境変数AZURE_MYSQL_CONNECTIONSTRING が設定されている場合にのみ、このコードを実行したいと考えています。
  • このコードを、ローカルではなく Azure App Service でのみ実行したいと考えています。

次のステップ

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

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