ストーリー
田
田中VPoE
マルチクラウド環境では「抽象化レイヤー」の設計が重要だ。アプリケーションがクラウド固有のAPIに直接依存していると、移行のたびにコードを書き直すことになる
あなた
ポートアンドアダプターパターンのクラウド版ですね
あ
田
田中VPoE
まさにそうだ。ただし注意点がある。抽象化しすぎると各クラウドの強みを殺してしまう。最小共通分母に制限されて、結局どのクラウドも中途半端に使うことになりかねない
あなた
抽象化すべき箇所とクラウド固有の機能を活かすべき箇所を見極める必要があるんですね
あ
田
田中VPoE
その通り。「ポータビリティが必要な箇所だけ抽象化する」のが原則だ
抽象化レイヤーの設計原則
3つの原則
| 原則 | 説明 | 例 |
|---|
| 選択的抽象化 | すべてを抽象化するのではなく、ポータビリティが必要な箇所だけ | ストレージ操作は抽象化、DynamoDB固有クエリは直接利用 |
| 漏れのある抽象化の許容 | 完璧な抽象化を追求しない。クラウド固有の最適化は許容 | 共通インターフェース + クラウド固有の拡張ポイント |
| 段階的導入 | 最初から全面的に導入せず、必要に応じて拡張 | まずIaCの抽象化から、次にアプリケーション層 |
抽象化の4つのレベル
レベル別の対象
| レベル | 対象 | ツール・アプローチ | 抽象化の度合い |
|---|
| L1: IaC | インフラ定義 | Terraform, Pulumi | 高(推奨) |
| L2: コンテナ/K8s | ランタイム環境 | Kubernetes, Helm | 高(推奨) |
| L3: アプリケーション | ビジネスロジック | ポートアンドアダプター | 選択的 |
| L4: データ | データアクセス | Repository パターン | 選択的 |
L1: IaCレイヤーの抽象化
| ツール | 特徴 | マルチクラウド対応 |
|---|
| Terraform | HCLベース、最大のプロバイダーエコシステム | AWS/GCP/Azure全対応 |
| Pulumi | 汎用言語(TypeScript, Python等)でIaC | AWS/GCP/Azure全対応 |
| Crossplane | Kubernetes上でクラウドリソースを管理 | CRDベースでプロバイダー抽象化 |
Terraformによるマルチクラウドの構成例:
terraform/
├── modules/
│ ├── compute/ # クラウド非依存のコンピュート定義
│ │ ├── aws/ # AWS固有の実装
│ │ ├── gcp/ # GCP固有の実装
│ │ └── azure/ # Azure固有の実装
│ ├── database/ # データベース定義
│ │ ├── aws/
│ │ ├── gcp/
│ │ └── azure/
│ └── network/ # ネットワーク定義
│ ├── aws/
│ ├── gcp/
│ └── azure/
├── environments/
│ ├── production/
│ │ ├── aws.tf # AWS本番環境
│ │ └── gcp.tf # GCP本番環境(データ分析)
│ └── staging/
└── variables.tf # 共通変数
L2: コンテナ/Kubernetesレイヤーの抽象化
Kubernetesはマルチクラウドにおける最も強力な抽象化レイヤーです。
| コンポーネント | 抽象化対象 | 具体的な手法 |
|---|
| コンテナイメージ | ランタイム | マルチアーキテクチャイメージ |
| K8s マニフェスト | デプロイ定義 | Helm Chart、Kustomize |
| Ingress | L7ロードバランサー | Ingress Controller(NGINX等) |
| CSI Driver | ストレージ | クラウド別CSIドライバー |
| Service Mesh | サービス間通信 | Istio、Linkerd |
マルチクラウドKubernetesの構成:
GitOps (ArgoCD / Flux)
│
┌───────────────┼───────────────┐
│ │ │
EKS (AWS) GKE (GCP) AKS (Azure)
├── App A ├── Analytics ├── Auth
├── App B └── ML Pipeline └── EU Apps
└── App C
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ Aurora │ │ BigQuery│ │Entra ID │
│ S3 │ │ GCS │ │Blob │
└─────────┘ └─────────┘ └─────────┘
L3: アプリケーションレイヤーの抽象化
アプリケーション層の抽象化パターン:
// ストレージの抽象化例
interface CloudStorage {
upload(key: string, data: Buffer): Promise<string>;
download(key: string): Promise<Buffer>;
delete(key: string): Promise<void>;
getSignedUrl(key: string, expiry: number): Promise<string>;
}
class S3Storage implements CloudStorage { ... }
class GCSStorage implements CloudStorage { ... }
class AzureBlobStorage implements CloudStorage { ... }
// ファクトリーパターンで切替
class StorageFactory {
static create(provider: 'aws' | 'gcp' | 'azure'): CloudStorage {
switch (provider) {
case 'aws': return new S3Storage();
case 'gcp': return new GCSStorage();
case 'azure': return new AzureBlobStorage();
}
}
}
抽象化すべきもの vs すべきでないもの
| 抽象化すべき | 抽象化すべきでない |
|---|
| オブジェクトストレージ操作 | DynamoDBのConditional Write |
| 基本的なキュー操作(送受信) | BigQueryの高度な分析機能 |
| シークレット管理 | Aurora Serverlessの自動スケーリング |
| 基本的な監視メトリクス送信 | CloudFrontのEdge Functions |
| ログ出力 | Cognitoの認証フロー |
L4: データレイヤーの抽象化
| パターン | 用途 | 実装 |
|---|
| Repository | CRUD操作の抽象化 | クラウド別Repository実装を差し替え |
| CQRS | 読み書きの分離 | 書き込みはAWS、読み取り分析はGCP |
| Event Sourcing | イベントベースのデータ管理 | イベントストアの実装をクラウド別に |
| Data Mesh | ドメイン単位のデータ管理 | 各ドメインが自律的にクラウドを選択 |
まとめ
| ポイント | 内容 |
|---|
| 設計原則 | 選択的抽象化、漏れのある抽象化の許容、段階的導入 |
| 4つのレベル | IaC、コンテナ/K8s、アプリケーション、データ |
| Kubernetes | マルチクラウドの最も強力な抽象化レイヤー |
| 抽象化の判断 | ポータビリティが必要な箇所だけ抽象化する |
チェックリスト
次のステップへ
次は「演習:ワークロード配置マップを作成しよう」で、学んだフレームワークを使って実際のワークロード配置を設計します。
推定読了時間: 30分