エンドツーエンドのセキュリティ、監視、自動化によるスケーリング

アプリケーションを設計する際には、ワークロードの変化に適応する方法、予期しない障害から復旧する方法、セキュリティ リスクを最小限に抑える方法などを決定することが必要です。 トライアンドエラーのアプローチから始めることができる一方で、他の組織的な目標までは時間がかかり、評判に悪影響を与えてしまうことがあります。 Azure では、最初から物事を正しく行うために必要なアーキテクチャ ガイダンスを提供しています。 また、最新のセキュリティと自動スケーリングから、データ、メッセージング、キャッシュ、パフォーマンス監視、自動化のためのサポート サービスまで、スケーラブルなアプリケーションを構築するために必要なすべてが備わっています。 これらのサポート サービスの多くは、PostgreSQL、Redis、JMS、Kafka などのよく知られたオープンソース ソフトウェアに基づいているため、所有するソリューションに固定されることはありません。

「Platform Services」という見出しとこの記事で説明するサービスのロゴを含む図。

これから、いくつかの主要な Azure サービスと機能と、それらを使用してスケーラブルな Java アプリケーションを構築する方法を見ていきましょう。

Java アプリケーションの機能を拡張する - データベースとメッセージング

Azure には、Java コードを実行するためのオプションがいくつか用意されているほか、Azure Database for PostgreSQLAzure Database for MySQLMongoDB AtlasAzure Cosmos DBAzure SQL DatabaseAzure SQL Managed Instance など、データベースのニーズをサポートするさまざまなフル マネージド サービスが用意されています。 メッセージングにも同じことが当てはまり、Azure Service BusAzure Event HubsConfluent Cloud 用 Apache Kafka などのオプションが備わっています。

Azure Service Bus プレミアム ティアでは、ava Messaging Service プログラミング モデルである JMS がサポートされています。 使用するアプリケーションが VM、Kubernetes またはフル マネージド PaaS サービスのいずれかで実行されているかに関係なく、オープンソース クライアント、Azure Java SDK、Spring Starters、およびアプリケーション サーバー統合を使用して、これらのフル マネージドデータおよびメッセージング サービスをすばやくプロビジョニングして使用できます。 これらはすべて、Microsoft と Azure に求められるコンプライアンス、可用性、信頼性の保証を提供します。 Java と Spring 開発者の多くは、特定のクラウド サービスへの接続を簡略化するために、慣用的なライブラリを使用することを望んでいます。 Microsoft は、ライブラリ、ドライバーおよびモジュールの総合リストを提供しているため、データ、メッセージング、キャッシュ、ストレージ、イベント、ディレクトリ、およびシークレット管理全体で Azure サービスと簡単にやり取りできるようになります。 詳細については、「Spring Cloud Azure 開発者向けガイド」を参照してください。

Spring Cloud Azure と関連する Azure サービスの機能を示す図。

さまざまな Java ライブラリ、ドライバー、Spring モジュールでサポートされている機能カテゴリと関連する Azure プラットフォーム サービスを示す図。

ゼロ トラスト - 安全なネットワーク

Java アプリケーションを Azure の独自のプライベート ネットワークの基本的な構成要素である Azure Virtual Network 内にデプロイすることで安全に保護できます。 仮想ネットワークにより、多くの種類の Azure リソースは他の Azure リソース、インターネット、オンプレミスのネットワークとシステムとの間で安全に通信することができるようになります。 仮想ネットワークを使用すると、アプリケーションとサポート バックエンド サービスをインターネットから分離し、プライベート ネットワークに配置することができます。 アプリケーションとバックエンド システムのイングレスとエグレスの完全制御を把握できます。

Azure Spring Apps 参照アーキテクチャの図。

ゼロトラスト - エンド ツー エンドの安全なコミュニケーション

ソリューション アーキテクチャの一部としてセキュリティで保護されたコミュニケーションを実装するには困難が伴うことがあります。 多くの会社では、証明書を手動でローテーションするか、独自のソリューションを構築して、プロビジョニングと構成を自動化しています。 それでも、不正なコピーやデータ転送などのデータ流出リスクは依然として存在します。

Azure を使用すると、通信をエンド ツー エンドでセキュリティで保護したり、任意の通信ポイントでトランスポート レベルのセキュリティを終了したりできます。 また、通信のセキュリティ保護に必要なすべての Azure リソースのプロビジョニングと構成を自動化することもできます。 Azure Spring Apps でこれを行う方法については、「Spring Boot アプリへのエンド ツー エンドのセキュリティで保護された通信 (ゼロ トラスト環境)」を参照してください。 このプロセスは、Java アプリケーションの実行に使用できる他の Azure コンピューティング サービスと類似しています。

