はじめに:この記事を書くに至った背景
この記事は、デプロイモデルやコンテナ運用に精通したイネイブラーとの、批判的かつ双方向の対話から生まれました。
当初、オンプレ環境でのアーキテクト経験ばかりだった私は、アーキテクチャ設計における「仮説メカニズム」として、以下のような王道のアプローチをメンタルモデルとして持っていました。
フェーズの分離
まず論理ビューで「サービス境界とコンポーネント同士の連携」のみを定義し、システム境界などの物理的な制約は意図的に考えない。
トレーサビリティの確保
その後、配置モデル(物理ビュー)上で初めて物理配置を考慮し、非機能要件(レイテンシなど)を満たせるかをチェックするために論理ビューへ戻る。
目的
ビジネスプロセス上の境界マップと物理配置が図形的に矛盾(乖離)していないかを確認することで、エンタープライズアーキテクチャ内の歪みによる負債を最小限にする。
問題点
しかし、私の思考には、モダンなクラウドネイティブ環境では足かせとなりかねない
「論理から物理への一方向なフェーズ分離」
「同型性(論理と物理は図形的に綺麗に包含されるべき)の信仰」
という2つの暗黙の前提が潜んでいることをAIとの壁打ちの中で発見しました。
この度重なるAIとの厳しいメタ分析によって、私のオンプレミス的な前提が見事に破壊されたこと。
そして、「論理と物理の非対称性」をクラウドの強力な武器として受け入れるパラダイムシフトが起きたこと。これが、本記事をまとめるに至った出発点であり、前日譚です。
1. 論理と物理のテンション(張力)の活用
論理ビュー(サービス境界の定義)と物理ビュー(システム・ネットワーク境界の定義)を明確にフェーズ分けし、「論理ビューの段階では意図的に物理配置を考えない」という縛りは、わたしのいたプロジェクトでは、うまく機能していました。
しかし、モダンなシステム設計においては手戻りコストを爆発させる罠となります。
インフラがソフトウェア定義(IaC)された現代において、論理と物理は完全に不可分です。
事例
例えば、
・AWS Lambda(サーバーレス)を採用するのか
・Kubernetes(常駐コンテナ)を採用するのか
という「物理的・インフラ的な制約」は、イベント駆動の粒度やステートの持ち方といった「論理ビューの設計」そのものを根底から変えてしまいます。
したがって、論理と物理の整合性(図形的な綺麗さ)を保つことを目的とするのではなく、
ビジネス要件(論理)とクラウド・コンテナの物理特性(物理)のテンション(張力)を活かして、最適なトレードオフを設計すること
へとアプローチを変更する必要があります。
物理制約は、論理設計を邪魔するものではなく、アーキテクチャを駆動させる強力なドライバーとして初期段階から組み込むべきです。
2. 同型性の信仰からの脱却
「論理的にまとまった業務データやアプリケーションロジックが、物理配置モデル上でバラバラのネットワークセグメントに展開されるのはおかしい(負債の兆候である)」という前提は疑う必要がありました。
ビジネス上の境界とインフラ上の境界は、必ずしも1対1である必要はありません。
代表例 -CQRS-
その代表例がCQRS(コマンドクエリ責務分離)パターンです。
論理的には「1つのユーザー管理サービス」であっても、書き込み処理は強力なRDBMSのマスターノード(特定VPC内)に配置し、読み込み処理はグローバルに分散されたインメモリキャッシュ(エッジロケーション)に配置するといった設計が求められます。
このように、図形的な整合性を求めるあまりスケーラビリティや可用性を犠牲にするのではなく、非機能要件(可用性、パフォーマンス、セキュリティ)を獲得するために、あえて物理配置を「意図的かつ劇的にバラバラにする」ことが求められます。
3. 物理分割(非対称化)の代表的ドライバー
論理的には1つのコンテキストでありながら、非機能要件を満たすために物理レベルで意図的に破壊(非対称化)し、複数(論理1対物理N)に分割配置すべき具体的なケースには、以下の5つの代表的なパターンが存在します。
①. データ・レジデンシー(法規制・ガバナンス)による分割
論理
1つの「ユーザープロフィール管理サービス」
物理
GDPR等の法規制に対応するため、EU圏のユーザーデータは欧州リージョンのDBに、それ以外のユーザーデータは東京リージョンのDBへ物理的に分割(シャーディング)して配置します。
②. 非同期ワーカー・アウトボックス(パフォーマンス・可用性)による分割
論理
1つの「注文処理サービス」。
物理
ユーザーからのリクエストを即座に受け付ける「APIコンテナ(同期)」と、キューからメッセージを取り出して重いバックグラウンド処理を行う「ワーカーコンテナ(非同期)」に分割します。
これらはスケーリング特性が全く異なるため、別のノードプールやスケーリンググループに配置するのが最適です。
③. エッジコンピューティング(レイテンシ・セキュリティ・コスト)による分割
論理
1つの「コンテンツ配信・最適化サービス」。
物理
動的なビジネスロジックはクラウド内の「オリジンサーバー(VPC内)」に配置し、静的アセットや軽量な認可処理(Lambda@Edgeなど)はユーザーに最も近い「エッジロケーション」に配置します。
アーキテクチャ上の真の目的
エッジへの配置は、単なるレスポンス速度の向上(UXの加速装置)だけが目的ではない。
悪意のある攻撃や未認可の不正リクエストを、わざわざ太平洋を横断させてオリジンサーバーまで到達させてしまうと、オリジンのCPU・メモリが無駄に消費され、ネットワーク帯域の多額の課金が発生し、最悪の場合はDDoS攻撃でシステムがダウンします。
そのため、不正なトラフィックを手前で早期に叩き落とす「最前線の防波堤(シールド)」としてエッジを機能させることが、モダンなデプロイモデルの鉄則です。
④. Strangler Fig(マイグレーション)による分割
個人的には、ストラングラーもバブルパターンも、どちらも
論理的には1つ。物理的には2つ用意してアーキ移行させるパターン
だと思っている。
論理
移行過渡期における1つの「決済サービス」。
物理
新しい機能はクラウドリソース(K8s上のPod)に配置しつつ、レガシーなコア決済処理はオンプレミスのメインフレームに配置したままにする。
その上でAPI Gatewayが両者を動的にルーティングすることで、論理的には1つのサービスとして振る舞わせます。
⑤. 特権分離・セキュリティセグメント(セキュリティ)による分割
論理
1つの「クレジットカード管理コンポーネント」。
この論理コンポーネントに対して、脅威モデリングのLINDDUN(プライバシー脅威モデリング)やSTRIDE(セキュリティ脅威モデリング)を適用することで、コンポーネント内部に「強烈な信頼境界(Trust Boundary)の断層」が発見されます。
その断層に従って、物理配置を別々の場所に引き裂くことになります。
物理
生のカード番号をトークン化する極めてセキュアな処理だけをPCI-DSSに準拠した「隔離された厳格なサブネット」に配置し、そのトークンを利用して処理を行う通常の業務ロジックは「一般的なプライベートサブネット」に分割して配置します。
脅威モデリングが物理分割を強制するメカニズム
さて、今一度、論理コンポーネントに対して、脅威モデリングを行った結果、物理分割が強制されるまでの一連のメカニズムを追ってみましょう。
論理コンポーネントに対して脅威モデリングを行うと、なぜ物理的な分割が必要になるのか。
それは主に
「コンプライアンス・スコープの極小化」と
「ブラスト・ラジアス(爆発影響半径)の最小化」
という2つの泥臭い運用上の重力が働くからです。
それぞれ見ていきましょう。
①. コンプライアンス・スコープの極小化(PCI-DSSの呪縛)
論理的な「クレジットカード管理コンポーネント」の中には、大きく分けて2つの処理が混在しています。
処理A
生のクレジットカード番号(PAN)を受け取り、自社用の無害な文字列(トークン)に変換する処理。
処理B
その「トークン」を使って、ユーザーの決済履歴を表示したり、外部の決済代行会社に非同期で通信を依頼したりする業務処理。
なぜ一緒にしたらだめなのか
もしこれらを物理的に同じ場所(同一のコンテナや同一のサブネット)に配置した場合どうなるでしょうか?
生のカード番号が1ミリ秒でもメモリ上に乗る空間は、すべてPCI-DSS(クレジットカード業界のセキュリティ基準)の極めて厳格な監査スコープに巻き込まれます。
つまり、処理Bの「単なる履歴表示機能」を少し修正してデプロイするだけでも、PCI-DSSのコンプライアンス要件を満たしているかどうかの膨大な監査・承認プロセスが必要になり、開発の俊敏性がめちゃ損なわれる。
②. ブラスト・ラジアス(影響半径)の最小化
LINDDUNの「D(Disclosure of information:情報の漏洩)」の脅威を評価した場合、Bの処理(履歴表示など)に万が一SQLインジェクションやSSRFなどの脆弱性があったら、Aの処理(生のカード番号)と同じメモリ空間やネットワークにいると、攻撃者に生のカード番号を抜き取られるリスクが一気に跳ね上がります。
③. 結論:物理的な切断(特権分離)
したがって、アーキテクトは以下のような物理配置の決断を下します。
生のカード番号を触る「Aの処理」だけを、インターネットから直接アクセスできず、インバウンド・アウトバウンド通信が極限まで制限された専用の厳格なサブネット(PCI-DSSスコープ内)に隔離する。
残りの「Bの処理」は、トークンしか扱わないためPCI-DSSのスコープ外とし、通常のプライベートサブネットに配置して開発スピードを維持する。
論理ビューでは「1つのビジネスコンポーネント」として描きつつ、脅威モデリングを経て物理ビュー(Resourceビュー)にマッピングする際、このように明確なネットワーク境界(VPCサブネット、セキュリティグループ)の線を引いて別々に配置するわけです。
だから、アーキテクトにとって、脅威モデリングって必須のスキルなんですよ。
是非とも習得していってくださいね。