Contents
1. アイドルリソース検出と自動削除
背景
- Compute Engine の 停止中インスタンス、未使用ディスク、未割り当ての外部 IP は、リソースが残っているだけで課金対象になります。
- 手作業で削除すると抜け漏れが起きやすく、継続的なコスト増につながります。
公式機能 ― Recommender の IdleResource 系推奨
Google が提供する Recommender API に google.compute.instance.IdleResourceRecommender(インスタンス)と google.compute.disk.IdleResourceRecommender(ディスク)があり、過去 30 日間の利用実績から「アイドル」と判定されたリソースを自動でレコメンドします。
- ドキュメント: https://cloud.google.com/recommender/docs/compute/instance-idle
- 現在は GA(General Availability)で、2024 年 3 月時点の API バージョン v1 が利用可能です。
主な利点
| 項目 | 内容 |
|---|---|
| 自動判定基準 | CPU 使用率 < 5 % かつネットワーク I/O ≈ 0 のインスタンスを対象 |
| 一括適用 API | recommendations.apply エンドポイントで「停止」または「削除」を自動実行 |
| スケジュール化 | Cloud Scheduler と組み合わせれば日次・週次のバッチ処理が可能 |
実装例:Cloud Scheduler + Cloud Functions で毎日自動適用
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# cloudscheduler.yaml (Terraform) resource "google_cloud_scheduler_job" "idle_cleanup" { name = "gcp-idle-resource-cleanup" description = "Idle VM / Disk cleanup via Recommender" schedule = "0 3 * * *" # 毎日 03:00 UTC に実行 time_zone = "Etc/UTC" http_target { uri = google_cloudfunctions_function.idle_cleanup.https_trigger_url http_method = "POST" oidc_token { service_account_email = google_service_account.recommender.email } } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# main.py(Cloud Functions) import os, json, subprocess def idle_cleanup(event, context): project = os.getenv("GCP_PROJECT") recommender = "google.compute.instance.IdleResourceRecommender" # 推奨取得 cmd_list = [ "gcloud", "recommender", "recommendations", "list", "--project", project, f"--recommender={recommender}", "--format=json" ] result = subprocess.check_output(cmd_list) recommendations = json.loads(result) for rec in recommendations: # 「停止」推奨のみ自動適用(安全策としてフィルタリング可) if "stop" in rec["description"].lower(): apply_cmd = [ "gcloud", "recommender", "recommendations", "apply", rec["name"], "--project", project ] subprocess.run(apply_cmd, check=True) |
ポイント:関数は最小権限のサービスアカウントで実行し、
roles/recommender.viewerとroles/compute.instanceAdmin.v1のみ付与すれば安全です。
手動確認フロー(推奨)
| ステップ | 操作内容 |
|---|---|
| 1️⃣ | Cloud Console → Recommender → Idle resources を開く |
| 2️⃣ | 推奨一覧を確認し、誤検知がないかチェック |
| 3️⃣ | 「適用」ボタンで即時停止/削除(または API 経由) |
2. Spot VM の安全な活用
なぜ Spot を選ぶのか
- 割引率:Spot はオンデマンド価格の 30 %〜80 %(リージョン・インスタンスタイプにより変動)で提供されています。公式ドキュメントは「最大 80 % 割引」と表記していますが、実際の割引率は
gcloud compute prices spot listコマンドや Pricing Calculator で確認してください。 - 利用シーン:バッチ処理、CI/CD ワーカー、データ分析ジョブなど「途中停止しても再開可能」なワークロードに最適。
参考: https://cloud.google.com/compute/docs/instances/preemptible
Spot VM の作成と自動スケーリング
|
1 2 3 4 5 6 7 8 9 10 |
gcloud compute instances create spot-worker \ --project=$PROJECT_ID \ --zone=asia-northeast1-a \ --machine-type=n2-standard-4 \ --provisioning-model=SPOT \ --maintenance-policy=TERMINATE \ --metadata=startup-script='#!/bin/bash apt-get update && apt-get install -y python3-pip # ジョブ取得ロジックは後述の Pub/Sub Pull に委譲' |
キューと組み合わせた耐障害設計
| コンポーネント | 役割 |
|---|---|
| Pub/Sub (Pull) | ワークロードをタスクとしてキューイング。Spot VM が停止しても未処理メッセージは残る |
| Cloud Scheduler | 定期的に gcloud compute instances create をトリガーし、必要数だけ Spot VM を起動 |
| Terraform (Instance Template + MIG) | テンプレート化でスケールアウト・インをコード管理 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
resource "google_compute_instance_template" "spot_tpl" { name = "spot-template" machine_type = "e2-medium" scheduling { on_host_maintenance = "TERMINATE" preemptible = true # 2024‑04 時点では SPOT と同義 } metadata_startup_script = <<-EOS #!/bin/bash apt-get update && apt-get install -y curl # Pull a message from Pub/Sub and process it EOS } |
ベストプラクティス:ジョブは必ず 冪等性(idempotent) を担保し、途中停止時に再実行できるように設計する。チェックポイントを Cloud Storage に書き出すと復旧が容易です。
コストシミュレーション例
| リージョン | n2-standard-4 のオンデマンド単価 (USD/h) | Spot 想定割引率 | 1,000 h あたりの想定コスト |
|---|---|---|---|
| us-central1 | 0.085 | 70 % | $25.5 |
| asia-northeast1 | 0.095 | 55 % | $42.75 |
実際の価格は
gcloud compute prices spot list --machine-type=n2-standard-4 --zone=asia-northeast1-aで取得してください。
3. CUD と SUD の組み合わせ最適化
基本概念
| 用語 | 説明 |
|---|---|
| Committed Use Discount (CUD) | 1 年または 3 年の使用量を事前に約束し、最大 70 %(CPU・GPU)/ 55 %(ストレージ)程度の割引が適用される。 |
| Sustained Use Discount (SUD) | 同一月内でリソース利用率が 60 %以上になると自動的に段階的割引(最大 30 %)が付く。CUD と併用可能です。 |
※割引率はサービス・リージョンごとに異なるため、Pricing Calculator の「Committed Use」タブでシミュレートしてください。
シミュレーションワークフロー
- 使用実績取得
bash
bq query --use_legacy_sql=false \
'SELECT SUM(cpu_seconds)/3600 AS hrs, region FROMmy-billing.project_id.gcp_billing_export_v1_*WHERE service.id="6F81-5844-456A" GROUP BY region;' - CUD シナリオ作成(1 年・3 年)
- 予測使用率が 70 % 超の場合は CUD が最もコスト効率的。
-
変動が大きい領域は SUD のみで様子を見る。
-
総合比較表作成(BigQuery + Spreadsheet)
| リージョン | 月間使用時間 (h) | オンデマンド単価 (USD/h) | 推奨 CUD 期間 | 想定 CUD 割引率 | SUD 適用可否 |
|---|---|---|---|---|---|
| us-central1 | 800 | 0.047 | 1 年 | 65 % | ○(60 %以上) |
| asia-northeast1 | 500 | 0.053 | なし | – | ✕ |
- 実装
gcloud compute commitments createコマンドで CUD を購入。gcloud beta billing budgets create --budget-amount=...で予算上限を設定し、CUD 購入後の変化をモニタリング。
|
1 2 3 4 5 6 7 |
gcloud compute commitments create \ --project=$PROJECT_ID \ --region=us-central1 \ --plan=1-year \ --machine-type=n2-standard-4 \ --commitment=0.05 # 例:毎時 0.05 インスタンス分をコミット |
注意点とリスク
| 項目 | リスク | 対策 |
|---|---|---|
| 過剰コミット | 使用量が予測より下回ると、未使用分は無償化されない | コミット前に 3‑6 ヶ月の実績を平均し、余裕を持たせた上で購入 |
| リージョン変更 | CUD はリージョン単位で固定。別リージョンへ移行すると割引が失われる | 複数リージョンに跨るワークロードは「マルチリージョン」CUD(利用可能な場合)を検討 |
| サービス更新 | 新規サービス追加時に CUD が自動適用されない | 定期的に Billing Export をレビューし、未割引リソースを洗い出す |
4. Cloud Run の課金最小化
最新ドキュメント(2024‑04)でのポイント
| 項目 | 内容 |
|---|---|
| CPU 割当 | 最小単位は 0.125 vCPU(従来 0.25 vCPU の半分)。リクエスト処理中のみ課金。 |
| メモリ最小化 | 256Mi から設定可能。 |
| アイドル時課金 | --min-instances=0 にすれば、インスタンスが存在しない状態で課金は発生しません(ただし VPC Connector 等の一部リソースは例外)。 |
| Autoscaling 指標 | autoscaling.knative.dev/target は CPU 使用率だけでなく「同時リクエスト数」でも調整可能。 |
公式ドキュメント: https://cloud.google.com/run/docs/configuring/autoscaling
実装例:最小コスト構成
|
1 2 3 4 5 6 7 8 9 10 |
gcloud run deploy api-service \ --image=gcr.io/$PROJECT_ID/api-image:latest \ --region=asia-northeast1 \ --cpu=0.125 \ --memory=256Mi \ --min-instances=0 \ --max-instances=200 \ --concurrency=80 \ --timeout=300s |
スケーリングポリシーのカスタマイズ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: api-service annotations: autoscaling.knative.dev/target: "60" # CPU% 目標 autoscaling.knative.dev/minScale: "0" autoscaling.knative.dev/maxScale: "200" spec: template: spec: containers: - image: gcr.io/$PROJECT_ID/api-image resources: limits: cpu: "0.25" memory: "512Mi" |
- target=60:CPU 使用率が 60 % を超えるとインスタンス数を増やす。
- minScale=0:アイドル時はゼロにして課金なし。
トラフィックパターン別チューニング例
| 時間帯 | min-instances |
max-instances |
補足 |
|---|---|---|---|
| 平日 09:00‑18:00(ピーク) | 2 | 150 | 高速レスポンス確保 |
| 夜間・週末 | 0 | 50 | コスト削減 |
| キャンペーン前後の急増期 | 5 | 300 | バースト対応 |
実装ヒント:gcloud scheduler jobs create http と Cloud Functions を組み合わせ、時間帯ごとに run services update-traffic API を呼び出すことで自動的にスケール設定を切り替えられます。
5. Cost Management ツールとタグ付けで部門別可視化
5‑1. Billing Export → BigQuery
| 手順 | 操作 |
|---|---|
| 1 | Cloud Console の Billing → Export → BigQuery export を有効化し、データセット billing_export を作成 |
| 2 | デフォルトテーブル gcp_billing_export_v1_* が日次で更新されることを確認 |
| 3 | 必要に応じてビューやマテリアライズド・ビューを作成し、部門別・サービス別の集計を行う |
部門別月次コストビュー(例)
|
1 2 3 4 5 6 7 8 9 |
CREATE OR REPLACE VIEW `billing_export.monthly_department_cost` AS SELECT EXTRACT(MONTH FROM usage_start_time) AS month, labels.department AS department, SUM(cost) AS total_usd FROM `my-project.billing_export.gcp_billing_export_v1_*` WHERE usage_start_time >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) GROUP BY month, department; |
- ラベルはリソース作成時に必須化すると、抜け漏れが防げます(Terraform の
default_labelsが便利)。
5‑2. Budgets & Alerts
| 項目 | 推奨設定 |
|---|---|
| 予算額 | 部門ごとに月額上限を設定(例:$5,000) |
| アラート閾値 | 50 %(メール)・80 %(Slack)・100 %(SMS) |
| 通知先 | Cloud Pub/Sub → Cloud Functions で Slack / Teams に転送 |
|
1 2 3 4 5 6 |
gcloud billing budgets create \ --billing-account=$BILLING_ACCOUNT_ID \ --budget-amount=5000USD \ --threshold-rule-percentage=0.5,0.8,1.0 \ --notifications-channel=email@example.com,slack://my-channel |
5‑3. Recommender の活用例(未使用 IP アドレス)
|
1 2 3 4 5 |
gcloud recommender recommendations list \ --project=$PROJECT_ID \ --recommender=google.compute.address.IdleResourceRecommender \ --format="table(name, description)" |
- 未使用の外部 IP は $0.004/時間(US リージョン)と、放置すると年間で約 $35 の無駄になるため、
applyAPI で自動解放が推奨されます。
5‑4. ラベル戦略
| ラベルキー | 推奨値例 |
|---|---|
environment |
dev / staging / prod |
department |
marketing / sales / engineering |
cost_center |
CC1001 など社内コード |
Terraform の強制ラベリング例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
variable "default_labels" { type = map(string) default = { environment = "prod" department = "engineering" } } resource "google_compute_instance" "web" { name = "web-server" machine_type = "e2-medium" zone = "asia-northeast1-a" labels = var.default_labels } |
6. 実装チェックリスト & 優先度マトリクス
| # | カテゴリ | 実装項目 | 推奨タイミング | 優先度 (高/中/低) | 成果イメージ |
|---|---|---|---|---|---|
| 1 | アイドル検出 | Recommender の IdleResourceRecommender を Cloud Scheduler + Cloud Functions で自動適用 | 今すぐ(週次レビュー) | 高 | 未使用 VM/ディスクの課金ゼロ化 |
| 2 | Spot VM | Spot 用 Instance Template と MIG、Pub/Sub キューを構築 | 1 か月以内 | 中 | バッチコスト最大 70 % 削減 |
| 3 | CUD/SUD | 過去 6 ヶ月の使用実績から CUD シミュレーション → 購入手続き | 次の請求サイクル前 | 高 | 長期ワークロードで最大 70 % 割引 |
| 4 | Cloud Run | cpu=0.125, min-instances=0 設定へリファクタリング、Autoscaling アノテーション調整 |
今すぐ | 中 | アイドル時課金が実質ゼロに |
| 5 | Billing Export | BigQuery エクスポート設定 → 部門別ビュー作成 | 今すぐ | 高 | 可視化で無駄発見が容易に |
| 6 | Budgets & Alerts | 部門ごとの予算とアラートを Slack/メールへ連携 | 2 週間以内 | 中 | 超過リスクの早期検知 |
| 7 | タグ付け | Terraform に default_labels を組み込み、CI/CD パイプラインで強制化 |
1 か月以内 | 高 | 部門別レポートが自動生成可能 |
実装フローの例
1. インフラコード(IaC)にタグ付けと Recommender スケジュールを追加 → Git PR のレビューで承認。
2. Spot 用ジョブキューと MIG をデプロイ → テスト環境でジョブ失敗シナリオを検証。
3. CUD 購入計画を作成し、財務部門と合意 → 予算に組み込み、購入手続きを実行。
4. Cloud Run の最適化 → カナリアデプロイでパフォーマンス測定。
5. BigQuery ビューとダッシュボードを展開 → 経営層へ週次レポート提供。
まとめ
| 項目 | 主なアクション | 想定削減率(参考) |
|---|---|---|
| アイドルリソース自動除去 | Recommender + Scheduler/Functions 自動化 | 5 %〜15 % |
| Spot VM の活用 | キュー駆動の Preemptible / Spot インスタンス | 20 %〜70 % |
| CUD+SUD 最適化 | 使用実績ベースでコミット購入 | 10 %〜30 % |
| Cloud Run コスト最小化 | CPU/Memory の最小設定、min-instances=0 |
5 %〜12 % |
| 可視化・予算管理 | Billing Export → BigQuery、Budgets & Alerts、ラベリング | 無駄の早期発見で更なる削減が可能 |
次にすべきこと:本稿のチェックリストを元に、まずは「アイドルリソース自動除去」と「Billing Export の有効化」から着手し、1 か月以内に可視化基盤を整える。その後、Spot VM と CUD の導入計画を並行して進めると、最短で 10 %〜30 % のコスト削減が期待できます。
本ガイドは 2024‑04 時点の公式情報に基づいています。Google Cloud のサービス内容や料金体系は頻繁に更新されますので、実装前に必ず最新ドキュメントをご確認ください。