「決して信頼せず、常に検証せよ、そして認証情報を使用しない」という原則に基づいて、ゼロ トラストは、不明な証明書と管理されていない証明書を排除し、それらの証明書へのアクセスを許可する前に ID を確認することによって共有される証明書のみを信頼することで、すべての通信をセキュリティで保護するために機能します。 認証局が発行した証明書、拡張検証証明書、複数のサブドメインをサポートするワイルドカード証明書、開発環境およびテスト環境用の自己署名証明書など、あらゆるタイプのTLS/SSL証明書を使用できます。

Java または Spring Boot アプリでは、Azure Key Vault (次章で説明) から証明書を安全にロードできます。 Azure Key Vault を使用することで、ユーザーは証明書の保管と配布を管理し、事故による漏洩を減らすことができます。 アプリケーションとサービスは、マネージド ID、ロールに基づいたアクセス制御、最小限の権限の原則を使用して、証明書に安全にアクセスできます。 このセキュアな読み込み機能は、Azure Key Vault の JCA (Java Cryptography Architecture) プロバイダーによって提供されます。

Spring Boot アプリの安全なエンドツーエンド通信のアーキテクチャの図。

ゼロ トラスト - シークレットの管理

多くの Java アプリケーションは、URL と資格情報を使用してサポート サービスに接続します。これらの情報が流出すると、機密データへの許可されないアクセスを行うために使用されてしまうことがあります。 このような情報をアプリ自体に埋め込むと、コード リポジトリを介した取得など、さまざまな理由で大きなセキュリティ上のリスクとなります。 多くの開発者は、環境変数を使用してこのような資格情報を外部化することで複数のアプリケーションがこれらを読み込むことができるようにしています。しかし、これは、コード自体から実行環境にリスクが移行しただけのことです。

「ゼロ トラスト - Azure Key Vault を使用してシークレットを管理する」という見出しとこのセクションで説明する機能の概要を含む図。

Azure Key Vault では、シークレットを保護するための、より優れた、安全性を向上させた、よりセキュアな方法を提供しています。 これにより、ロールベースのアクセス制御 (RBAC) とアクセスを制限するための最小限の権限の原則を使用して、アプリケーション シークレットのストレージと配布を完全に制御できます。 アプリケーションのシークレットへの制御を引き続き行いながら、必要に応じてこれらを使用するための権限のみをアプリケーションに付与します。 アプリケーションを起動すると、シークレットへのアクセスを許可する前に、アプリケーションは Microsoft Entra ID で認証され、Azure Key Vault は Azure RBAC を使用して承認します。 Azure Key Vault にはフル監査機能があり、2 つのサービス レベルがあります。ソフトウェア キーを使用して暗号化する Standard レベルとハードウェア セキュリティ モジュール (HSM) で保護されたキーを含む Premium レベルです。

エンド ユーザーの認証と承認

ほとんどのエンタープライズ Java アプリケーションでは、ユーザー認証と承認が必要です。これは、統合されたセキュリティを備えた完全な ID およびアクセス管理ソリューションである Microsoft Entra ID を使用して実装できます。 エンド ユーザーのアカウントは、Microsoft Entra ID と Azure Active Directory B2C を使用して、Facebook、Twitter、Gmail の組織 ID またはソーシャル ID にすることができます。 Microsoft Authentication Library for Java または Spring Boot Starter for Microsoft Entra を使用して、Microsoft Entra ID ベースのソリューションを実装できます。 また、ForgeRock、Auth0、Ping、Okta などの任意の ID プロバイダーを使用することもできます。

エンドツーエンドで監視する

Azure では、任意のツールとプラットフォームを使用して、Java アプリケーションをエンド ツー エンドで監視できます。 あるいは、Azure Monitor の機能である Application Insights を使用して、アプリケーション パフォーマンス監視 (APM) を含むフル マネージドのネイティブ監視を実装することもできます。 Java、Spring、そして Micrometer や Spring Boot などのフレームワークを強力にサポートしているため、問題をすばやく特定してトラブルシューティングできます。 機能には、ライブ メトリック ストリーミング、要求率と応答時間の追跡、イベント トレーシング、外部依存率など、Azure またはオンプレミス上で実行する Java アプリケーションの可用性、パフォーマンス、信頼性、使用状況を監視するために必要なすべてが含まれています。

