次の方法で共有


Spring Boot アプリケーションを Azure App Service に移行する

このガイドでは、既存の Spring Boot アプリケーションを Azure App Service に移行する場合に注意する必要がある事項について説明します。

移行前

移行を確実に成功させるには、開始する前に、次のセクションで説明する評価とインベントリの手順を完了します。

サポートされているプラットフォームに切り替える

App Service には、特定のバージョンの Java SE が用意されています。 互換性を確保するには、残りの手順を続行する前に、サポートされているバージョンの現在の環境のいずれかにアプリケーションを移行します。 必ず、結果の構成を完全にテストしてください。 このようなテストでは、Linux ディストリビューションの最新の安定したリリースを使用してください。

現在のサーバーがサポートされていない JDK (Oracle JDK や IBM OpenJ9 など) で実行されている場合、この検証が特に重要です。

現在の Java バージョンを取得するには、実稼働サーバーにサインインし、次のコマンドを実行します。

java -version

Azure App Service では、Java 8 のバイナリは Eclipse Temurin から提供されます。 Java 11、17、および Java の今後のすべての LTS リリースの場合、App Service は OpenJDK の Microsoft ビルドを提供します。 これらのバイナリは、次のサイトで無料でダウンロードできます。

外部リソースをインベントリする

データ ソース、JMS メッセージ ブローカー、他のサービスの URL などの外部リソースを識別します。 Spring Boot アプリケーションでは、通常、このようなリソースの構成は、通常、application.properties または application.yml と呼ばれるファイル内の src/main/directory フォルダーにあります。 さらに、本番環境のデプロイメントにおける環境変数を確認し、関連する構成設定を探します。

データベース

Spring Boot アプリケーションの場合、接続文字列は通常、外部データベースに依存する場合に構成ファイルに表示されます。 application.properties ファイルの例を次に示します。

spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

application.yaml ファイルの例を次に示します。

spring:
  data:
    mongodb:
      uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017

可能な構成シナリオについては、Spring Data のドキュメントを参照してください。

JMS メッセージ ブローカー

関連する依存関係のビルド マニフェスト (通常は 、pom.xml または build.gradle ファイル) を調べることで、使用中のブローカーを特定します。

たとえば、ActiveMQ を使用する Spring Boot アプリケーションでは、通常、 pom.xml ファイルにこの依存関係が含まれます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

商用ブローカーを使用する Spring Boot アプリケーションには、通常、ブローカーの JMS ドライバー ライブラリへの直接の依存関係が含まれます。 build.gradle ファイルの例を次に示します。

    dependencies {
      ...
      compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
      ...
    }

使用中のブローカーを特定したら、対応する設定を見つけます。 Spring Boot アプリケーションでは、通常、アプリケーション ディレクトリ内の application.properties ファイルと application.yml ファイルで見つけることができます。

Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 この手順で説明する認証フロー (データベース、キャッシュ、メッセージング、AI サービスなど) には、アプリケーションに対する非常に高い信頼が必要であり、他のフローには存在しないリスクが伴います。 このフローは、パスワードレス接続やキーレス接続のマネージド ID など、より安全なオプションが有効でない場合にのみ使用します。 ローカル コンピューターの操作では、パスワードレス接続またはキーレス接続にユーザー ID を使用します。

application.properties ファイルの ActiveMQ の例を次に示します。

spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=<password>

ActiveMQ 構成の詳細については、 Spring Boot メッセージングのドキュメントを参照してください

application.yaml ファイルの IBM MQ の例を次に示します。

ibm:
  mq:
    queueManager: qm1
    channel: dev.ORDERS
    connName: localhost(14)
    user: admin
    password: <password>

IBM MQ 構成の詳細については、 IBM MQ Spring コンポーネントのドキュメントを参照してください

外部キャッシュを識別する

使用中の外部キャッシュを特定します。 多くの場合、Redis は Spring Data Redis 経由で使用されます。 構成情報については、 Spring Data Redis のドキュメントを参照してください。

(Java または XML で) それぞれの構成を検索して、セッション データが Spring Session 経由でキャッシュされているかどうかを判断します。

ID プロバイダー

アプリケーションで使用される ID プロバイダーを特定します。 ID プロバイダーの構成方法については、次を参照してください。

その他のすべての外部リソース

このガイドでは、考えられるすべての外部依存関係を記載することはできません。 App Service の移行後にアプリケーションのすべての外部依存関係が満たされることを確認するのは、チームの責任です。

インベントリ シークレット

パスワードとセキュリティで保護された文字列

