LESSON 30分

ストーリー

田中VPoE
マルチクラウド環境では「抽象化レイヤー」の設計が重要だ。アプリケーションがクラウド固有のAPIに直接依存していると、移行のたびにコードを書き直すことになる
あなた
ポートアンドアダプターパターンのクラウド版ですね
田中VPoE
まさにそうだ。ただし注意点がある。抽象化しすぎると各クラウドの強みを殺してしまう。最小共通分母に制限されて、結局どのクラウドも中途半端に使うことになりかねない
あなた
抽象化すべき箇所とクラウド固有の機能を活かすべき箇所を見極める必要があるんですね
田中VPoE
その通り。「ポータビリティが必要な箇所だけ抽象化する」のが原則だ

抽象化レイヤーの設計原則

3つの原則

原則説明
選択的抽象化すべてを抽象化するのではなく、ポータビリティが必要な箇所だけストレージ操作は抽象化、DynamoDB固有クエリは直接利用
漏れのある抽象化の許容完璧な抽象化を追求しない。クラウド固有の最適化は許容共通インターフェース + クラウド固有の拡張ポイント
段階的導入最初から全面的に導入せず、必要に応じて拡張まずIaCの抽象化から、次にアプリケーション層

抽象化の4つのレベル

レベル別の対象

レベル対象ツール・アプローチ抽象化の度合い
L1: IaCインフラ定義Terraform, Pulumi高(推奨)
L2: コンテナ/K8sランタイム環境Kubernetes, Helm高(推奨)
L3: アプリケーションビジネスロジックポートアンドアダプター選択的
L4: データデータアクセスRepository パターン選択的

L1: IaCレイヤーの抽象化

ツール特徴マルチクラウド対応
TerraformHCLベース、最大のプロバイダーエコシステムAWS/GCP/Azure全対応
Pulumi汎用言語(TypeScript, Python等)でIaCAWS/GCP/Azure全対応
CrossplaneKubernetes上でクラウドリソースを管理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
IngressL7ロードバランサー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: データレイヤーの抽象化

パターン用途実装
RepositoryCRUD操作の抽象化クラウド別Repository実装を差し替え
CQRS読み書きの分離書き込みはAWS、読み取り分析はGCP
Event Sourcingイベントベースのデータ管理イベントストアの実装をクラウド別に
Data Meshドメイン単位のデータ管理各ドメインが自律的にクラウドを選択

まとめ

ポイント内容
設計原則選択的抽象化、漏れのある抽象化の許容、段階的導入
4つのレベルIaC、コンテナ/K8s、アプリケーション、データ
Kubernetesマルチクラウドの最も強力な抽象化レイヤー
抽象化の判断ポータビリティが必要な箇所だけ抽象化する

チェックリスト

  • 抽象化レイヤーの3つの設計原則を理解した
  • 4つのレベルの抽象化対象を理解した
  • 抽象化すべきもの・すべきでないものの判断基準を理解した
  • Kubernetesを中心としたマルチクラウド構成を理解した

次のステップへ

次は「演習:ワークロード配置マップを作成しよう」で、学んだフレームワークを使って実際のワークロード配置を設計します。


推定読了時間: 30分