ACE Domain 2 · ~21%

Planning and Implementing a Cloud Solution

クラウドソリューションの計画と実装 — 初学者でもわかる詳細解説とベストプラクティス

試験配点 ~21%17コードブロック 234個
00

Domain 2 全体マップ

クラウドソリューションの計画と実装 — 4つのサブドメインと17章の体系的学習ガイド

2.0Domain 2 の構造
Domain 2 の全体マップDomain 2: クラウドソリューションの計画・実装(≈21%)2-A. コンピューティング2-B. データストレージ2-C. ネットワーク2-D. IaC• Compute Engine (GCE)• Spot VM / プリエンプティブル VM• Managed Instance Group (MIG)• Google Kubernetes Engine (GKE)– Autopilot モード– Standard モード• Cloud Run• Cloud Functions• Cloud Storage(オブジェクト)• Persistent Disk / Filestore• データベースサービス選定– Cloud SQL / Spanner / AlloyDB– Firestore / Bigtable / Memorystore– BigQuery / Bare Metal Solution• VPC・サブネット設計• Shared VPC / VPC Peering• Cloud NAT / Cloud DNS• Cloud VPN / Cloud Interconnect• ロードバランサの選定• Terraform の基本と State 管理• CI/CD パイプラインとの統合• Cloud Deployment Manager4 つのサブドメイン (A〜D) を横断して計画・実装を学ぶ
目次章一覧
タイトル主要トピック
Ch1コンピューティングサービス選定GCE / Spot VM / GKE / Cloud Run / Cloud Functions 比較
Ch2Compute Engine 詳解マシンファミリー・OS Login・ファイアウォール
Ch3Spot VMプリエンプション・チェックポイント・コスト最適化
Ch4MIG自動ヒーリング・オートスケール・ローリングアップデート
Ch5GKEAutopilot vs Standard・Workload Identity・HPA
Ch6Cloud Runデプロイ・トラフィック分割・コンテナ設定
Ch7Cloud FunctionsHTTP/GCS/Pub/Sub トリガー・Gen2 vs Gen1
Ch8Cloud Storageストレージクラス・OLM・署名付きURL
Ch9ブロック/ファイルストレージPersistent Disk 種類・リージョナルPD・Filestore
Ch10データベース選定Cloud SQL / Spanner / Firestore / Bigtable / BigQuery
Ch11VPC 設計VPC設計パターン・サブネット・ファイアウォール
Ch12Shared VPC と VPC Peering管理プロジェクト・サービスプロジェクト・ピアリング
Ch13Cloud NAT と Cloud DNSCloud Router・NAT・転送ゾーン・プライベートゾーン
Ch14ロードバランサLB種類選定・URLマップ・Cloud Armor・SSL
Ch15TerraformState管理・モジュール・CI/CD・リモートバックエンド
Ch16試験対策まとめ頻出パターン・重要用語・練習問題
Ch17参考資料公式ドキュメント・技術リソース集
01

コンピューティングサービスの選定

GCE・Spot VM・GKE・Cloud Run・Cloud Functions — どのサービスをいつ使うかを判断するフレームワーク

~21%
1.1サービス選定フローチャート

「どのコンピューティングサービスを使うか?」を判断するフローチャート

アプリケーションをどのように動かしたい?
│
├── VM(仮想マシン)が必要?
│   ├── 普通の VM → Compute Engine (GCE)
│   └── コスト削減OK・停止されても大丈夫 → Spot VM + MIG
│
├── コンテナを使う?
│   ├── Kubernetes でオーケストレーション → GKE
│   │   ├── 運用を Google に任せたい → GKE Autopilot(推奨)
│   │   └── カーネル設定など細かい制御が必要 → GKE Standard
│   └── HTTP リクエストで動くステートレスなアプリ → Cloud Run
│
└── 関数(コードの断片)を実行したい?
    └── イベント駆動の軽量処理 → Cloud Functions
1.2コンピューティングサービス比較表
サービス管理レベル起動速度コスト最適なユースケース
Compute Engineフル制御(IaaS)遅い(数分)vCPU/時間レガシー移行・特定ライセンス・OS設定が必要
Spot VMフル制御(IaaS)遅い最大91%割引バッチ・ML・レンダリング(停止OK)
GKE Autopilotフルマネージド中程度Pod リソース単位大規模マイクロサービス・運用負荷を下げたい
GKE Standard半マネージド中程度ノード(VM)単位特権コンテナ・カーネル設定・DaemonSet
Cloud Runサーバーレス高速リクエスト単位HTTP API・ゼロスケール・イベント駆動
Cloud Functionsサーバーレス高速呼び出し回数単位軽量グルーロジック・Webhook
参考: cloud.google.com/blog/topics/developers-practitioners/where-should-i-run-my-stuff-choosing-google-cloud-compute-option
1.3コスト最適化: Pricing Calculator と確約利用割引(補足)

アーキテクチャ計画段階でのコスト見積もりと制御メカニズムを理解することが、クラウド破産を防ぐ鍵です。

最適化手法説明対象
Pricing Calculatorリソースの予想利用量から月額料金をシミュレーション。リージョンごとの差分も把握可能すべてのサービス
確約利用割引(CUD)1年1年間の利用確約でオンデマンド価格から最大20%割引Compute Engine / Cloud SQL
確約利用割引(CUD)3年3年間の利用確約で最大70%割引Compute Engine / Cloud SQL
財務バッファサーバーレスの見積もりには10〜20%の余裕を追加(トラフィックスパイク対応)Cloud Run / Functions / MIG
カスタム割り当て(Quotas)BigQuery の1日あたりの処理データ量に上限を設定して高額請求を防止BigQuery
Maximum bytes billedクエリ単位で上限バイト数を設定。上限超過クエリは実行前に失敗させるBigQuery
初学者の罠

BigQuery で LIMIT 句を使っても、列指向ストレージの特性上スキャンされるデータ量(課金対象バイト数)は一切減少しません。必ずテーブルプレビュー機能を使い、クエリ前に推定コストを確認してください。

02

Compute Engine (GCE) 詳解

マシンファミリー・ディスク種類・OS Login・ネットワーク設定 — IaaS の完全ガイド

2.1Compute Engine とは?

Compute Engine は Google Cloud の IaaS(Infrastructure as a Service)です。Linux や Windows の仮想マシン(VM)を自由に作成・管理できます。

【Compute Engine でできること】
・OS の完全な制御(カーネルパラメータの変更など)
・カスタム VM サイズの設定
・GPU/TPU の接続
・静的 IP アドレスの割り当て
・OS レベルのソフトウェアインストール
・特定のライセンス(Windows Server, SQL Server 等)の利用
2.2マシンファミリーとマシンタイプ

マシンファミリーの選択基準

汎用(General Purpose): N2, N2D, E2, T2D
    → 通常の Web サーバー、開発環境、中程度のワークロード
    → E2 が最もコスト効率が高い(コスト重視ならまずE2)

コンピューティング最適化(Compute Optimized): C2, C2D
    → CPU 性能が最優先(ゲーム、HPC、高スループット計算)

メモリ最適化(Memory Optimized): M2, M3
    → 大容量 RAM が必要(SAP HANA、大型インメモリDB)
    → 最大 12TB のメモリ

アクセラレーター最適化(Accelerator Optimized): A2, A3, G2
    → GPU/TPU が必要(ML トレーニング、推論、3D レンダリング)

マシンタイプの命名規則

例: n2-standard-4
    │    │       └── vCPU 数(4コア)
    │    └── シリーズ(standard = バランス型)
    └── ファミリー(n2 = 第2世代汎用)

シリーズの種類:
  standard  = vCPU と メモリのバランス型(vCPU : メモリ = 1:4)
  highmem   = メモリ多め(vCPU : メモリ = 1:8)
  highcpu   = CPU 多め(vCPU : メモリ = 1:1)
  micro/small = 最小構成(共有 vCPU)
2.3ディスクの種類と選択基準
ディスク種別特徴IOPS用途
Balanced Persistent Diskコストとパフォーマンスのバランス最大 80,000一般的なワークロード(デフォルト推奨)
SSD Persistent Disk高 IOPS・低レイテンシ最大 100,000高負荷 DB、トランザクション処理
Standard Persistent Disk最安価・低 IOPS最大 7,500バッチ処理・コールドデータ
Extreme Persistent Disk最高性能最大 120,000SAP HANA・ミッションクリティカルDB
Local SSD物理的に VM に接続・最速最大 2,400,000キャッシュ・一時データ(VM停止で消える)
重要

Local SSD のデータは VM が停止・削除されると消えます。永続化が必要なデータには使用しないこと。

2.4VM へのセキュアなアクセス管理

❌ アンチパターン: 静的 SSH 鍵の使用

【問題のある旧来の方法】
VM のメタデータに SSH 公開鍵を登録
    ↓
退職した社員の鍵が残り続ける
    ↓
不正アクセスのリスクが継続
    ↓
鍵の棚卸し作業が膨大

✅ 推奨: OS Login

OS Login は IAM を通じて SSH アクセスを管理します。

【OS Login の仕組み】

1. IAM で roles/compute.osLogin(一般ユーザー)
   または roles/compute.osAdminLogin(sudo権限)を付与

2. 社員が SSH 接続しようとする
    ↓
3. OS Login が IAM をリアルタイムに照会
    ↓
4. IAM でロールを持っていれば接続OK
   IAM でロールを削除(退職処理)→ 即時アクセス不可

【メリット】
✓ IAM とライフサイクルを統合(退職 = アクセス消滅)
✓ 個別の SSH キーをローテーションする必要なし
✓ Linux アカウントを自動生成・管理
✓ 詳細な監査ログが自動記録

OS Login の設定方法

# プロジェクト全体に OS Login を有効化
gcloud compute project-info add-metadata \
  --metadata enable-oslogin=TRUE

# 特定の VM にのみ OS Login を有効化
gcloud compute instances add-metadata VM_NAME \
  --metadata enable-oslogin=TRUE

# 本番環境では 2FA を追加(強く推奨)
gcloud compute project-info add-metadata \
  --metadata enable-oslogin-2fa=TRUE

# ユーザーに OS Login ロールを付与
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:alice@example.com" \
  --role="roles/compute.osLogin"

# sudo 権限が必要な場合は osAdminLogin を使用
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:alice@example.com" \
  --role="roles/compute.osAdminLogin"

JIT(Just-In-Time)アクセス

本番環境での一時的な特権アクセスには JIT を採用します。

【JIT アクセスの流れ】

1. エンジニアが緊急作業の必要性を検知
2. JIT リクエストを送信(理由を記述)
3. 承認者がリクエストを承認
4. 一時的に sudo ロールを付与(例: 2時間)
5. 作業完了後、自動的に権限が剥奪
6. 全操作が監査ログに記録

【なぜ重要か】
常時 admin 権限を持つアカウントが侵害されると
    → 取り返しのつかない被害