本番環境へのデプロイにおいて、すべてのプロパティや構成ファイル、そしてすべての環境変数を確認し、シークレット文字列やパスワードが含まれているかどうかをチェックしてください。 Spring Boot アプリケーションでは、このような文字列は application.properties または application.yml で見つかる可能性があります。

インベントリ証明書

パブリック SSL エンドポイントまたはバックエンド データベースやその他のシステムとの通信に使用されるすべての証明書を文書化します。 次のコマンドを実行して、運用サーバー上のすべての証明書を表示できます。

keytool -list -v -keystore <path to keystore>

ファイル システムが使用されているかどうかとその使用方法を判断する

アプリケーション サーバーでファイル システムを使用する場合は、再構成や、まれにアーキテクチャの変更が必要になります。 次のシナリオの一部または全部を確認できます。

読み取り専用の静的コンテンツ

アプリケーションが現在静的コンテンツを提供している場合は、別の場所が必要です。 グローバルに高速ダウンロードするには、静的コンテンツを Azure Blob Storage に移動し、Azure Front Door を追加することを検討する必要があります。 詳細については、「Azure Storage での静的な Web サイトホスティング」を参照し、Azure Storage アカウントを Azure Front Door と統合します。

特殊なケース

一部の運用シナリオでは、追加の変更が必要になる場合や、追加の制限が課される場合があります。 このようなシナリオはまれですが、アプリケーションに適用できないか、正しく解決されていることを確認することが重要です。

アプリケーションがスケジュールされたジョブに依存しているかどうかを判断する

スケジュールされたジョブ (Quartz Scheduler タスクや cron ジョブなど) は、App Service では使用できません。 App Service では、スケジュールされたタスクを含むアプリケーションを内部的にデプロイすることはできません。 ただし、アプリケーションをスケールアウトすると、同じスケジュールされたジョブが、スケジュールされた期間に複数回実行されることがあります。 このような場合、意図しない結果になることがあります。

アプリケーション プロセスの内部または外部で、スケジュールされたジョブのインベントリを作成します。

アプリケーションに OS 固有のコードが含まれているかどうかを判断する

アプリケーションにホスト OS に依存するコードが含まれている場合は、それをリファクタリングしてそれらの依存関係を削除する必要があります。 たとえば、アプリケーションが Windows 上で実行されている場合、ファイル システム パス内の / または \ の使用を File.Separator または Paths.get に置き換える必要がある場合があります。

運用サーバーで実行されているすべての外部プロセス/デーモンを特定する

監視デーモンなど、アプリケーション サーバーの外部で実行されているプロセスは、別の場所に移行するか、削除する必要があります。

HTTP 以外の要求または複数のポートの処理を識別する

App Service では、1 つのポートで 1 つの HTTP エンドポイントのみがサポートされます。 アプリケーションが複数のポートでリッスンするか、HTTP 以外のプロトコルを使用して要求を受け入れる場合は、Azure App Service を使用しないでください。

移動

構成をパラメーター化する

すべての外部リソース座標 (データベース接続文字列など) とその他のカスタマイズ可能な設定を環境変数から読み取れるようにします。 Spring Boot アプリケーションを移行する場合は、すべての構成設定が既に外部化可能である必要があります。 詳細については、Spring Boot ドキュメントの 外部化された構成 を参照してください。

SERVICEBUS_CONNECTION_STRING ファイルから環境変数を参照する例を次に示します。

spring.jms.servicebus.connection-string=${SERVICEBUS_CONNECTION_STRING}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=10000

App Service プランをプロビジョニングする

利用可能なサービス プランの一覧から、仕様が現在の運用ハードウェアの仕様を満たす、または超えているプランを選択します。

ステージング/カナリア デプロイを実行する場合、またはデプロイ スロットを使用する場合は、App Service プランにその追加容量が含まれている必要があります。 Java アプリケーションでは、Premium 以上のプランを使用することをお勧めします。

App Service プランを作成します

Web アプリを作成してデプロイする

実行するすべての実行可能 JAR ファイルについて、App Service プランで Web アプリを作成する必要があります (ランタイム スタックとして "Java SE" を選択します)。

Maven アプリケーション

アプリケーションが Maven POM ファイルから作成されている場合は、Maven 用の Webapp プラグインを使用して Web アプリを作成し、アプリケーションをデプロイします。 詳細については、「クイックスタート: Azure App Service で Java アプリを作成する」を参照してください。

Maven 以外のアプリケーション

