オンプレ時代のシステムはたいてい「1つの大きなアプリケーション」として作られてきました。それがクラウド移行を機に「マイクロサービス化すべきでは?」という話が浮上し、どう判断すればいいか迷っているエンジニアは少なくないはずです。
実際、何でもかんでもマイクロサービスに切り替えれば良いわけではありません。反対にモノリシックなままクラウドに持ち込んでも、「ただのリフト&シフト」で終わってクラウドの恩恵をほとんど受けられないケースも多いです。
この記事では、モノリシックアーキテクチャとマイクロサービスアーキテクチャの違いを、オンプレ経験者にもわかりやすく整理します。設計上の特性の違いから、クラウド移行時の判断基準、AWS・Azureの具体的なサービスとの組み合わせまでカバーします。
アーキテクチャ選択がクラウド移行で問われる理由
オンプレ時代は、「どのサーバーに何を乗せるか」という物理的な構成が中心でした。アーキテクチャの設計は開発部門の話で、インフラ担当は「そのアプリが要求するリソースを用意する」役割が多かったかもしれません。
しかしクラウドでは、インフラそのものがコードで定義・自動化される時代になりました。スケーリング、デプロイ、サービス間の通信まで、設計次第で柔軟性が大きく変わります。そのため、インフラエンジニアもアーキテクチャの概念を理解しておくことが現場では求められます。
特にクラウド移行時は、「そのシステムをそのままクラウドに移すか」「この機会に分割・再設計するか」という判断が必要になります。その判断軸を持つために、まずは2つのアーキテクチャの違いを正確に把握しましょう。
モノリシックアーキテクチャとは(オンプレ時代の標準構成)
モノリシック(Monolithic)とは「一枚岩」という意味です。認証、注文管理、在庫管理、通知処理といったすべての機能が1つのアプリケーションとして実装・デプロイされる構成です。
オンプレ時代には標準的な構成でした。Javaで書かれたWebアプリケーションをWebLogicやJBossに乗せて運用するスタイルが典型例です。EJB(Enterprise JavaBeans)やSpring Frameworkで大規模なモノリスを構築していた現場も多かったはずです。
モノリシックの主な特徴
・開発の単純さ: 1つのプロジェクトとして開発できる。IDEでの統合開発がしやすく、小規模チームに向いている。
・デプロイの一体性: 変更時はアプリ全体をまとめてビルド・デプロイする。手順がシンプルでJenkinsなどのCIツールでも扱いやすい。
・テストのしやすさ: 依存関係が1つのコードベース内で完結するため、E2Eテストが比較的簡単に書ける。
・障害の連鎖リスク: 一部の機能に不具合があるとアプリ全体が影響を受ける。メモリリークが全機能を道連れにするケースもある。
・スケールの粗さ: 負荷の高い機能だけをスケールさせることができず、アプリ全体を複製するしかない。
・デプロイ頻度の制約: コードベースが大きくなるほどビルド・デプロイ時間が延び、変更のリリースサイクルが遅くなりがち。
マイクロサービスアーキテクチャとは(クラウドネイティブの設計思想)
マイクロサービス(Microservices)は、システムを「機能単位の小さなサービス群」に分割し、それぞれが独立してデプロイ・スケール可能な構成です。各サービスはAPI(主にREST)またはメッセージキュー経由で連携します。
Netflixが大規模なモノリスをマイクロサービスに移行した事例が有名で、2010年代以降にクラウドネイティブの主流設計として広まりました。AWSやAzureといったクラウドプロバイダーが提供するコンテナオーケストレーション(ECS/EKS、AKS)やサーバーレス(Lambda、Azure Functions)は、このマイクロサービス設計を強力に後押しするサービスです。
マイクロサービスの主な特徴
・独立デプロイ: 認証サービスだけ更新する、といった個別リリースが可能。デプロイ頻度を大幅に上げられる。
・細粒度スケーリング: 負荷の高いサービスのみスケールアウトできる。コスト効率が向上する。
・障害の局所化: 1つのサービスが落ちてもサーキットブレーカーを使えば他のサービスへの影響を抑えられる。
・技術の多様性: サービスごとに異なる言語・フレームワークを選べる(Python、Go、Node.jsなど混在可能)。
・運用の複雑さ: サービスが増えると、ネットワーク障害・バージョン管理・分散トレーシングの仕組みが必要になる。
・開発チームの分散: チームがサービスを独立して担当する体制が必要。少人数では管理しきれないことも多い。
モノリシック vs マイクロサービス 比較表
| 比較項目 | モノリシック | マイクロサービス |
|---|---|---|
| デプロイ単位 | アプリ全体 | サービス単位(個別) |
| スケーリング | アプリ全体を複製 | サービス単位で細粒度 |
| 障害の影響範囲 | 全機能に波及しやすい | 局所化できる(設計次第) |
| 開発初期の複雑さ | 低い | 高い |
| デプロイ頻度 | 遅くなりがち | 高頻度リリースが可能 |
| 技術スタック統一 | 容易 | 多様性あり(管理コスト増) |
| 運用の難易度 | 比較的シンプル | 分散システムの知識が必要 |
| 適したチーム規模 | 小規模~中規模 | 中規模~大規模 |
| クラウド移行コスト | 低い(リフト&シフト可) | 高い(再設計が必要) |
どちらを選ぶべきか?現場での判断基準
「マイクロサービスの方がモダンで良い」と思われがちですが、それは半分しか正しくありません。アーキテクチャは目的に合わせて選ぶものです。以下の観点で判断するのが現実的です。
1. チーム規模と組織構造
マイクロサービスを正しく運用するには、サービスごとに担当チームが必要です。Amazonが提唱する「2枚のピザで食べられるチーム(Two-Pizza Team)」の原則はよく知られていますが、これは各サービスを担当するチームが必要という意味でもあります。
10名以下の少人数チームでマイクロサービスに移行すると、各サービスのCI/CD、監視、バージョン管理、障害対応を全員が見なければならず、逆に運用負荷が跳ね上がります。人数が少ない段階ではモノリシックの方が生産性が高いことが多いです。
2. スケーリング要件
特定の機能だけに負荷が集中するシステムでは、マイクロサービスのスケーリング柔軟性が活きます。たとえば「注文処理だけが繁忙期に100倍のアクセスを受ける」ような場合、注文処理サービスだけをAmazon ECSやAWS Lambdaで独立スケールさせる設計が効果的です。
一方、全機能が均等に負荷を受けるシステム(社内管理ツールなど)では、モノリシックをスケールアウトするだけで十分なケースも多いです。
3. デプロイ頻度とリリースサイクル
週1回のリリースで足りるシステムならモノリシックで問題ありません。一方、1日数十回のデプロイが求められるSaaS型プロダクトでは、マイクロサービスの独立デプロイが強みを発揮します。オンプレのシステムをクラウドに移行する初期フェーズであれば、まずリフト&シフトで動かし、デプロイ頻度の要件が上がってきた段階で段階的に分割するアプローチが現実的です。
4. ドメインの成熟度(境界の明確さ)
マイクロサービスで最も難しいのは「どこで境界を引くか」です。ビジネスドメインが固まっていない段階で分割すると、後から「この機能はあのサービスにあるべきだった」という設計ミスが頻発します。スタートアップや新規プロダクトは、まずモノリスで立ち上げてドメインを固め、その後に分割するのが現実的な戦略です。この段階的な分割手法を「ストラングラーフィグパターン」と呼びます。
AWSとAzureの対応サービスとの組み合わせ
実際のクラウド構成でアーキテクチャを選ぶとき、使えるマネージドサービスも判断材料になります。
モノリシックアーキテクチャとの相性が良いサービス
・Amazon EC2: 既存のアプリをそのままリフト&シフトする場合の基本。AMIで環境を固めてAuto Scaling Groupでスケールアウトする構成が定番。
・AWS Elastic Beanstalk: モノリシックなWebアプリを最小限の手順でデプロイ・管理できるPaaS。EC2やRDSのプロビジョニングも自動で行われる。
・Azure App Service: .NET/Java/Node.jsなどのWebアプリを手軽にホストできる。オンプレの既存モノリスをそのまま移行するのに向いている。
・Azure Virtual Machines: EC2相当。既存アプリのリフト&シフトの定番。OSレベルでのカスタマイズが必要な場合に選択する。
マイクロサービスアーキテクチャとの相性が良いサービス
・Amazon ECS / EKS: Dockerコンテナをマネージドで動かすサービス。各マイクロサービスをコンテナ化してデプロイする構成が一般的。ECSはシンプル、EKSはKubernetesの豊富なエコシステムが使える。
・AWS Lambda: 細かい機能をFaaSとして実装するサーバーレス型のマイクロサービス。コールドスタートには注意が必要だが、小規模・低頻度の処理にはコスト効率が高い。
・Amazon API Gateway: マイクロサービス群のAPIエンドポイントを一元管理するゲートウェイ。認証・スロットリング・ルーティングを集中管理できる。
・Amazon SQS / SNS: サービス間の非同期通信に使うメッセージキューとパブサブ。密結合を避けて障害影響を局所化するために重要。
・Azure Kubernetes Service(AKS): KubernetesベースでマイクロサービスをオーケストレーションするAzureのコンテナ管理サービス。
・Azure Service Bus: Amazon SQS相当のメッセージキューサービス。Azureでのサービス間非同期通信に使う。
よくある誤解とハマりポイント
誤解1: 「マイクロサービスにすれば全部解決する」
マイクロサービスは運用の複雑さを増します。分散トレーシング(AWS X-Ray、Azure Application Insights等)、サービスメッシュ(Istio、AWS App Mesh等)、ログ集中管理(Amazon CloudWatch Logs、Azure Monitor等)が必要になります。これらを整備せずにサービスを分割すると、障害時の原因特定が格段に難しくなります。
「マイクロサービスにしたら逆に運用が大変になった」という話は現場でよく聞きます。サービスを分割する前に、まず監視・デプロイパイプライン・ログ基盤を整えることが先決です。
誤解2: 「オンプレのモノリスはクラウドで動かせない」
クラウド上でも十分に動作します。EC2 + RDSの構成でオンプレのJavaアプリをそのまま移行しているケースは現場でよく見ます。まず動かして、その後に段階的にクラウドネイティブ化するストラングラーフィグパターンが実務では有効です。
誤解3: 「マイクロサービスは必ずコンテナが必要」
コンテナは便利ですが必須ではありません。AWS Lambdaで複数の小さな機能をサーバーレスとして実装するのもマイクロサービス的なアプローチです。大切なのは「デプロイ単位を独立させること」であり、実装技術は二の次です。
ハマりポイント: 分散トランザクション問題
モノリシックなら1つのDBトランザクションで整合性を保てた処理が、マイクロサービスに分割すると複数のDBにまたがります。「注文サービスが成功したが在庫サービスが失敗した場合の補償処理」のような分散トランザクション設計は、Sagaパターン等を使う必要があり、設計難易度が跳ね上がります。移行前にドメインごとのデータ境界を慎重に設計することが重要です。
本記事のまとめ
| こんな場合は | 推奨アーキテクチャ |
|---|---|
| チームが小規模・新規プロダクトでドメインが未確定 | モノリシックからスタート |
| オンプレアプリのクラウド移行(まずは動かす) | リフト&シフト(モノリシック維持) |
| 特定機能のみ高負荷・高頻度デプロイが必要 | ストラングラーフィグで段階的にマイクロサービス化 |
| チームが中規模以上・ドメインが明確・デプロイ頻度が高い | マイクロサービスアーキテクチャ |
モノリシックかマイクロサービスかという選択は、「新しい方が良い」という話ではなく、チームの規模・システムの成熟度・ビジネス要件に合わせた判断です。クラウド移行を機に無理にマイクロサービス化しようとせず、まず動かす・段階的に切り出すというアプローチが現場では有効です。
クラウド上でLinuxサーバーを動かす基礎については、姉妹サイトLinuxMaster.JPで詳しく解説しています。EC2やAzure VMの構築と合わせて活用してください。
クラウド移行の設計、どこから始めればいいか迷っていませんか?
アーキテクチャの選択だけでなく、実際のクラウド移行では「どのサービスを使うか」「コストをどう試算するか」「障害時にどう対応するか」など、現場特有の判断が次々と出てきます。
オンプレの経験を活かしながら、現場で使えるクラウドスキルを体系的に身につけたい方へ、メルマガで実践的なクラウド活用ノウハウをお届けしています。