Azure Portal のツールである Log Analytics でログとメトリックを集計することで、エンド ツー エンドで監視できます。このツールを使用して、Azure Monitor のログとメトリック データに対するクエリを編集および実行することができます。 一連のレコードを返すクエリを作成したら、Log Analytics を使用し、それらのレコードを並べ替え、フィルター、分析できます。 また、統計分析を行うためにより高度なクエリを作成し、結果をグラフで視覚化して、特定の傾向を把握するために使用することもできます。 クエリの結果を対話的に操作する場合やログ クエリ アラートあるいはワークブックなどそのほかの Azure Monitor 機能で使用する場合でも、Log Analytics はクエリの作成およびテストのために便利なツールです。

ただし、お客様が独自の Java アプリケーションを Azure に持ち込む場合、オンプレミス アプリケーションの監視に使用しているのと同じ APM ツールを引き続き使用することが必要になる可能性があることも認識しています。 この使用状況をサポートするために、New RelicAppDynamicsDynatraceElastic と提携し、監視ソリューションを Azure アプリ Service および Azure Spring Apps と統合しました。 監視エージェントはコードと並行して実行され、Microsoft はエージェントのインストールおよびその更新状態の維持を行います。 Azure Container Apps、Azure Kubernetes Service、または Virtual Machines にデプロイする場合、アプリケーションと共にこれらのエージェント (New Relic、AppDynamics、Dynatrace、Elastic、Datadog を含む) を実行することもできますが、それらを自分でインストールして管理する必要があります。 同様に、Elastic and Splunk でログとメトリックを集計することで、エンド ツー エンドでの監視ができます。

「任意のツールとプラットフォームを使用してエンド ツー エンドを監視する」という見出し、スクリーンショットの例、およびこの記事で説明するツールのロゴを含む図。

また、多くのお客様が Grafana を引き続き使用して、メトリックのクエリ、視覚化、アラート、理解を行いたいと望んでいることもわかっています。 このため、Grafana Labs と提携して、Azure Managed Grafana を提供します。これは、お客様が Azure で Grafana をネイティブに実行できるフル マネージド サービスです。 このサービスを使用すると、セキュリティで保護されたスケーラブルな Grafana インスタンスを簡単にデプロイし、それらをオープンソース、クラウド、およびサードパーティのデータ ソースに接続して視覚化と分析を行うことができます。 このサービスは、Azure Monitor や Azure Data Explorer などの Azure ネイティブ データ ソース用に最適化されており、Azure App Service、Azure Spring Apps、Azure Kubernetes Service、Splunk、Datadog、Azure Virtual Machines などの Azure コンピューティング サービスとのアプリケーション パフォーマンス監視 (APM) 統合が含まれています。

キャッシュを使用して Java アプリケーションを高速化する

Java アプリケーションのワークロードが増加するにつれて、Azure Cache for Redis を使用してクエリの結果、セッション状態、静的コンテンツ用のメモリ内キャッシュ レイヤーを実装することで、パフォーマンスを向上させることができます。 基になるデータベースを再設計することなく、アプリケーションのスループットを向上させ、待機時間を短縮する優れた方法です。 Redis と連携して開発され、Microsoft によってフル マネージされる Azure Cache for Redis Enterprise レベルは、アクティブ geo レプリケーション、外部化されたセッション管理、高速検索とインデックス作成などの機能を含む、Azure で Redis を実行するための最も高可用性でスケーラブルなデプロイ オプションです。

「Redis Cache を使用した Java アプリの高速化とスケーリング」という見出しとこのセクションで説明する機能の概要を含む図。

自動スケーリング

Java アプリケーションを実行するためのすべての Azure 「コンピューティング」サービスでは、自動スケーリング (自動スケーリング) がサポートされています。これは、コスト効率を最大化し、ニーズを上回る容量を支払うことなく、変化するワークロードに適応するのに役立ちます。 これを有効にすると、自動スケーリングによって基盤となるインフラストラクチャとアプリケーションのワークロードが処理されるので安心できます。

「自動スケーリングを使用してアプリの使用率を高くする」という見出しとこのセクションで説明する機能の概要を含む図。

負荷またはスケジュールに基づいて自動的にスケールインまたはスケールアウトできます。 負荷ベース (またはメトリックベース) モードでは、アプリケーションは、設定した制限まで、負荷を処理するために必要なリソースに水平方向にスケールアウトされます。 同様に、負荷が減少すると、リソースは水平方向にスケールインされ、設定した最小値を下回ることはありません。

スケジュール ベース モードでは、アプリケーションは定義されたスケジュールと制限に基づいてスケールインおよびスケールアウトします。 スケジュール ベースのモードは、予測可能なパターンに従うワークロードに便利であり、より負荷ベースのスケーリングのベースラインを確立するために使用できます。