Maven プラグインを使用できない場合は、次のような他のメカニズムを使用して Web アプリをプロビジョニングする必要があります。

Web アプリが作成されたら、 使用可能なデプロイ メカニズム のいずれかを使用してアプリケーションをデプロイします。 可能であれば、アプリケーションを /home/site/wwwroot/app.jar にアップロードする必要があります。 JAR の名前を app.jar に変更しない場合は、コマンドを使用して JAR を実行するシェル スクリプトをアップロードできます。 次に、ポータルの [構成] セクションの [スタートアップ ファイル ] ボックスに、このスクリプトの完全なパスを貼り付けます。 スタートアップ スクリプトは、配置先のディレクトリからは実行されません。 そのため、スタートアップ スクリプトでファイルを参照するには、常に絶対パスを使用します (例: java -jar /home/myapp/myapp.jar)。

JVM ランタイムオプションを移行する

アプリケーションで特定のランタイム オプションが必要な場合は、 最も適切なメカニズムを使用して指定します

カスタム ドメインと SSL を構成する

アプリケーションをカスタム ドメインに表示する場合は、Web アプリケーションをそれにマップする必要があります。 詳細については、「チュートリアル: 既存のカスタム DNS 名を Azure App Service にマップする」を参照してください。

その後、そのドメインの SSL 証明書を App Service Web アプリにバインドする必要があります。 詳細については、「 Azure App Service で SSL バインディングを使用してカスタム DNS 名をセキュリティで保護する」を参照してください。

バックエンド証明書をインポートする

データベースなど、バックエンド システムと通信するためのすべての証明書を App Service で使用できるようにする必要があります。 詳細については、「 App Service での SSL 証明書の追加」を参照してください。

外部リソース座標とその他の設定を移行する

接続文字列とその他の設定を移行するには、次の手順に従います。

[構成のパラメーター ] セクションの変数でパラメーター化された Spring Boot アプリケーション設定の場合、これらの環境変数はアプリケーション構成で定義する必要があります。 環境変数で明示的にパラメーター化されていない Spring Boot アプリケーション設定は、引き続き Application Configuration を使用してオーバーライドできます。 例えば次が挙げられます。

spring.jms.servicebus.connection-string=${CUSTOMCONNSTR_SERVICE_BUS}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=1800000

App Service アプリケーションの構成

スケジュールされたジョブを移行する

Azure でスケジュールされたジョブを実行するには、 Azure Functions のタイマー トリガーの使用を検討してください。 ジョブ コード自体を関数に移行する必要はありません。 この関数では、アプリケーションで URL を呼び出すだけでジョブをトリガーできます。 このようなジョブの実行を動的に呼び出したり、一元的に追跡したりする必要がある場合は、 Spring Batch の使用を検討してください。

または、繰り返しトリガーを使用してロジック アプリを作成し、アプリケーションの外部にコードを記述せずに URL を呼び出すこともできます。 詳細については、「概要 - Azure Logic Apps とは」および「Azure Logic Apps で繰り返しトリガーを使用して定期的なタスクとワークフローを作成、スケジュール、実行する」を参照してください。

悪意のある使用を防ぐために、ジョブの呼び出しエンドポイントで資格情報が求められるようにする必要があります。 この場合、トリガー関数が資格情報を提供する必要があります。

ID プロバイダーを移行して有効にする

アプリケーションで認証または承認が必要な場合は、次のガイダンスを使用して ID プロバイダーにアクセスするように構成されていることを確認します。

  • ID プロバイダーが Microsoft Entra ID の場合、変更は必要ありません。
  • ID プロバイダーがオンプレミスの Active Directory フォレストである場合は、Microsoft Entra ID を使用したハイブリッド ID ソリューションの実装を検討してください。 詳細については、 ハイブリッド ID のドキュメントを参照してください
  • ID プロバイダーが PingFederate などの別のオンプレミス ソリューションである場合は、 Microsoft Entra Connect のカスタム インストール に関するトピックを参照して、Microsoft Entra ID とのフェデレーションを構成してください。 または、Spring Security を使用して 、OAuth2/OpenID Connect または SAML 経由で ID プロバイダーを使用することを検討 してください

再起動とスモーク テスト

最後に、Web アプリを再起動してすべての構成の変更を適用する必要があります。 再起動が完了したら、アプリケーションが正しく実行されていることを確認します。

移行後

アプリケーションを Azure App Service に移行したら、期待どおりに動作することを確認する必要があります。 完了したら、アプリケーションをよりクラウドネイティブにするための推奨事項がいくつか用意されています。

推奨事項