前置き
サービスメッシュの適用範囲を決める際に、各サービスコンポーネントのアプリ上の関係と
インフラ上の通信の関係性を一貫性を保ちながら物理層まで落とし込む際のモデル図を
描くことは、共通認識取る意味でも重要ではないでしょうか?
影響を受けている思想
まず、上記で書いた
各サービスコンポーネントのアプリ上の関係と
インフラ上の通信の関係性を一貫性を保ちながら物理層まで落とし込む
というのは、以下のEAモデルに強く影響を受けています。
(図はネットから引用)
TAの所を表すモデルで、初めてサイドカーやサービスメッシュといった技術的要素
をモデル上に出しましょう。
サービスメッシュのためのモデリング
では、実際にどうトレーサビリティ取りながら、TA層まで落とし込んでサービスメッシュの適用範囲やポリシーを設計すべきかを順に追っていきます。
1. アプリケーション同士の関係構造
まずは、アプリケーションのみでの関係性を可視化しましょう。
わかりよく実線部分は、同期的な連携を、点線は非同期だとしましょう。
この段階でのモデリングでは、メッセージブローカーなどの枝葉要素は、
そこまで重要ではないものなので、以下の図では敢えて端折ってます。
この図に、インフラ面の要素は出してはいけません。
それだと、関心が分離されておらず、図が複雑化します。
また、通信の頻度などが明示的にわかるように、線の太さを変えて表現すると、
より共通認識が持たせやすいでしょう。
・線が太い ⇒ 頻度が多い
・線が細い ⇒ 頻度は低い
2. インフラ部分の関係構造
さて、上図をもとに、今度はインフラ部分の構造を可視化しましょう。
先程の上図と一貫した関係になっていないといけません。
よくあるのが、アプリケーションアーキテクトとインフラアーキテクトが
コミュニケーションパスが分断されており、
アプリ構造での図と、ここのインフラ構造の関連線が一貫していないケース。
こういうアーキテクチャは絶対にダメです!!
この図だけではわかりにくいと思いますので、これを真上から捉えた別角度からの図として表現しなおします。
サービスインタラクションマップ
このようなモデル図を描くことは、サービスメッシュの導入と運用を成功させる上で、極めて重要です。
このような図は、
「サービスメッシュ通信モデル図」
あるいは
「サービスインタラクションマップ」
と呼べるもので、複雑なマイクロサービス間の通信を、関係者全員が直感的に理解するための共通言語となります。
いうならば、コンテキストマップってやつですね!!
なぜそのサービスインタラクションマップが重要なのか
では、ちょっとそもそもの前提に立ち返り、なぜ上記のような図が重要なのか考えてみましょう。具体的には以下の3つが理由にあります。
1. 意図の明確化と共通認識の醸成
これが最大のメリットです。
「どのサービスが、どのサービスと通信すべきか?」
「その通信は、同期的か、非同期的か?」
「どのサービス間の通信は、絶対に許可してはならないか?」
といったアーキテクチャ上の意図を、一枚の地図で明確に表現できます。
これにより、開発者、インフラ担当者、セキュリティ担当者の間の認識のズレを防ぎます。
開発者、インフラ担当者、セキュリティ担当者の間の認識のズレは
予期せぬアーキテクチャトラブルを招くので、絶対にあってはなりません!!
2. コントロールプレーンの設定のインプットになる
この図は、単なる絵ではありません。
サービスメッシュのコントロールプレーン(司令塔)に設定すべき、具体的なポリシーの設計図そのものになります。
実線(同期通信)
サービスAとBの間に実線があれば、コントロールプレーンに
「AからBへの直接通信(mTLS暗号化含む)を許可する」
というルーティングルールを設定します。
点線(非同期通信)
AとBの間に点線があれば、それはメッセージブローカーを介していることを意味し、
「AとBの間に直接的な通信経路は不要」
という判断になります。
線なし(アクセス不可)
AとBの間に線がなければ、
「AからBへの通信は全て拒否する」
というデフォルトDenyのセキュリティポリシーを設定します。
3. セキュリティとパフォーマンスのボトルネックを可視化
セキュリティ
「線なし」の部分を明確にすることで、最小権限の原則がネットワークレベルでどう適用されるべきかを可視化できます。
これにより、意図しない通信経路が生まれるのを防ぎ、システムの攻撃対象領域を最小化します。
ちゃっかり最小権限の原則を満たすべき場所が明確になります。
パフォーマンス
もし、あるビジネスプロセスを実行するために、複数のサービス間をまたぐ長い実線の連鎖(A→B→C→D…)が図上で見えた場合、それは
同期呼び出しによる遅延や、連鎖的な障害(カスケード障害)を引き起こす潜在的なボトルネック
であることを、設計モデル図の段階で特定できます。
より具体的なHow
「サービスメッシュ通信モデル図」を、どのようなプロセスで作成し、どのように活用するのか、より詳細に解説します。
フェーズ1:準備フェーズ:関係者の招集と情報収集
このモデル図は、一人のアーキテクトが描くものではなく、チームの共通認識を形成するための共同作業です。
目的
議論の土台となる情報を集め、関係者間で目的を共有する。
主な活動
①. 関係者の招集
・各マイクロサービスの開発者代表
・サービスメッシュを管理するプラットフォーム/SREチーム
・セキュリティアーキテクト
・ビジネスの流れを説明できるプロダクトマネージャー
②. 上記関係者からの情報収集
対象となる主要なビジネスプロセス(例:「ユーザーの新規登録」「商品の注文処理」)をリストアップする。
既存のアーキテクチャ図(C4モデルなど)や、各サービスのAPI仕様書(OpenAPIなど)を用意する。
フェーズ2:モデル図の描画プロセス
ホワイトボードやmiroのようなオンラインの作図ツールを使い、関係者全員で対話しながら描画を進めます。
目的:
暗黙知となっているサービス間の通信を、明確な図として可視化する。
主な活動
①. サービスの棚卸し
まず、図の上に全てのマイクロサービスを円や四角として配置します。
クラス図の各エンティティを出すのと同じ感じです。
②. ビジネスフローに沿った追跡
準備フェーズで選んだビジネスプロセスを一つ選び、その流れを追跡します。
(例:「商品の注文処理」)
③. 通信の可視化(線の描画)
-
ユーザーからのリクエストが最初に届く「注文受付サービス」から始めます。
-
「注文受付サービス」が、次に「決済サービス」を同期的に呼び出す場合、両者の間に実線を引きます。
そして、線の横にHTTP POSTやgRPCといったプロトコルや、簡単な処理内容(決済実行)を書き加えます。
3 「注文受付サービス」が、「注文完了イベント」をメッセージブローカーに発行し、それを「通知サービス」が非同期で受け取る場合、「注文受付サービス」からメッセージブローカーへ点線を引き、ブローカーから「通知サービス」へも点線を引きます。
サービス間を直接点線で結ばないことがポイントです。
④. 全フローの網羅
全ての主要なビジネスプロセスについて、ステップ②〜③を繰り返し、図に線の情報を追加していきます。
フェーズ3:分析と具体的なアクション
完成した図は、具体的な設定や改善アクションに繋げるための強力なインプットとなります。
目的
可視化されたモデルを基に、セキュリティ、パフォーマンス、信頼性に関する具体的な改善策を導き出す。
主な活動
セキュリティ担当者の視点
「線が引かれていないサービス間」の通信は、原則として全て禁止すべきです。
この図を基に、サービスメッシュのコントロールプレーンで「デフォルトDeny」のネットワークポリシーを定義します。
「実線」 で結ばれている箇所は、mTLSによる通信の暗号化が必須であると判断します。
SRE/パフォーマンス担当者の視点
図上で 「実線が長く連鎖している」箇所(A→B→C→D)を探します。
これは、上記でも触れたように、
同期呼び出しによる遅延の増幅や
連鎖的障害(カスケード障害)のリスクが高い
ことを示唆しています。
そこからこの時点で即座に
「BからCへの呼び出しは、本当に同期的である必要があるか? 点線(非同期)にできないか?」
といった、アーキテクチャ改善の議論を開始します。
仮にこれをだいぶ実装が進んだ段階で、気づいたんじゃ手戻りや再設計コスト
が計り知れません。
開発者の視点
自身のサービスが、どのサービスに依存し、どのサービスから依存されているかが一目瞭然になります。
これにより、APIの契約(コントラクト)の重要性や、自身のサービスのSLAが他サービスに与える影響を具体的に理解できます。
まとめ
このプロセスを通じて、モデル図は単なる絵から、アプリとインフラの垣根を超えた、チーム全員が合意した、実行可能なアーキテクチャの青写真へと変わるのです。