JIT では権限は作業時間だけに限定される
    → 被害を最小化できる
2.5VM のネットワーク設定

外部 IP アドレスの管理

【一時的な外部 IP (Ephemeral)】
  VM の起動時に自動割り当て
  VM 停止時に解放される(再起動すると変わる)
  コスト: 無料(使用中)

【静的な外部 IP (Static)】
  明示的に予約する
  VM が停止しても保持される
  コスト: 予約中は有料(VM に割り当て中は無料)

【外部 IP なし(推奨: セキュリティ)】
  プライベートネットワーク内のリソースだけからアクセス
  Cloud NAT でインターネットへのアウトバウンドは可能
  セキュリティ上のリスクを最小化

ファイアウォールルール

# HTTP/HTTPS を許可するファイアウォールルール作成
gcloud compute firewall-rules create allow-http-https \
  --network=my-vpc \
  --action=ALLOW \
  --rules=tcp:80,tcp:443 \
  --target-tags=web-server \
  --source-ranges=0.0.0.0/0

# SSH を特定の IP からのみ許可
gcloud compute firewall-rules create allow-ssh-bastion \
  --network=my-vpc \
  --action=ALLOW \
  --rules=tcp:22 \
  --target-tags=bastion \
  --source-ranges=203.0.113.0/24
2.BPベストプラクティス: Compute Engine
ベストプラクティス
#ベストプラクティス理由
1OS Login + 2FA を有効化(静的 SSH 鍵は禁止)キーの漏洩・管理コストを排除
2外部 IP を持たない VM 構成(Cloud NAT でアウトバウンド)攻撃面(アタックサーフェス)を最小化
3本番 VM への SSH は JIT アクセスで一時的に付与常時権限による被害を防止
4シールドド VM(Shielded VM)を有効化UEFI セキュアブートで VM の完全性を保証
5メタデータサーバーへの不必要なアクセスを制限認証情報の不正取得を防止
6Confidential VM を検討(機密ワークロード)メモリ上のデータも暗号化
参考: cloud.google.com/blog/products/compute/top-compute-engine-documentation-pages/
03

Spot VM とプリエンプティブル VM

最大91%割引の余剰リソース活用 — チェックポイント設計とプリエンプション対応の完全ガイド

3.1Spot VM とは?

Google のデータセンターには、常に余剰の計算リソースがあります。Spot VM はその余剰リソースを格安で提供する仕組みです。

【通常の VM】
  ・確実に稼働し続ける
  ・通常料金(例: n2-standard-4 = 約$0.19/時間)

【Spot VM】
  ・余剰リソースを利用するため最大 91% 割引
  ・Google がリソースを必要としたら 30秒前通知で強制停止される
  ・例: n2-standard-4 = 約$0.02/時間(約90%割引)
重要

Spot VM はいつでも停止される可能性があります。ステートフルなアプリや停止が許されないサービスには使用禁止!

3.2Spot VM vs Preemptible VM
項目Preemptible VM(旧)Spot VM(現在推奨)
最大稼働時間24時間(強制停止)制限なし
停止通知30秒前30秒前
価格最大80%割引最大91%割引
推奨度❌ 非推奨(レガシー)✅ 推奨
3.3Spot VM に適したワークロード
✅ 向いているワークロード:
  ├── バッチ処理(夜間の大量データ処理)
  ├── ML/AI モデルのトレーニング
  ├── 3D レンダリング、動画エンコード
  ├── ゲノム解析などのサイエンティフィック計算
  └── 継続的インテグレーション(CI)のビルド/テスト

❌ 向いていないワークロード:
  ├── Web サーバー(ユーザーへの影響大)
  ├── データベース(データの整合性が壊れる可能性)
  ├── ステートフルなアプリ(状態が失われる)
  └── 停止が許されないミッションクリティカルなサービス
3.4プリエンプション(強制停止)への対応設計

① 終了アクションの設定

# Spot VM 作成時に終了アクションを設定
gcloud compute instances create my-spot-vm \
  --machine-type=n2-standard-4 \
  --provisioning-model=SPOT \
  --instance-termination-action=STOP  # STOP または DELETE

# STOP: VM を停止状態にする(ローカルディスクのデータ保持)
#   → キャパシティが戻った時に再起動可能
# DELETE: VM を削除する(最小コスト・ローカルデータ消失)
終了アクションローカルSSDデータ再起動用途
STOP✅ 保持自動(キャパシティ回復後)データを保持したいバッチ
DELETE❌ 消えるMIG が新規作成純粋なバッチ・ステートレス

② シャットダウンスクリプトの設定

# 停止前に状態を Cloud Storage に保存するスクリプト
#!/bin/bash
# /etc/google-cloud/metadata/shutdown-scripts

echo "Spot VM preemption detected. Saving checkpoint..."

# 処理の進捗を Cloud Storage に保存
gsutil cp /var/app/checkpoint.dat gs://my-batch-bucket/checkpoints/job-${JOB_ID}.dat

# 処理ログを保存
gsutil cp /var/log/app.log gs://my-batch-bucket/logs/job-${JOB_ID}.log

echo "Checkpoint saved. Shutting down."
gcloud compute instances add-metadata VM_NAME \
  --metadata-from-file shutdown-script=shutdown.sh

③ チェックポイントの実装パターン

# バッチ処理でのチェックポイント実装例(Python)
import signal
import json
from google.cloud import storage

checkpoint_file = "gs://my-bucket/checkpoints/job.json"
is_preempted = False

def handle_sigterm(signum, frame):
    """SIGTERM を受け取ったら(プリエンプション通知)"""
    global is_preempted
    is_preempted = True
    save_checkpoint(current_progress)
    print("Checkpoint saved, shutting down gracefully")

signal.signal(signal.SIGTERM, handle_sigterm)

def save_checkpoint(progress):
    """進捗を GCS に保存"""
    client = storage.Client()
    # ... チェックポイントをGCSに書き込み

def load_checkpoint():
    """前回の進捗を GCS から読み込み"""
    # ... GCS からチェックポイントを読み込み
    pass

# メイン処理(チェックポイントから再開)
last_checkpoint = load_checkpoint()
for i in range(last_checkpoint, total_items):
    if is_preempted:
        break
    process_item(i)
    current_progress = i
3.5Spot VM のコスト計算例
通常の ML トレーニングジョブ:
  A2 Ultra(8x A100 GPU) 通常料金: $32.77/時間
  Spot VM 割引(約70%):            $9.83/時間

  10時間のトレーニング:
    通常: $327.70
    Spot: $98.30
    節約: $229.40(約70%節約)!
3.BPベストプラクティス: Spot VM
ベストプラクティス
#ベストプラクティス詳細
1MIG(Managed Instance Group)と組み合わせるプリエンプト後に自動で新しい VM を作成
2チェックポイント機能を必ず実装処理を途中から再開できるよう設計
3終了アクションは STOP を基本にデータを保持しキャパシティ回復後に再起動
4シャットダウンスクリプトを設定30秒の猶予でクリーンに終了処理
5複数ゾーンにわたる MIG を構成特定ゾーンの Spot VM が全滅するリスクを分散
6gcloud compute operations describe でプリエンプション履歴を確認Spot 利用率の最適化
04

Managed Instance Group (MIG)

自動ヒーリング・オートスケーリング・ローリングアップデート — 高可用性VM管理の完全ガイド

4.1MIG とは?

MIG(Managed Instance Group)は、インスタンステンプレート から同一設定の VM を複数自動管理する機能です。

インスタンステンプレート(設計図)
  ├── マシンタイプ: n2-standard-4
  ├── OS イメージ: debian-11
  ├── ディスクサイズ: 100GB
  └── スタートアップスクリプト: install_app.sh

       ↓ MIG が自動的に複数の VM を作成・管理

VM1(asia-northeast1-a)
VM2(asia-northeast1-b)
VM3(asia-northeast1-c)
4.2MIG の主要機能

機能① 自動ヒーリング(Auto Healing)

ヘルスチェックで VM の異常を検知
    ↓
異常な VM を自動的に削除
    ↓
新しい VM を自動作成

→ 人間が介入しなくてもサービスを維持!

ヘルスチェックの設定

# ヘルスチェックを作成
gcloud compute health-checks create http my-health-check \
  --port=80 \
  --request-path=/health \
  --check-interval=30s \
  --timeout=10s \
  --healthy-threshold=1 \
  --unhealthy-threshold=3

# MIG にヘルスチェックを設定
gcloud compute instance-groups managed set-autohealing my-mig \
  --health-check=my-health-check \
  --initial-delay=300  # 起動後300秒は異常判定しない

機能② 自動スケーリング(Autoscaling)

負荷が増加 → VM を自動追加(スケールアウト)
負荷が減少 → VM を自動削除(スケールイン)

スケーリングの指標:
  ├── CPU 使用率(最もシンプル)
  ├── HTTP リクエスト数(LB と連携)
  ├── Cloud Monitoring カスタムメトリクス
  └── Pub/Sub キューの深さ(バッチ処理に有効)
# CPU 使用率 60% を目標にオートスケールを設定
gcloud compute instance-groups managed set-autoscaling my-mig \
  --max-num-replicas=10 \
  --min-num-replicas=2 \
  --target-cpu-utilization=0.6 \
  --cool-down-period=90

機能③ ローリングアップデート(Rolling Update)

旧バージョンのインスタンステンプレート
          ↓ ローリングアップデート
新バージョンのインスタンステンプレート

・1台ずつ順番に更新(サービスを止めない)
・問題が発生したらロールバック可能
# ローリングアップデートを実行
gcloud compute instance-groups managed rolling-action start-update my-mig \
  --version=template=new-template \
  --max-surge=1 \
  --max-unavailable=0    # 同時に停止できるVM数(0=サービス継続)
4.3ゾーン MIG vs リージョン MIG
種類展開範囲耐障害性用途
ゾーン MIG1つのゾーン低(ゾーン障害で全停止)開発・テスト環境
リージョン MIG3つのゾーンに均等分散高(1ゾーン障害でも継続)本番環境(推奨)
# リージョン MIG の作成(本番環境推奨)
gcloud compute instance-groups managed create my-regional-mig \
  --template=my-template \
  --size=6 \
  --region=asia-northeast1  # ゾーンではなくリージョンを指定