アイデアから運用への自動化

アプリケーションをクラウドに移行するときは、エンタープライズ規模での Java 開発の必要性に応じて、すべてを自動化する必要があります。 前にも取り上げたように、アプリケーションのワークロードに対処するための自動スケーリングを検討する必要があります。 ただし、テスト、QA、運用、ブルー / グリーン デプロイ、地理的な拡張などの新しい環境を迅速にプロビジョニングする方法など、クラウド環境全体 (アイデアから運用環境まで) 全体をスケーリングして自動化する必要もあります。

プロビジョニング、ビルド、展開の各カテゴリのボックスと、このセクションで説明するツールに関連するロゴを示す図。

Azure では、幅広いツールとプラットフォームを使用して、アイデアから運用までを自動化できます。 大まかに言えば、このような自動化パイプラインは 3 つのカテゴリに分類できます。

  • パイプラインのプロビジョニング - 必要に応じて、Terraform、Azure Resource Manager (ARM) テンプレート、Bicep テンプレート、または Azure CLI を使用して Azure リソースをプロビジョニングし、一貫してスピンアップおよびスピンダウンする環境用の反復可能なスクリプトを作成できます。

  • パイプラインの構築 - このドキュメントで前述したように、Maven や Gradle などのツールに基づいています。

  • デプロイ パイプライン - GitHub Actions、Azure Pipelines、Jenkins Pipelines、GitLab Pipelines、または Azure CLI を使用して、コード更新のデプロイ時に重要なシステムを運用環境に保持するブルー / グリーン デプロイを含めたコードデプロイを自動化できます。

既存の実践方法とシステムを引き続き使用する

Azure で Java アプリケーションを移行またはビルドしてからスケーリングする際に、ネットワーク、監視、自動化、ID プロバイダー、オンプレミス システム、開発およびビルド ツール、アプリ ライブラリにおける既存の機能を使用できます。 次の表ではいくつかの例を示しています。

カテゴリ Java エコシステムの製品とサービス
ネットワーク F5、Palo Alto、Cloudflare、Checkpoint、Infoblox
監視 New Relic、Dynatrace、AppDynamics、Elastic、Splunk
Automation GitHub Actions、Azure Pipelines、Jenkins、GitLab
ID プロバイダー Microsoft Entra ID、ForgeRock、Auth0、Ping、Okta
オンプレミス システム データベース (Oracle DB や IBM DB2 など)、メッセージング (IBM MQ や TIBCO EMS など)、イベント処理 (Kafka など)、ディレクトリ (Microsoft Entra ID、OpenLDAP、IBM ID など)
開発ツール IntelliJ、Visual Studio Code、Eclipse、Spring Tool Suite、Maven、Gradle

参照アーキテクチャ

Azureアーキテクチャ センターは、確立されたパターンとプラクティスを使用してAzureでソリューションを構築するための機能の使用方法などについてのガイダンスを提供します。 これらの参照アーキテクチャは、コストの最適化、オペレーショナル エクセレンス、パフォーマンス効率、信頼性、スケーラビリティ、セキュリティ、監視、スモーク テストなどを考慮して、お客様のエンゲージメントから学習した内容に基づいています。 また、Azure ランディング ゾーンなどのソリューション設計コンポーネント (必要に応じて、コードとしてのインフラストラクチャで事前にプロビジョニングされたワークロードをホストするための環境) に対処し、エンタープライズ規模での Java アプリケーションの移行とグリーンフィールド開発を可能にします。

たとえば、Azure Spring Apps のランディング ゾーン アクセラレータを次のようになります。ハブとスポークの設計を実装する方法を示します。この設計では、ハブでホストされている共有サービスに依存する単一のスポークに Azure Spring Apps がデプロイされます。 このプロジェクトは、Microsoft Azure Well-Architected Framework のテネットを達成するためのコンポーネントで構築されています。 このアーキテクチャの実装を調べるには、GitHub の Azure Spring Apps ランディング ゾーン アクセラレータ リポジトリを参照してください。 Azure アプリ Service、Azure Container Apps、Azure Kubernetes Service など、任意の Azure「コンピューティング」先にデプロイされた Java アプリケーションにも同じアプローチを起用できます。 さらに、既存の Java アプリケーションを Azure に移行する場合は、移行ガイドと推奨されるストラテジーによる包括的なセットが用意されています。

「エンドツーエンドのセキュリティ、監視、自動化によるスケーリング」という見出しとこの記事で説明するツールのロゴを含む図。

次のステップ

Java アプリケーションをデプロイするために適切な Azure サービスを選択する