4.BPベストプラクティス: MIG
ベストプラクティス
  • 本番環境はリージョン MIG でゾーン障害に備える
  • ヘルスチェック + 自動ヒーリングを必ず設定する
  • Spot VM との組み合わせでコスト削減(--provisioning-model=SPOT
  • オートスケーリングの max-num-replicas に上限を設ける(コスト暴走防止)
  • ローリングアップデートで max-unavailable=0 を設定してゼロダウンタイム更新
05

Google Kubernetes Engine (GKE)

Autopilot vs Standard・Workload Identity・Binary Authorization・オートスケーリングの完全ガイド

5.1Kubernetes の基本概念
【Kubernetes の主要オブジェクト】

Pod(ポッド)
  └── 1つ以上のコンテナをまとめた最小デプロイ単位
      例: nginx コンテナ + ログ収集サイドカー

Deployment(デプロイメント)
  └── Pod の望ましい状態を定義・管理
      例: 「このアプリを3つのレプリカで動かす」

Service(サービス)
  └── Pod へのネットワークアクセスを提供
      例: 「このラベルを持つPodに負荷分散する」

Node(ノード)
  └── Pod が実際に動く仮想マシン(VM)
      GKE では Compute Engine VM が Node になる

Namespace(ネームスペース)
  └── クラスタを論理的に分割する仮想境界
      例: namespace: frontend, backend, monitoring
5.2GKE の 2 つのモード: Autopilot vs Standard

モード選択のフローチャート

特権コンテナが必要? → YES → Standard モード
カーネルパラメータの変更が必要? → YES → Standard モード
DaemonSet でのエージェント配置が必要? → YES → Standard モード
既存のノード管理チームがある? → YES → Standard モード
                    ↓
              それ以外の場合
                    ↓
          Autopilot モード(推奨)

🚀 GKE Autopilot モード

【Autopilot でGoogle が自動管理するもの】

インフラ管理:
  ├── ノードのプロビジョニング(VM の作成)
  ├── ノードのスケーリング(増減)
  ├── ノードのアップグレード(Kubernetes バージョン更新)
  └── ノードの修復(障害ノードの自動交換)

セキュリティ:
  ├── Kubernetes Baseline セキュリティ標準の強制適用
  ├── 特権コンテナのブロック
  ├── ホスト名前空間へのアクセス制限
  └── Workload Identity の自動有効化

【Autopilot の課金モデル】
  ❌ ノード(VM)単位の課金 ではなく
  ✅ Pod が要求する vCPU / メモリ / エフェメラルストレージ の課金

  例: Pod が requests: cpu=0.5, memory=1Gi を設定
    → その Pod が動いている時間だけ課金
    → アイドルノードへの課金なし!
制約(Autopilot)説明
特権コンテナ❌ 実行不可
HostPath ボリューム❌ 使用不可
NodeSelector(特定ノードへの配置)限定的
DaemonSet❌ 基本的に不可
カーネルパラメータ変更❌ 不可

⚙️ GKE Standard モード

【Standard でユーザーが管理するもの】

・ノードプールの作成・削除
・マシンタイプの選択
・ノードのアップグレード(手動またはスケジュール設定)
・ノード上の DaemonSet の管理

【Standard が必要な場面】
  ├── 特権コンテナの実行(一部のセキュリティツールなど)
  ├── カーネルパラメータ(sysctl)の変更
  ├── GPU / TPU ノードプールの設定
  ├── カスタムロギング/監視エージェント(DaemonSet)
  └── Bare Metal/特殊ハードウェアの要件
5.3GKE クラスタの作成

Autopilot クラスタの作成

# Autopilot クラスタを作成(推奨設定)
gcloud container clusters create-auto my-autopilot-cluster \
  --region=asia-northeast1 \
  --network=my-vpc \
  --subnetwork=my-subnet \
  --enable-private-nodes \
  --master-ipv4-cidr=172.16.0.0/28

# クラスタへの認証情報を取得(kubectl で操作できるようにする)
gcloud container clusters get-credentials my-autopilot-cluster \
  --region=asia-northeast1

Standard クラスタの作成

# Standard クラスタを作成
gcloud container clusters create my-standard-cluster \
  --machine-type=n2-standard-4 \
  --num-nodes=3 \
  --region=asia-northeast1 \
  --node-locations=asia-northeast1-a,asia-northeast1-b,asia-northeast1-c \
  --enable-autoscaling \
  --min-nodes=1 \
  --max-nodes=10 \
  --workload-pool=PROJECT_ID.svc.id.goog \
  --enable-private-nodes \
  --master-ipv4-cidr=172.16.0.0/28
5.4GKE のセキュリティ設計

Workload Identity Federation(最重要)

【❌ 危険なアンチパターン】
サービスアカウントの JSON キーを
Kubernetes Secret に保存して Pod から参照
    ↓
キーが漏洩するリスク / キーの定期ローテーションの手間

【✅ 正しい方法: Workload Identity】

Kubernetes Service Account (KSA)
    ↓ bind(紐付け)
Google Cloud IAM Service Account (GSA)
    ↓
Pod は KSA を使って Google Cloud API に直接アクセス
(JSON キー不要!)
# 1. Google Cloud IAM サービスアカウントを作成
gcloud iam service-accounts create my-app-sa \
  --display-name="My Application SA"

# 2. 必要な IAM ロールを付与(例: Cloud Storage の読み取り)
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/storage.objectViewer"

# 3. KSA と GSA を紐付け
gcloud iam service-accounts add-iam-policy-binding \
  my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
  --role="roles/iam.workloadIdentityUser" \
  --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
# Kubernetes Service Account に GSA を紐付けるアノテーション
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-ksa
  namespace: my-app
  annotations:
    iam.gke.io/gcp-service-account: my-app-sa@PROJECT_ID.iam.gserviceaccount.com
---
# Pod で KSA を使用
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-ksa
  containers:
  - name: my-container
    image: my-image

Binary Authorization(コンテナの完全性保証)

【Binary Authorization の仕組み】

CI パイプライン:
  コードビルド → テスト通過 → イメージに署名

GKE デプロイ時:
  Binary Authorization が署名を検証
    ├── 有効な署名あり → デプロイ許可 ✅
    └── 署名なし・無効 → デプロイ拒否 ❌

【防げる攻撃】
  ├── 承認されていないイメージの誤デプロイ
  ├── サプライチェーン攻撃(パッケージへの悪意のあるコード挿入)
  └── 本番環境への未テストイメージのデプロイ

セキュリティポスチャダッシュボード

GKE Console → セキュリティポスチャ

自動スキャン項目:
  ├── Pod の設定上の懸念事項
  │   例: 「root として実行している」「特権コンテナ」
  ├── コンテナイメージの脆弱性(CVE)
  │   例: 「コンテナの libssl に高リスクのCVEあり」
  └── 推奨される修正アクション(自動提示)
5.5GKE のオートスケーリング
スケーリング種別対象仕組み
HPA(Horizontal Pod Autoscaler)Pod 数CPU/メモリ/カスタムメトリクスに基づいてPodを増減
VPA(Vertical Pod Autoscaler)Pod のリソース量CPU/メモリのリクエストを自動調整
Cluster Autoscalerノード数Podがスケジュールできない時にノードを追加
KEDAPod 数Pub/Subキューなど外部メトリクスに基づいてスケール
# HPA の設定例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60  # CPU 60% を目標に Pod 数を調整
5.BPベストプラクティス: GKE
ベストプラクティス
#ベストプラクティス理由
1新規クラスタは Autopilot を選択(特別な要件がなければ)運用負荷ゼロ・セキュリティが自動強化
2JSON キーは絶対に使わず Workload Identity を使用認証情報の漏洩を根本的に防止
3プライベートクラスタ(外部 IP なし)で構築ノードへの直接攻撃を遮断
4Binary Authorization を有効化承認されていないイメージのデプロイを阻止
5Security Posture Dashboard を定期確認CVE と設定ミスをプロアクティブに解消
6リソースリクエストとリミットを必ず設定Podのリソース競合・コスト最適化
7Namespace で環境・チームを分離マルチテナントのアクセス制御
5.ADVGKE ネットワーク深掘り: VPC-native クラスター(補足)
【ルートベース vs VPC ネイティブ クラスター】

ルートベース クラスター(旧):
  Pod の IP ルーティングを VPC の静的ルートに依存
  → ノード数増加でルート割り当て上限(クォータ)に到達
  → スケーラビリティのボトルネックとなる
  → 一度作成したら VPC ネイティブに移行不可!

VPC ネイティブ クラスター(現在のデフォルト・推奨):
  エイリアスIP(Alias IPs)で Pod に直接 IP を割り当て
  → VPC ルーティングテーブルを消費しない
  → 無限に近いスケーラビリティを実現

VPC ネイティブが有効にする追加機能:
  ├── コンテナネイティブ負荷分散(NEG: Network Endpoint Group)
  │   → LB が Pod に直接ルーティング(VMを経由しない高効率)
  └── Google API へのプライベートアクセス(VPC SC との連携)

計画段階での重要な教訓:
  → 新規クラスターは必ず VPC ネイティブを選択
  → ルートベースから VPC ネイティブへの移行は不可能
     (クラスターを作り直す必要がある)
参考: cloud.google.com/kubernetes-engine/docs/how-to/routes-based-cluster
06

Cloud Run

サーバーレスコンテナ — ゼロスケール・Direct VPC Egress・カナリアデプロイの完全ガイド

6.1Cloud Run とは?

Cloud Run はコンテナイメージを渡すだけで動くフルマネージドのサーバーレスプラットフォームです。

【Cloud Run の特徴】

デプロイは 3ステップだけ:
  1. コンテナイメージをビルド(Artifact Registry へ push)
  2. Cloud Run にデプロイ
  3. HTTPS エンドポイントが自動生成されて完了!

スケーリング:
  リクエストが来たら → 自動でスケールアウト
  リクエストがなければ → ゼロにスケールダウン(コストゼロ)

料金:
  リクエスト処理中のみ課金
  アイドル時間は無料(最小インスタンス=0の場合)
6.2Cloud Run の 2 世代の実行環境
項目第1世代第2世代(推奨)
CPUリクエスト処理中のみ常時利用可能
ネットワークVPC コネクタ経由Direct VPC Egress(高速)
スループット制限あり最大2Gbps
並行処理最大 250 リクエスト/インスタンス最大 1000 リクエスト/インスタンス
# 第2世代で Cloud Run をデプロイ(推奨)
gcloud run deploy my-service \
  --image=gcr.io/PROJECT_ID/my-app:latest \
  --region=asia-northeast1 \
  --platform=managed \
  --execution-environment=gen2 \
  --vpc-egress=all-traffic \
  --network=my-vpc \
  --subnet=my-subnet
6.3VPC 内のリソースへの接続

Direct VPC Egress(第2世代・推奨)

Cloud Run コンテナ
    ↓ Direct VPC Egress(高速・低レイテンシ)
VPC ネットワーク
    ├── Cloud SQL(プライベート IP)
    ├── Memorystore(Redis)
    ├── GCE VM(内部 IP)
    └── GKE サービス
# Direct VPC Egress で VPC 内リソースにアクセス
gcloud run deploy my-service \
  --image=CONTAINER_IMAGE \
  --vpc-egress=private-ranges-only \
  --network=my-vpc \
  --subnet=my-subnet

旧: Serverless VPC Access コネクタ(第1世代)

# Serverless VPC Access コネクタを作成(旧方式)
gcloud compute networks vpc-access connectors create my-connector \
  --network=my-vpc \
  --region=asia-northeast1 \
  --range=10.8.0.0/28

# Cloud Run にコネクタを設定
gcloud run deploy my-service \
  --vpc-connector=my-connector
6.4トラフィック分割(カナリアデプロイ)

Cloud Run はトラフィックを複数のリビジョン(バージョン)に分割できます。

【カナリアデプロイの例】

v1(安定版) ─────── 90% のトラフィック
v2(新バージョン) ── 10% のトラフィック
                      ↓
              問題なければ 100% に切り替え
              問題あればすぐ v1 に戻す
# v2 に 10% のトラフィックを向ける
gcloud run services update-traffic my-service \
  --to-revisions=v1=90,v2=10

# 問題なければ v2 に 100% 切り替え
gcloud run services update-traffic my-service \
  --to-latest
6.5Cloud Run の認証
【外部からのアクセス制御】

インターネット公開(認証不要):
  gcloud run deploy my-service --allow-unauthenticated

認証必須(IAM で制御):
  gcloud run deploy my-service --no-allow-unauthenticated
  → アクセスには roles/run.invoker ロールが必要

サービス間認証:
  Cloud Run サービス A → Cloud Run サービス B
    サービス A のサービスアカウントに
    サービス B の roles/run.invoker を付与
6.BPベストプラクティス: Cloud Run
ベストプラクティス
#ベストプラクティス理由
1第2世代実行環境 + Direct VPC Egress を使用スループット向上・VPC コネクタ不要
2ステートレスな設計(状態は Cloud SQL・Firestore に保存)スケーリングに対応するため
3最小インスタンス数を設定してコールドスタートを削減レイテンシの安定化
4--no-allow-unauthenticated で IAM 認証を必須に意図せぬ公開を防止
5Secret Manager から環境変数を注入してシークレット管理コードや環境変数にシークレットを直書きしない
6カナリアデプロイでリリースリスクを軽減問題を早期発見・即時ロールバック
07

Cloud Functions

イベント駆動サーバーレス — HTTP/GCS/Pub/Sub トリガーと Gen2 の完全ガイド

7.1Cloud Functions とは?
【Cloud Functions の特徴】

サーバー管理不要:
  コードだけ書けばOK
  実行環境・スケーリングはGoogle が管理

イベントドリブン:
  ├── HTTP リクエスト
  ├── Cloud Storage へのファイルアップロード
  ├── Pub/Sub メッセージ
  ├── Cloud Scheduler(定期実行)
  └── Firestore の変更

料金:
  関数の呼び出し回数 + 実行時間の課金
  月 200 万回まで無料
7.2Cloud Functions の世代
項目第1世代第2世代(推奨)
実行時間の上限9分60分
並列性1リクエスト/インスタンス最大1000リクエスト/インスタンス
メモリ最大 8GB最大 32GB
CPUリクエスト中のみ常時
ベースCloud FunctionsCloud Run Functions(Cloud Run 上で動作)
7.3Cloud Functions の代表的な使用例

例1: HTTP トリガー(API エンドポイント)

import functions_framework
from flask import jsonify

@functions_framework.http
def hello_world(request):
    name = request.args.get('name', 'World')
    return jsonify({'message': f'Hello, {name}!'})

例2: Cloud Storage トリガー(画像アップロード時に処理)

import functions_framework
from google.cloud import storage, vision

@functions_framework.cloud_event
def process_image(cloud_event):
    data = cloud_event.data
    bucket_name = data["bucket"]
    file_name = data["name"]

    # Cloud Vision API で画像分析
    client = vision.ImageAnnotatorClient()
    image = vision.Image()
    image.source.image_uri = f"gs://{bucket_name}/{file_name}"

    response = client.label_detection(image=image)
    print(f"Labels: {[l.description for l in response.label_annotations]}")

例3: Pub/Sub トリガー(予算アラートへの対応)

import base64
import json
import googleapiclient.discovery

def stop_billing(event, context):
    """予算超過アラートを受けてリソースを停止"""
    pubsub_data = base64.b64decode(event['data']).decode('utf-8')
    data = json.loads(pubsub_data)

    if data['costAmount'] >= data['budgetAmount']:
        compute = googleapiclient.discovery.build('compute', 'v1')
        # VM を停止
        compute.instances().stop(
            project='PROJECT_ID',
            zone='asia-northeast1-a',
            instance='my-vm'
        ).execute()
7.4Cloud Functions vs Cloud Run の使い分け
【Cloud Functions を選ぶとき】
  ├── 単純なイベント処理(数行〜数十行のコード)
  ├── 各種 Google Cloud サービスのイベントに反応
  ├── 定期バッチ(Cloud Scheduler + Functions)
  └── プロトタイプ・PoC の素早い実装

【Cloud Run を選ぶとき】
  ├── 複数のエンドポイントを持つ REST API
  ├── 既存のコンテナ化されたアプリ
  ├── カスタムランタイム(Go・Rust など)
  ├── 長時間実行が必要(60分以上)
  └── 複雑なミドルウェアが必要なアプリ
7.BPベストプラクティス: Cloud Functions
ベストプラクティス
  • 第2世代を使用(実行時間60分・高並列性)
  • 関数は単一責任の原則(1関数 = 1つのことだけ処理)
  • シークレットは Secret Manager から取得(環境変数に直書き禁止)
  • VPC コネクタでプライベートリソースに接続
  • 冪等性(Idempotency)の確保(同じイベントを複数回受けても安全)
08

Cloud Storage(オブジェクトストレージ)

4ストレージクラス・OLM・署名付きURL・データ保護 — 非構造化データ管理の完全ガイド

8.1Cloud Storage とは?
【Cloud Storage の特徴】
  ├── 容量無制限(バケット単位で管理)
  ├── 高い耐久性(99.999999999% = イレブンナイン)
  ├── グローバルなアクセス
  ├── バケット ─ オブジェクト の 2 層構造
  └── HTTP/HTTPS でアクセス可能
8.24 つのストレージクラス
アクセス頻度
  高い ←──────────────────────────────────→ 低い

Standard → Nearline → Coldline → Archive
 ↑費用/GB    ↑費用/GB   ↑費用/GB   ↑費用/GB
  高め        中         低め        最安値
            ↑取り出し料金
   無料      有料(安)    有料(中)    有料(高)
クラスGB 単価取り出し料金最小保存期間アクセス頻度の目安
Standard$0.020/GB無料なし頻繁(日次以上)
Nearline$0.010/GB$0.01/GB30日月1回程度
Coldline$0.004/GB$0.02/GB90日四半期1回程度
Archive$0.0012/GB$0.05/GB365日年1回以下
試験頻出

最小保存期間より前に削除しても、最小保存期間分の料金が発生します!

8.3バケットの作成とロケーション設定
【Single Region(単一リージョン)】
  例: asia-northeast1(東京)
  → 最もコストが低い
  → リージョン障害でデータにアクセス不可
  → 同一リージョン内でのデータ転送が最速

【Dual Region(デュアルリージョン)】
  例: asia1(東京 + 大阪)
  → 2リージョン間で自動レプリケーション
  → 地理的冗長性あり
  → コストは Multi-Region と同程度

【Multi Region(マルチリージョン)】
  例: asia(アジア全体)、us(米国全体)、eu(EU)
  → 最高の可用性と地理分散
  → コストは最も高い
  → グローバルなコンテンツ配信に最適
# バケットの作成
gcloud storage buckets create gs://my-app-bucket \
  --location=asia-northeast1 \
  --storage-class=STANDARD \
  --uniform-bucket-level-access
8.4オブジェクトライフサイクル管理(OLM)
オブジェクト作成(Standard)
    │
    ├── 30日後 → Nearline に自動移行
    │
    ├── 90日後 → Coldline に自動移行
    │
    ├── 365日後 → Archive に自動移行
    │
    └── 730日後 → 自動削除

→ このルールを設定するだけでコスト最適化が自動化!
{
  "lifecycle": {
    "rule": [
      {
        "action": {"type": "SetStorageClass", "storageClass": "NEARLINE"},
        "condition": {"age": 30}
      },
      {
        "action": {"type": "SetStorageClass", "storageClass": "COLDLINE"},
        "condition": {"age": 90}
      },
      {
        "action": {"type": "SetStorageClass", "storageClass": "ARCHIVE"},
        "condition": {"age": 365}
      },
      {
        "action": {"type": "Delete"},
        "condition": {"age": 730}
      }
    ]
  }
}
# OLM ポリシーをバケットに適用
gcloud storage buckets update gs://my-bucket \
  --lifecycle-file=lifecycle.json
条件名説明
ageオブジェクトの作成からの日数30
numNewerVersionsより新しいバージョンの数3(3つ以上の新バージョンがあれば)
isLive最新バージョンかどうかfalse(非最新のみ対象)
matchesStorageClass特定ストレージクラスのみ対象["STANDARD"]
createdBefore特定日付より前に作成2024-01-01
8.5バケットセキュリティのベストプラクティス
【バケット名のルール】
  ├── グローバルに一意(全世界で重複不可)
  ├── 3〜63文字
  ├── 小文字・数字・ハイフン・アンダースコアのみ
  ├── 「goog」で始まる名前は予約済みで使用不可
  ├── 「google」のスペルミス(googel など)も使用不可
  └── バケット名は URL に含まれる!

【バケット名の設計原則】
  ❌ 悪い例: my-company-production-database-backups-tokyo
    → 会社名・環境・内容が丸わかり

  ✅ 良い例: bkt-a7f2k9-prod-bak
    → 意味を推測しにくいランダムなサフィックス付き
    → 個人情報・機密情報を一切含まない
【アクセス制御の 2 つのモデル】

【1. ACL(Access Control List)】  ← 旧モデル・非推奨
  オブジェクトごとに個別のアクセス制御が可能
  管理が複雑になりがち

【2. 統一バケットレベルアクセス(Uniform Bucket-Level Access)】 ← 推奨
  バケット全体に IAM ポリシーを適用
  オブジェクト個別の ACL は無効化
  管理がシンプル・一貫性あり
8.6署名付き URL(Signed URLs)

Google アカウントを持たないユーザーに一時的なアクセスを付与する仕組みです。

【ユースケース】
  ├── 外部パートナーへのデータ共有
  ├── 顧客へのダウンロードリンク提供
  └── 一時的なアップロード用 URL の生成

【署名付き URL の構造】
  https://storage.googleapis.com/BUCKET/OBJECT
    ?X-Goog-Algorithm=GOOG4-RSA-SHA256
    &X-Goog-Credential=...
    &X-Goog-Date=20240101T000000Z
    &X-Goog-Expires=3600         ← 有効期間(秒)
    &X-Goog-Signature=...
# 1時間有効な署名付き URL を生成
gcloud storage sign-url gs://my-bucket/my-file.pdf \
  --duration=1h \
  --service-account=my-sa@PROJECT.iam.gserviceaccount.com

# 最大有効期間は 7日間(604800秒)
8.7データ保護機能

論理削除(Soft Delete)

デフォルト設定: 有効(7日間保持)

オブジェクト削除 → 7日間はリカバリ可能
              → 8日目以降は完全削除(コストも発生)

保持期間のカスタマイズ(0〜90日):
  gcloud storage buckets update gs://my-bucket \
    --soft-delete-duration=30d
バケット再作成の仕様

バケットを削除後 10 分以内に同名バケットを作成しようとすると 404 エラーが発生します。

バケットロック(Bucket Lock)と保持ポリシー

【用途】コンプライアンス・法規制対応

保持ポリシー:
  バケット内のすべてのオブジェクトを
  指定期間(例: 7年間)削除・上書き不可にする

バケットロック:
  保持ポリシー自体を変更・削除不可にする
  (取り消しができない操作!)

gcloud storage buckets update gs://my-compliance-bucket \
  --retention-period=7y  # 7年間保持

gcloud storage buckets lock gs://my-compliance-bucket  # ロック(不可逆!)

オブジェクトバージョニング

# バージョニングを有効化
gcloud storage buckets update gs://my-bucket --versioning

# 非最新バージョンを確認
gcloud storage objects list gs://my-bucket --all-versions

# 特定バージョンを復元
gsutil cp gs://my-bucket/file.txt#1234567890 gs://my-bucket/file.txt
8.BPベストプラクティス: Cloud Storage
ベストプラクティス
#ベストプラクティス理由
1統一バケットレベルアクセスを有効化IAMで一元管理・ACLの複雑さを排除
2OLM を必ず設定してストレージクラスを自動移行コスト最適化の自動化
3バケット名に機密情報を含めないバケット名は URL に公開される
4バージョニングを有効化し、非最新版には OLM を設定誤削除対策・コスト管理
5Soft Delete は用途に応じて保持期間を設定デフォルト7日では短すぎる場合も
6パブリックアクセスを原則禁止意図しないデータ公開を防止
09

ブロックストレージとファイルストレージ

Persistent Disk・リージョナルPD・Filestore — VM ストレージの完全ガイド

9.1Persistent Disk(永続ディスク)

VM に接続するブロックストレージです。

Persistent Disk の特徴:
  ├── VM とは独立して存在(VM を削除してもディスクは残る設定可能)
  ├── 複数のVMから読み取り専用で共有可能(マルチリーダー)
  ├── 1つのVMへの読み書きと1つのVMへの共有(マルチライター)※Extreme除く
  └── ゾーンPD と リージョンPD の2種類

【ゾーン PD】
  1つのゾーン内に存在
  → そのゾーン障害でアクセス不可

【リージョン PD(高可用性)】
  2つのゾーンに同期レプリケーション
  → 1ゾーン障害でも他ゾーンでアクセス継続
  → 約2倍のコスト
# リージョン Persistent Disk の作成(高可用性)
gcloud compute disks create my-regional-disk \
  --type=pd-balanced \
  --size=100GB \
  --region=asia-northeast1 \
  --replica-zones=asia-northeast1-a,asia-northeast1-b
9.2Filestore(マネージドNFSファイルシステム)

複数の VM から同時にアクセスできるNFSファイルシステムです。

【Filestore の用途】
  ├── 複数の VM でファイルを共有(共有ホームディレクトリなど)
  ├── レガシーアプリの NFS 依存を維持したまま移行
  └── CMS(WordPress など)の共有ストレージ

【Filestore 階層】
  Basic HDD → Basic SSD → High Scale SSD → Enterprise
  (コスト低←──────────────────────────→パフォーマンス高)
10

データベースサービス完全選定ガイド

Cloud SQL / Spanner / AlloyDB / Firestore / Bigtable / Memorystore / BigQuery — 最適なDBを選ぶフレームワーク

10.1データベース選定のフローチャート
どんなデータを扱う?
│
├── 構造化データ(スキーマが決まっている)
│   │
│   └── SQL が必要?
│       ├── YES → どんな規模・要件?
│       │         ├── 標準的なWebアプリ → Cloud SQL
│       │         ├── グローバル分散・99.999% → Cloud Spanner
│       │         └── PostgreSQL 高性能(4倍)→ AlloyDB
│       │
│       └── NO(NoSQL)→ どんな特性が必要?
│           ├── リアルタイム同期・モバイル → Firestore
│           ├── 超大規模・低レイテンシ・時系列 → Cloud Bigtable
│           └── マイクロ秒・キャッシュ → Memorystore
│
├── 分析・DWH → BigQuery
│
└── Oracle を移行したい → Bare Metal Solution
10.2Cloud SQL

MySQL、PostgreSQL、SQL Server のフルマネージドサービスです。

【Cloud SQL が管理してくれるもの】
  ├── OS パッチ適用
  ├── データベースマイナーバージョンアップ
  ├── 自動バックアップ(日次)
  ├── フェイルオーバーレプリカ(HA構成)
  └── SSL/TLS 暗号化

アーキテクチャパターン

【シングルインスタンス(開発環境)】
  プライマリ DB ←── 読み書き
  コスト: 安い、可用性: 低い

【高可用性(HA)構成(本番環境)】
  プライマリ DB(ゾーンA)
       ↓ 同期レプリケーション
  スタンバイ DB(ゾーンB)

  プライマリ障害 → 自動フェイルオーバー(数十秒)
  コスト: 2倍程度

【リードレプリカ(読み取りスケール)】
  プライマリ DB(書き込み)
       ↓ 非同期レプリケーション
  リードレプリカ 1(読み取り)
  リードレプリカ 2(読み取り)

  読み取り負荷を複数レプリカに分散

Cloud SQL への安全な接続

【3つの接続方法】

方法1: Cloud SQL Auth Proxy(推奨)
  アプリ → Cloud SQL Auth Proxy(ローカル)→ Cloud SQL
  → SSL/TLS を自動処理、IAM で認証
  → DB のパスワードが不要

  使用例:
  # Auth Proxy を起動
  ./cloud-sql-proxy PROJECT:REGION:INSTANCE_NAME

方法2: プライベート IP(VPC 内から)
  VPC 内のアプリ → プライベート IP → Cloud SQL
  → インターネットを経由しない最も安全な方法
  → Private Service Connect を使用

方法3: 公開 IP(外部から)
  外部アプリ → Cloud SQL(公開 IP)
  → 許可された IP アドレスのみアクセス可能(許可リスト)
  → 原則避けるべき
# Cloud SQL インスタンス作成(HA 構成)
gcloud sql instances create my-postgres \
  --database-version=POSTGRES_15 \
  --tier=db-n1-standard-4 \
  --region=asia-northeast1 \
  --availability-type=REGIONAL \
  --backup-start-time=03:00 \
  --no-assign-ip \
  --network=my-vpc
10.3Cloud Spanner
Cloud Spanner = リレーショナル × グローバル分散 × 水平スケール

【何が特別か】
  通常の DB: スケールアップ(大きなマシンに変える)で対応
  Cloud Spanner: ノードを追加するだけで水平スケール
                 SQL/ACIDトランザクションを維持したまま!

【SLA: 99.999%(ファイブナイン)】
  年間ダウンタイム: 約 5.26 分
  他の DB は通常 99.9%(年間 8.76 時間)

【ユースケース】
  ├── グローバルな金融システム(証券、決済)
  ├── 大規模インベントリ管理
  └── グローバルゲームのリーダーボード・状態管理
判断基準Cloud SQLCloud Spanner
規模中規模まで大規模・超大規模
グローバル分散❌(リードレプリカは可能)
水平スケール
SQL 対応✅(方言あり)
費用安い高い(ノード=$0.9/時間〜)
移行コスト低い高い(スキーマ変更が必要)
10.4AlloyDB
AlloyDB = PostgreSQL 完全互換 + Google AI 最適化

【性能】
  標準 PostgreSQL の 4倍のトランザクション性能
  分析クエリは 100倍速い(列指向ストレージを内部使用)

【Cloud SQL PostgreSQL vs AlloyDB の使い分け】
  Cloud SQL PostgreSQL:
    → 標準的な Web アプリ・既存 PG アプリの移行
    → 中規模まで

  AlloyDB:
    → OLTP と分析(HTAP)を同一 DB で処理したい
    → 高性能が必要・AI/ML との統合が必要
    → pgvector を使ったベクトル検索(AI 機能)
10.5Firestore
【Firestore の特徴】

ドキュメント指向 NoSQL:
  データ構造: コレクション → ドキュメント → フィールド

  users(コレクション)
    └── alice(ドキュメント)
         ├── name: "Alice"
         ├── age: 30
         └── orders(サブコレクション)
               └── order-001
                    ├── item: "laptop"
                    └── price: 150000

リアルタイム同期:
  データが変更されると全クライアントに即時反映
  → モバイルアプリ・チャット・コラボツールに最適

サーバーレス:
  キャパシティプランニング不要・自動的にスケール
判断基準FirestoreCloud Bigtable
データ規模GB〜TBTB〜PB
アクセスドキュメント単位行/列単位
クエリ豊富(複合クエリ可)キーのみ(フィルタは限定的)
リアルタイム同期
レイテンシミリ秒ミリ秒未満
ユースケースモバイル・Web バックエンドIoT・時系列・ML データ
10.6Cloud Bigtable
【Cloud Bigtable の特徴】

ワイドカラム型 NoSQL:
  数十億行 × 数百万列 のデータを処理
  ミリ秒未満のレイテンシを維持

  行キー(Row Key)でアクセス最適化:
  例: "sensor_001#2024010112000000"(センサーID + タイムスタンプ)
     → 時系列データの範囲スキャンが超高速

HBase 互換:
  Hadoop エコシステムとの統合が容易

【ユースケース】
  ├── IoT センサーデータ(秒間数百万レコード)
  ├── 広告配信ログ
  ├── 金融の取引履歴
  └── ML フィーチャーストア
10.7Memorystore
【Memorystore の特徴】

Redis / Memcached のフルマネージドサービス
  → 自分で Redis を EC2 や GCE に立てる必要なし

マイクロ秒レベルのレスポンス:
  通常の DB(ミリ秒)の 1/1000 の速さ

【用途】
  ├── セッション管理(ユーザーのログイン状態)
  ├── キャッシュ(頻繁にアクセスされるDBクエリ結果)
  ├── リーダーボード(ゲームのランキング)
  ├── レート制限(API の呼び出し回数制限)
  └── Pub/Sub パターン(Redis の Pub/Sub 機能)

【Memcached vs Redis の選択】
  Memcached: シンプルなキャッシュ・マルチスレッド
  Redis: データ永続化・複雑なデータ構造(Set, SortedSet など)
         → ほとんどのケースで Redis を推奨
10.8BigQuery
【BigQuery の特徴】

サーバーレス・フルマネージドのデータウェアハウス
  → インフラ管理不要
  → 数秒で数TB のデータを分析

ストレージとコンピューティングの分離:
  ストレージ: 安価($0.02/GB/月)
  クエリ: 処理したデータ量に課金($5/TB)
  → 必要な時だけクエリを実行(コスト効率高い)

SQL で機械学習(BigQuery ML):
  CREATE MODEL でモデルをトレーニング
  → データサイエンティストが Python 不要で ML を実施

【ACE 試験での BigQuery の位置づけ】
  ├── Cloud Billing データのエクスポート先(監査・分析)
  ├── Cloud Logging のエクスポート先(長期ログ分析)
  └── データウェアハウス・BI の基盤
10.BPベストプラクティス: データベース選定
ベストプラクティス
ユースケース推奨サービス理由
WordPress・EC サイトCloud SQL (MySQL/PG)標準的な RDBMS で移行コスト低
グローバル金融システムCloud Spanner99.999% SLA・グローバル強整合性
PostgreSQL で高性能が必要AlloyDBPG 互換のまま4倍の性能
モバイルアプリのバックエンドFirestoreリアルタイム同期・サーバーレス
IoT・時系列データCloud Bigtableペタバイトスケール・ミリ秒レイテンシ
セッション・キャッシュMemorystore (Redis)マイクロ秒レスポンス
コスト分析・BIBigQueryサーバーレスDWH・SQL分析
Oracle の移行Bare Metal SolutionOracle ライセンス・低レイテンシHW
11

VPC ネットワーク設計

グローバルVPC・カスタムモードサブネット・タグベースFWルール — ネットワーク基盤の設計ガイド

11.1Google Cloud VPC の特徴
【他のクラウドとの違い】

他社クラウド(一般的):        Google Cloud VPC:
  リージョンごとに VPC          1つの VPC がグローバルに存在
  asia-northeast1 VPC
  us-central1 VPC        →     グローバル VPC
                                 ├── サブネット(東京)
                                 ├── サブネット(米国)
                                 └── サブネット(欧州)

→ マルチリージョン展開でもVPCを1つで管理できる!
→ リージョン間の通信はGoogle のプライベートネットワーク(高速・低コスト)
11.2サブネット設計
【自動モード VPC】
  → サブネットが各リージョンに自動作成(10.128.0.0/9)
  → お試し・開発用途に便利
  → 本番環境には不推奨(IP 範囲が固定)

【カスタムモード VPC(本番環境推奨)】
  → 自分でサブネットとIPレンジを定義
  → 将来の VPC Peering で重複しないよう計画的に設計

サブネットの IP 範囲設計例

【企業全体の IP 設計例】

10.0.0.0/8 を会社全体に割り当て

├── 10.1.0.0/16  → 東京リージョン(asia-northeast1)
│   ├── 10.1.1.0/24  → 東京 Web 層(asia-northeast1-a)
│   ├── 10.1.2.0/24  → 東京 App 層(asia-northeast1-b)
│   └── 10.1.3.0/24  → 東京 DB 層(asia-northeast1-c)
│
├── 10.2.0.0/16  → 大阪リージョン(asia-northeast2)
│   └── ...
│
└── 10.3.0.0/16  → オンプレミス(VPN/Interconnect で接続)
11.3ファイアウォールルールの設計
ファイアウォールルールは VPC レベルで管理(ハードウェアでなくソフトウェア)

方向:
  ├── INGRESS(入ってくるトラフィック)
  └── EGRESS(出ていくトラフィック)

対象の指定方法:
  ├── ネットワークタグ(例: tag=web-server)← 推奨
  ├── サービスアカウント
  └── IP レンジ(例: 0.0.0.0/0 = すべて)

優先度(Priority): 数値が小さいほど優先(0〜65534)
  デフォルト拒否ルール: Priority=65535(最低優先度)

ベストプラクティス: タグベースのファイアウォール

# Web サーバータグを持つ VM に HTTP/HTTPS を許可
gcloud compute firewall-rules create allow-web \
  --network=my-vpc \
  --direction=INGRESS \
  --priority=1000 \
  --action=ALLOW \
  --rules=tcp:80,tcp:443 \
  --target-tags=web-server \
  --source-ranges=0.0.0.0/0

# App サーバーはロードバランサからのみアクセスを許可
gcloud compute firewall-rules create allow-app-from-lb \
  --network=my-vpc \
  --direction=INGRESS \
  --priority=1000 \
  --action=ALLOW \
  --rules=tcp:8080 \
  --target-tags=app-server \
  --source-tags=load-balancer
12

Shared VPC と VPC Peering

ホストプロジェクト・サービスプロジェクト・推移的接続の制約 — マルチプロジェクトネットワーク設計

12.1Shared VPC(共有 VPC)
【Shared VPC がない場合の問題】

各チームが独自の VPC を持つ:
  Project A(フロントエンドチーム): 10.0.0.0/16
  Project B(バックエンドチーム): 10.1.0.0/16
  Project C(DBチーム): 10.2.0.0/16

  問題: 各チームが自分でネットワークを管理 → 設定のばらつき
       セキュリティポリシーの一貫性がない
       ネットワーク管理の責任が分散

【Shared VPC による解決】

ホストプロジェクト(ネットワーク管理チームが所有)
  └── VPC(統一されたサブネット・ファイアウォール)

サービスプロジェクト A(フロントエンドチーム)
  └── アプリ → ホストプロジェクトの VPC のサブネットを利用

サービスプロジェクト B(バックエンドチーム)
  └── アプリ → ホストプロジェクトの VPC のサブネットを利用

メリット:
  ✓ ネットワーク設定を一元管理(セキュリティポリシーの統一)
  ✓ ネットワーク管理とアプリ開発の職務分掌
  ✓ 各チームのコストは独立したプロジェクトで管理

Shared VPC の設定

# ホストプロジェクトを指定
gcloud compute shared-vpc enable HOST_PROJECT_ID

# サービスプロジェクトをホストに紐付け
gcloud compute shared-vpc associated-projects add SERVICE_PROJECT_ID \
  --host-project=HOST_PROJECT_ID

# Network User ロールをサービスプロジェクトのチームに付与
# (サブネットの使用権限のみ、VPC の設定変更は不可)
gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
  --member="group:backend-team@example.com" \
  --role="roles/compute.networkUser" \
  --condition="resource.name == projects/HOST_PROJECT_ID/regions/asia-northeast1/subnetworks/backend-subnet"
12.2VPC Network Peering
VPC A(Project 1)  ← Peering →  VPC B(Project 2)

・内部 IP でプライベートに通信
・Google のプライベートネットワークを使用(高速)
・インターネットを経由しない
・トラフィックが GCP を出ない

使用場面:
  ├── 異なるプロジェクト間の内部通信
  └── 異なる組織の VPC 間の接続

⚠️ VPC Peering の重要な制約

【制約 1: 推移的(Transitive)ではない】

VPC A ── Peering ── VPC B ── Peering ── VPC C

A と B は通信できる ✅
B と C は通信できる ✅
A と C は通信できない ❌ ← これが最重要!

→ A と C を通信させるには、A-C 間の Peering を別途作成する必要あり

【制約 2: IP アドレスの重複不可】

VPC A: 10.0.0.0/16
VPC B: 10.0.0.0/16 ← 重複!Peering 不可!

→ Peering する VPC 間は IP 範囲が重複してはいけない
→ カスタムモード VPC でIP を計画的に設計することが重要
12.3Shared VPC vs VPC Peering の使い分け
判断基準Shared VPCVPC Peering
管理の一元化✅(ホストプロジェクトで集中管理)❌(各VPCで個別管理)
同一組織内
異なる組織間
スケール多数のプロジェクトに対応1対1の接続
設定の複雑さ中程度低い
13

Cloud NAT と Cloud DNS

外部IP不要のアウトバウンド接続・ハイブリッドDNS解決 — セキュアなネットワーク出口設計

13.1Cloud NAT
【なぜ Cloud NAT が必要か?】

セキュリティのベストプラクティス:
  VM に外部 IP を割り当てない
  → でも VM からインターネット(パッケージDL等)へのアクセスが必要

解決策: Cloud NAT

外部IP なし の VM
    ↓
Cloud NAT(送信元 IP を変換)
    ↓
インターネット(apt-get install, etc.)

VM の外部 IP = Cloud NAT の IP(共有)
→ 個々の VM の IP が外部に直接露出しない

Cloud NAT の設定

# Cloud Router を作成(Cloud NAT の前提条件)
gcloud compute routers create my-router \
  --network=my-vpc \
  --region=asia-northeast1

# Cloud NAT を作成
gcloud compute routers nats create my-nat \
  --router=my-router \
  --region=asia-northeast1 \
  --nat-all-subnet-ip-ranges \
  --auto-allocate-nat-external-ips

Cloud NAT のポート枯渇問題

【ポート枯渇とは?】

Cloud NAT は送信元 IP:ポート でセッションを識別
各 VM に割り当てられるポート数には上限がある

VM が同時接続数の上限を超えると:
  → 新しい接続が確立できない
  → "Connection refused" エラー

【監視コマンド(MQL クエリ)】
fetch nat_gateway
| metric 'compute.googleapis.com/nat/port_usage'
| align mean_aligner()
| every 1m

【対策】
  ├── ポート数を手動増加(--min-ports-per-vm)
  ├── 静的 NAT IP を追加
  └── コネクションプールの最適化(アプリ側)
ベストプラクティス: Cloud NAT
  • すべての VM に外部 IP を割り当てない(Cloud NAT でアウトバウンドを確保)
  • ポート使用率を Cloud Monitoring で継続監視
  • --min-ports-per-vm を接続数に応じて適切に設定
13.2Cloud DNS

ハイブリッド環境でのDNS解決

【シナリオ: オンプレミス + Google Cloud のハイブリッド構成】

問題: 2つの環境でのDNS名前解決を統合したい

Cloud DNS のプライベートゾーン:
  gcp.internal → GCPリソースの名前解決

オンプレミスの DNS サーバー:
  corp.internal → オンプレミスリソースの名前解決

【解決策】

① オンプレ → GCP のプライベートゾーンを解決:
  Cloud DNS にインバウンドフォワーダーを設定
  オンプレの DNS が 169.254.169.254 に転送

② GCP → オンプレのDNSを解決:
  Cloud DNS に転送ゾーン(Forwarding Zone)を設定
  gcp で corp.internal クエリ → オンプレ DNS サーバーに転送
# 転送ゾーンを作成(GCP → オンプレの DNS を解決)
gcloud dns managed-zones create on-prem-forwarding \
  --dns-name=corp.internal. \
  --description="Forward to on-premises DNS" \
  --visibility=private \
  --networks=my-vpc \
  --forwarding-targets=10.0.0.53

# インバウンドポリシーを作成(オンプレ → GCP を解決)
gcloud dns policies create inbound-policy \
  --description="Inbound DNS forwarding" \
  --networks=my-vpc \
  --enable-inbound-forwarding
14

ロードバランサの選定と設定

ALB/NLB・URL マップ・Cloud Armor・コンプライアンス要件 — トラフィック分散の完全ガイド

14.1ロードバランサ選定フローチャート
どんなトラフィック?
├── HTTP/HTTPS
│   └── Application Load Balancer (L7)
│       ├── グローバル配信が必要 → Global External ALB (Premium Tier)
│       ├── リージョン内に限定 → Regional External ALB
│       └── VPC 内部のみ → Internal ALB
│
└── TCP/UDP/その他
    └── Network Load Balancer (L4)
        ├── SSL オフロード必要 → Proxy Network LB
        └── 送信元 IP 保持・UDP が必要 → Passthrough Network LB
            └── 内部通信のみ → Internal Passthrough NLB
14.2Application Load Balancer(L7)

Global External ALB(グローバル外部 ALB)

特徴:
  ├── Anycast IP(1つのIPで全世界にサービス提供)
  ├── ユーザーに最も近いエッジ PoP で SSL 終端
  ├── URL ベースのルーティング(/api/* → API バックエンド)
  ├── ヘッダーベースのルーティング
  ├── Cloud Armor(DDoS 防御)と統合
  └── Premium Tier ネットワーク使用(Google のバックボーン)

主なユースケース:
  ├── グローバルな Web サービス
  ├── 複数リージョンにバックエンドを分散
  └── セキュリティ要件の高い Web アプリ

URL マップによるルーティング

URL マップの例:

/ (デフォルト)→ フロントエンド MIG
/api/*         → API Cloud Run サービス
/static/*      → Cloud Storage バケット(静的コンテンツ)
/admin/*       → 管理者用バックエンド(特定 IP のみ Cloud Armor で制限)
# URL マップを作成
gcloud compute url-maps create my-url-map \
  --default-service=frontend-backend-service

# パスマッチャーを追加
gcloud compute url-maps add-path-matcher my-url-map \
  --path-matcher-name=api-matcher \
  --default-service=frontend-backend-service \
  --backend-service-path-rules=/api/*=api-backend-service,/static/*=storage-backend
14.3Network Load Balancer(L4)
Proxy Network LB(プロキシ型):
  クライアント ─── 接続終端 ─── Cloud LB ─── 新しい接続 ─── バックエンド

  ・LB でTCP接続を終端
  ・SSL オフロードが可能
  ・クライアントの送信元IPが失われる(X-Forwarded-For ヘッダーで補完)

Passthrough Network LB(パススルー型):
  クライアント ──────────────── バックエンド(直接)
              ↑ パケットをそのまま転送

  ・クライアントの送信元IPをそのままバックエンドに転送
  ・TCP/UDP/ESP/GRE/ICMP に対応
  ・バックエンドが直接クライアントに応答(DSR: Direct Server Return)

使い分け:
  送信元IP が必要(ログ記録・地域制限など)→ Passthrough
  SSL オフロードが必要 → Proxy
14.4コンプライアンス要件とロードバランサの選択
試験頻出

データ主権・コンプライアンス要件がある場合

【コンプライアンス要件がある場合】

「すべてのトラフィックを日本国内に留める必要がある」
「SSL/TLS 終端は必ず東京リージョンで行わなければならない」

→ グローバルスコープの ALB は使えない!
  グローバル ALB はエッジで SSL 終端するため
  海外の PoP でも処理される可能性がある

→ 必ず「リージョナル」ロードバランサを選択
  Regional External ALB または
  Regional Internal ALB
14.5Cloud Armor(DDoS 防御)
【Cloud Armor の主な機能】

DDoS 防御:
  → アプリケーション層(L7)の攻撃を自動軽減

WAF(Web Application Firewall):
  → SQLインジェクション・XSS などを検出・ブロック

カスタムルール:
  → 特定 IP からのブロック
  → 地理情報ベースのアクセス制御

レート制限:
  → 1つの IP から大量リクエストをブロック
# Cloud Armor ポリシーを作成して ALB に適用
gcloud compute security-policies create my-security-policy \
  --description="WAF and DDoS protection"

# 日本以外からのアクセスをブロック
gcloud compute security-policies rules create 1000 \
  --security-policy=my-security-policy \
  --expression="origin.region_code != 'JP'" \
  --action=deny-403

# ALB バックエンドサービスにポリシーを適用
gcloud compute backend-services update my-backend-service \
  --security-policy=my-security-policy \
  --global
14.BPベストプラクティス: ロードバランサ
ベストプラクティス
#ベストプラクティス理由
1本番 Web アプリには Cloud Armor を必ず設定DDoS・WAF 保護
2コンプライアンス要件がある場合はリージョナル LB を選択データの地理的制限
3バックエンドサービスにヘルスチェックを設定異常バックエンドへのルーティング防止
4グローバル ALB は Premium Tier ネットワークで使用Standard Tier では真のグローバル配信にならない
5送信元 IP が必要なら Passthrough NLB を選択Proxy 型は送信元 IP が失われる
15

Infrastructure as Code (Terraform)

State管理・リモートバックエンド・CI/CD統合・GitOps — IaC の完全ガイド

15.1なぜ IaC が重要か?
【手動でコンソール操作する問題】

  ├── 再現性がない(「あの設定どうやったっけ?」)
  ├── 環境間の差異(dev と prod の設定が微妙に違う)
  ├── 監査ができない(「誰がいつ何を変えたか?」)
  └── ヒューマンエラー(クリック間違い)

【Terraform(IaC)による解決】

  ├── コードとして定義 → 完全に再現可能
  ├── Git で管理 → 変更履歴が完全に記録される
  ├── PR レビュー → 本番適用前に人間がチェック
  └── plan → apply の 2 ステップで安全に適用
15.2Terraform の基本構造
# main.tf - リソースの定義
resource "google_compute_instance" "web_server" {
  name         = "web-server-prod"
  machine_type = "n2-standard-4"
  zone         = "asia-northeast1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
      size  = 50
    }
  }

  network_interface {
    network    = "my-vpc"
    subnetwork = "web-subnet"
    # access_config なし = 外部IP なし(推奨)
  }

  metadata = {
    enable-oslogin = "TRUE"
  }

  tags = ["web-server"]
}

# variables.tf - 変数の定義
variable "project_id" {
  description = "Google Cloud プロジェクト ID"
  type        = string
}

variable "region" {
  description = "デプロイするリージョン"
  type        = string
  default     = "asia-northeast1"
}

# outputs.tf - 出力値の定義
output "instance_internal_ip" {
  description = "VM の内部 IP"
  value       = google_compute_instance.web_server.network_interface[0].network_ip
}
15.3State ファイルの管理(最重要)

Terraform は「terraform.tfstate」というファイルで「コードと実際のGCPリソースの対応関係」を管理します。

terraform.tfstate の中身(例):
{
  "resources": [
    {
      "type": "google_compute_instance",
      "name": "web_server",
      "instances": [
        {
          "attributes": {
            "id": "projects/my-proj/zones/asia-northeast1-a/instances/web-server-prod",
            "machine_type": "n2-standard-4",
            ...
          }
        }
      ]
    }
  ]
}

もしこのファイルが壊れると:
  Terraform がリソースを「存在しない」と思い込み
  → 既存リソースを削除して再作成しようとする!
  → 本番環境への大規模障害!
絶対禁止

terraform.tfstate を手動で編集してはいけません!

ローカル State の問題点

【ローカル State の問題】

開発者 A が terraform apply
  → ローカルの tfstate が更新

開発者 B が同時に terraform apply(古い tfstate を持っている)
  → State の競合!
  → リソースが重複作成 or 意図しない削除!

→ チーム開発でのローカル State は使用禁止

リモートバックエンドの設定(Cloud Storage)

# backend.tf
terraform {
  backend "gcs" {
    bucket  = "my-terraform-state-bucket"
    prefix  = "terraform/state"
  }
}
# State 用の Cloud Storage バケットを作成
gcloud storage buckets create gs://my-terraform-state-bucket \
  --location=asia-northeast1 \
  --uniform-bucket-level-access

# バージョニングを有効化(State の変更履歴を保存)
gcloud storage buckets update gs://my-terraform-state-bucket \
  --versioning

# State ロックは GCS バックエンドで自動的に有効化される
# → 並行 apply を自動防止!
15.4Terraform の安全なデプロイフロー
【標準的なデプロイフロー】

Step 1: コードを変更してコミット
  ↓
Step 2: terraform plan でプレビュー
  $ terraform plan -out=tfplan

  出力例:
  Plan: 1 to add, 2 to change, 0 to destroy.

  + google_compute_instance.new_vm       ← 追加される
  ~ google_compute_instance.web_server   ← 変更される

  → 変更内容を確認してレビュー

Step 3: プランファイルを使って適用
  $ terraform apply tfplan

  → plan 時と同じ内容のみ適用(サプライズなし!)

【重要】プランファイルの注意点:
  プランファイルは実行環境(パスなど)に依存するため
  環境間を移動して使うことはできない
15.5既存リソースの Import

従来の方法(Terraform < 1.5)

# Console で手動作成した VM を Terraform 管理下に置く
terraform import google_compute_instance.my_vm \
  projects/PROJECT/zones/asia-northeast1-a/instances/my-vm

モダンな方法(Terraform >= 1.5 推奨)

# main.tf に import ブロックを追加
import {
  to = google_compute_instance.my_vm
  id = "projects/PROJECT/zones/asia-northeast1-a/instances/my-vm"
}

resource "google_compute_instance" "my_vm" {
  name         = "my-vm"
  # ... リソースの設定
}
# import を含む plan を実行
terraform plan  # import ブロックを検出して取り込み計画を表示

# 問題なければ apply
terraform apply
15.6CI/CD パイプラインとの統合(GitOps)
リポジトリ構造:

my-infra/
├── environments/
│   ├── dev/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   └── terraform.tfvars
│   │
│   └── prod/
│       ├── main.tf
│       ├── variables.tf
│       └── terraform.tfvars
│
└── modules/
    ├── vpc/
    ├── gke/
    └── cloud-sql/

【ブランチ戦略】
  feature/xxx → dev ブランチへの PR
                  ↓ マージ
              dev ブランチ → dev 環境に自動 apply
                  ↓ 承認
              main ブランチへの PR → レビュー
                  ↓ マージ
              main ブランチ → prod 環境に自動 apply

Cloud Build による CI/CD

# cloudbuild.yaml
steps:
  # Terraform の初期化
  - name: 'hashicorp/terraform:1.5'
    entrypoint: 'terraform'
    args: ['init', '-backend-config=bucket=my-state-bucket']
    dir: 'environments/${_ENV}'

  # プランの実行
  - name: 'hashicorp/terraform:1.5'
    entrypoint: 'terraform'
    args: ['plan', '-out=tfplan']
    dir: 'environments/${_ENV}'

  # 適用(main ブランチのみ)
  - name: 'hashicorp/terraform:1.5'
    entrypoint: 'terraform'
    args: ['apply', '-auto-approve', 'tfplan']
    dir: 'environments/${_ENV}'

substitutions:
  _ENV: 'dev'

# Cloud Build のサービスアカウントで実行(JSON キー不要!)
serviceAccount: 'projects/PROJECT/serviceAccounts/terraform-sa@PROJECT.iam.gserviceaccount.com'
15.BPベストプラクティス: Terraform
ベストプラクティス
#ベストプラクティス理由
1State は Cloud Storage リモートバックエンドに保存競合・紛失防止
2State バケットはバージョニングを有効化誤操作からの復元
3terraform plan -out=tfplan を必ず実施意図しない変更の防止
4State ファイルを手動編集禁止設定破損リスク
5CI/CD 認証は Workload Identity/ADC を使用(JSON キー禁止)キー漏洩防止
6環境ごとに別ディレクトリ・別 State バケットを使用誤った環境への適用防止
7terraform import ブロックで既存リソースを管理下へコンソールで作ったリソースをIaC管理に移行
10.ADVAlloyDB アーキテクチャ深掘り: コンピュート/ストレージ分離(補足)
【AlloyDB の革新的アーキテクチャ】

従来の PostgreSQL:
  プライマリ DB が WAL(Write-Ahead Logging)を処理しながら
  ページをディスクに書き込む → I/O 負荷が高い
  「Torn Pages(不完全なページ書き込み)」問題のリスクあり

AlloyDB のコンピュート/ストレージ分離:
  WAL レコードのみをインテリジェントな分散ストレージ層
  (Log Processing Service: LPS)に送信

  LPS が担当:
  ├── WAL の解析・適用
  ├── ページの更新(コンピュート層に代わって)
  └── ネットワーク効率の最大化

  → プライマリ DB は I/O の重い作業から解放
  → Torn Pages 問題を根本から解決
  → リードレプリカを極めて低遅延でスケールアウト可能
【Hyperdisk(次世代ブロックストレージ)との使い分け】

Persistent Disk(従来):
  容量・スループット・IOPS が連動して決まる

Hyperdisk(新世代):
  容量 と スループット/IOPS を完全に独立してプロビジョニング
  → データ分析: 大容量・高スループット を低コストで実現
  → 高I/O DB: 大容量 は不要だが高IOPSが必要、という場合に最適
  → 動的な変更が可能(再起動不要)

用途別推奨:
  ├── 一般的な VM ワークロード → Balanced Persistent Disk
  ├── 高I/O データベース → Hyperdisk Extreme
  ├── データ分析・高スループット → Hyperdisk Throughput
  └── キャッシュ・一時データ → Local SSD(VM停止でデータ消滅)
参考: cloud.google.com/blog/products/databases/alloydb-for-postgresql-intelligent-scalable-storage
16

試験対策まとめ

頻出パターン・重要用語チェックリスト・推奨リソース — ACE Domain 2 完全攻略ガイド

16.1試験頻出の選択問題パターン

パターン①: コンピューティングサービスの選択

【問題文の例】
「画像処理のバッチジョブを実行したい。
 コストを最小化しつつ、停止されても問題ない。
 どのサービスを使うべきか?」

正解: Spot VM + MIG
理由:
  ・バッチジョブ → 停止されても問題ない
  ・コスト最小化 → Spot VM(最大91%割引)
  ・停止後の自動再作成 → MIG と組み合わせ

【問題文の例】
「HTTP API を提供したい。
 アイドル時間はコストゼロにしたい。
 どのサービスを使うべきか?」

正解: Cloud Run
理由:
  ・HTTP API → Cloud Run
  ・アイドル時コストゼロ → ゼロスケール可能

パターン②: データベースの選択

【問題文の例】
「グローバルに展開する金融システムで
 強い整合性が必要。99.999% の可用性が必要。
 どのDBを使うべきか?」

正解: Cloud Spanner
理由:
  ・グローバル分散 → Spanner
  ・強整合性 → Spanner(ACID)
  ・99.999% SLA → Spanner のみが提供

【問題文の例】
「IoT デバイスから毎秒100万件のデータが来る。
 低レイテンシでの書き込みが必要。
 どのDBを使うべきか?」

正解: Cloud Bigtable
理由:
  ・超大規模・高スループット → Bigtable
  ・時系列データ → Bigtable のユースケース

パターン③: ネットワーク設計

【問題文の例】
「複数のチームが同じ VPC ネットワークを使いたい。
 ネットワーク管理は1チームが担当し、
 各チームはアプリのみ管理したい。」

正解: Shared VPC
理由:
  ・ネットワーク管理の集中化 → ホストプロジェクト
  ・各チームがアプリを管理 → サービスプロジェクト

【問題文の例】
「VPC A が VPC B と Peering。
 VPC B が VPC C と Peering。
 A から C に直接通信できるか?」

正解: できない(Peering は推移的でない)
16.2Domain 2 重要用語チェックリスト

コンピューティング

ベストプラクティス
  • Spot VM は最大 91% 割引で、いつでもプリエンプトされる
  • Spot VM はバッチ・ML・レンダリングに最適(Web サーバーは NG)
  • GKE Autopilot は Pod リソース単位の課金(アイドルコストなし)
  • GKE Standard は特権コンテナや DaemonSet が必要な場合に選択
  • Workload Identity で GKE から GCP API にアクセス(JSON キー禁止)
  • Cloud Run はゼロスケール可能なサーバーレスコンテナ

ストレージ・データベース

ベストプラクティス
  • Cloud Storage の 4 クラス(Standard/Nearline/Coldline/Archive)の使い分け
  • Nearline=30日、Coldline=90日、Archive=365日 の最小保存期間
  • OLM(Object Lifecycle Management)でストレージクラスを自動移行
  • 署名付き URL の最大有効期間は 7日間
  • Cloud SQL は標準 RDBMS、Spanner はグローバル分散(99.999%)
  • Bigtable は ペタバイトスケール・時系列データ
  • Firestore はリアルタイム同期・モバイル/IoT バックエンド

ネットワーク

ベストプラクティス
  • Google Cloud VPC は グローバル(リージョンをまたぐ)
  • Shared VPC: ホストプロジェクトがネットワークを集中管理
  • VPC Peering は 推移的でない(A-B-C でも A-C は通信不可)
  • Cloud NAT: 外部 IP なし VM のインターネットアウトバウンド
  • Cloud DNS 転送ゾーン: GCP → オンプレの DNS 解決
  • Global ALB はグローバル配信、Regional LB はリージョン内限定
  • コンプライアンス要件(データ主権)には必ずリージョナル LB

Terraform

ベストプラクティス
  • State ファイルは Cloud Storage のリモートバックエンドに保存
  • State ファイルを 手動編集禁止
  • terraform plan -out=tfplanterraform apply tfplan の順番
  • CI/CD の認証は JSON キーではなく Workload Identity/ADC
  • Terraform 1.5以降は import ブロックで既存リソースを取り込み
16.3推奨学習リソース(Domain 2)
リソースURL
ACE 試験公式ページcloud.google.com/learn/certification/cloud-engineer
Compute Engine ドキュメントcloud.google.com/compute/docs
OS Login 設定cloud.google.com/compute/docs/oslogin/set-up-oslogin
Spot VM の作成と使用cloud.google.com/compute/docs/instances/create-use-spot
GKE Autopilot セキュリティcloud.google.com/kubernetes-engine/docs/concepts/autopilot-security
GKE Autopilot vs Standardcloud.google.com/kubernetes-engine/docs/resources/autopilot-standard-feature-comparison
Cloud Run ネットワーキングcloud.google.com/run/docs/configuring/networking-best-practices
Cloud Storage ベストプラクティスcloud.google.com/storage/docs/best-practices
データベース選定ガイドcloud.google.com/blog/topics/developers-practitioners/your-google-cloud-database-options-explained
VPC 設計ベストプラクティスcloud.google.com/architecture/best-practices-vpc-design
Shared VPCcloud.google.com/vpc/docs/shared-vpc
Cloud NAT のベストプラクティスcloud.google.com/blog/products/networking/6-best-practices-for-running-cloud-nat
ロードバランサ選定cloud.google.com/load-balancing/docs/choosing-load-balancer
Terraform ベストプラクティスcloud.google.com/docs/terraform/best-practices/operations
16.ADVDomain 2 学習の最終アドバイス
最終アドバイス

Domain 2 は ACE 試験の中で最大配点(≈21%)です。以下の点を徹底的に習得してください。

ベストプラクティス
  • ① サービス選定の「理由」を説明できるようにする
    「このサービスを選ぶのはなぜか?」を自分の言葉で説明できること
  • ② アンチパターンと推奨パターンをセットで覚える
    「❌ JSON キー → ✅ Workload Identity」のように対比で理解する
  • ③ 実際に手を動かす(ハンズオン)
    Cloud Shell や Google Cloud Skills Boost で実際に触ることが最高の学習法
17

参考資料(References)

このドメインの学習にあたって参考にした公式ドキュメントおよび技術リソース

17.1公式ドキュメント(Official Documentation)
Compute Engine の公式ドキュメント
OS Login の設定手順
GKE Autopilot のセキュリティ機能
GKE Autopilot vs Standard の機能比較
Cloud Run ネットワーキングのベストプラクティス
Cloud Storage のベストプラクティス
データベース選定の完全ガイド
VPC 設計のベストプラクティスと参考アーキテクチャ
Shared VPC の概要と設定
Cloud NAT 運用のベストプラクティス
Cloud DNS のベストプラクティス
ロードバランサ選定の完全ガイド
Terraform 運用のベストプラクティス
クラウドコストの見積もりツール
BigQuery コスト管理のベストプラクティス
Compute Engine リージョン選択のベストプラクティス
Compute Engine デプロイ戦略の選択
Routes-based GKE クラスタの作成
GKE ネットワーキングのベストプラクティス
GKE Workload Identity による認証
サーバーレスサービスの選択ガイド
Cloud Run 開発の実践ヒント
Cloud Functions のベストプラクティス
データ分析サービスの選定決定木
ストレージ戦略設計アドバイザー
ストレージオプションの比較と選択
AlloyDB のインテリジェントストレージ解説
プライベートサービス接続の機能とメリット
Terraform による IaC の概要
3層 Web アプリのジャンプスタートソリューション
17.2技術解説・コミュニティリソース(Tech Guides & Community)
Reddit での ACE 試験対策相談スレッド
GCP 料金計算ツールの完全ガイド
GKE ネットワーククラスタの詳解
GKE 本番環境デプロイ3つの鍵
ACE 試験の IAM コンセプトマスターガイド
サーバーレスサービスの完全選定ガイド
Google Cloud 料金モデル詳解 2
Spot VM のユースケースとベストプラクティス
ワークロード要件に応じた GKE モードの選択