クラウドの利用料金が想定以上に膨らんでいた――こうした経験は、GCPに限らずクラウドサービスを利用する多くの企業が直面する課題です。
従量課金のクラウドは、適切に管理しないとコストが際限なく増加します。この記事では、GCPのコスト管理に必要な予算設定、請求アラート、コスト分析の方法から、実践的な費用削減テクニックまで、IT担当者・エンジニアが押さえるべきポイントを詳しく解説します。
GCPのコスト構造を理解する
費用を最適化するには、まずGCPの料金体系を正しく理解することが重要です。
GCPの主要な課金要素
GCPのコストは、主に以下の要素で構成されます。
1. コンピューティング
Compute Engine(VM)、Cloud Run、Cloud Functions、GKEなどの実行環境にかかる費用です。CPU、メモリ、実行時間に基づいて課金されます。多くの企業で最も大きな割合を占めるコスト要素です。
2. ストレージ
Cloud Storage、Cloud SQL、Persistent Diskなどのデータ保存費用です。保存容量と保存期間に基づいて課金されます。
3. ネットワーク
VPCネットワークを通じたデータ転送費用です。特に外部向けのエグレス(送信)トラフィックが課金対象となります。同リージョン内の通信は多くの場合無料です。
4. データ処理・分析
BigQueryのクエリ実行費用、Dataflowのジョブ実行費用などです。処理するデータ量に応じて課金されます。
請求アカウントの構造
GCPの請求構造は以下の階層になっています。
- 請求アカウント:支払い情報を管理する単位。1つの請求アカウントに複数のプロジェクトを紐付け可能
- プロジェクト:リソースを管理する単位。各プロジェクトの使用料が請求アカウントに集約される
- ラベル:リソースに付与するキーバリューペア。コストの分類・分析に活用する
予算アラートの設定方法
予算アラートは、コスト管理の最も基本的かつ重要な仕組みです。設定した予算額に対して使用料が一定割合に達した時点で通知を受け取れます。
Cloud Consoleでの予算作成
# gcloudコマンドでの予算作成
gcloud billing budgets create \
--billing-account=BILLING_ACCOUNT_ID \
--display-name="月次予算アラート" \
--budget-amount=100000JPY \
--threshold-rule=percent=0.5 \
--threshold-rule=percent=0.8 \
--threshold-rule=percent=1.0 \
--threshold-rule=percent=1.2,basis=forecasted-spend \
--all-updates-rule-monitoring-notification-channels=projects/my-project/notificationChannels/CHANNEL_ID
上記の設定では、以下のタイミングで通知が送られます。
- 実績が予算の50%に到達したとき
- 実績が予算の80%に到達したとき
- 実績が予算の100%に到達したとき
- 予測値が予算の120%を超えると見込まれるとき
プロジェクト別・サービス別の予算設定
全体予算に加えて、プロジェクト単位やサービス単位でも予算を設定することを推奨します。
# 特定プロジェクトの予算
gcloud billing budgets create \
--billing-account=BILLING_ACCOUNT_ID \
--display-name="本番環境プロジェクト予算" \
--budget-amount=50000JPY \
--filter-projects=projects/production-project \
--threshold-rule=percent=0.8 \
--threshold-rule=percent=1.0
# 特定サービスの予算(Compute Engineのみ)
gcloud billing budgets create \
--billing-account=BILLING_ACCOUNT_ID \
--display-name="Compute Engine予算" \
--budget-amount=30000JPY \
--filter-services=services/6F81-5844-456A \
--threshold-rule=percent=0.8 \
--threshold-rule=percent=1.0
予算超過時の自動アクション
Pub/SubとCloud Functionsを組み合わせることで、予算超過時に自動的にリソースを停止する仕組みを構築できます。
# Pub/Subトピックの作成
gcloud pubsub topics create budget-alerts
# Cloud Functionで自動対応(例:VMの停止)
# budget_handler.py
import base64
import json
from googleapiclient import discovery
def stop_instances(event, context):
pubsub_data = base64.b64decode(event['data']).decode('utf-8')
budget_notification = json.loads(pubsub_data)
cost_amount = budget_notification['costAmount']
budget_amount = budget_notification['budgetAmount']
if cost_amount > budget_amount:
# 開発環境のVMを停止
compute = discovery.build('compute', 'v1')
instances = compute.instances().list(
project='dev-project',
zone='asia-northeast1-b'
).execute()
for instance in instances.get('items', []):
if 'dev' in instance['name']:
compute.instances().stop(
project='dev-project',
zone='asia-northeast1-b',
instance=instance['name']
).execute()
print(f"Stopped: {instance['name']}")
コスト分析とレポートの活用
費用を削減するには、まず「どこに」「いくら」かかっているかを正確に把握する必要があります。
請求レポートの確認
Cloud Consoleの「お支払い」→「レポート」から、以下の切り口でコストを分析できます。
- サービス別:どのGCPサービスにいくらかかっているか
- プロジェクト別:どのプロジェクトのコストが大きいか
- SKU別:詳細な課金項目ごとの内訳
- ラベル別:チームや環境などカスタムラベルでの分類
ラベルによるコスト分類の設計
リソースにラベルを付与することで、コストの可視化が格段に向上します。
# VMにラベルを付与
gcloud compute instances update my-vm \
--zone=asia-northeast1-b \
--update-labels=env=production,team=backend,service=api
# Cloud SQLインスタンスにラベルを付与
gcloud sql instances patch my-db \
--update-labels=env=production,team=backend,service=database
# Cloud Storageバケットにラベルを付与
gcloud storage buckets update gs://my-bucket \
--update-labels=env=production,team=data,service=analytics
推奨するラベルの設計ルールです。
- env:production / staging / development
- team:backend / frontend / data / infra
- service:api / web / batch / analytics
- cost-center:部門コードや事業コード
BigQueryへの請求データエクスポート
詳細なコスト分析を行うには、請求データをBigQueryにエクスポートし、SQLでクエリを実行するのが最も強力です。
-- 過去30日のサービス別コスト(上位10)
SELECT
service.description AS service_name,
SUM(cost) AS total_cost,
SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS total_credits,
SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS net_cost
FROM `my-project.billing_export.gcp_billing_export_v1_XXXXXX`
WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY service_name
ORDER BY net_cost DESC
LIMIT 10;
-- ラベル別のコスト内訳
SELECT
(SELECT value FROM UNNEST(labels) WHERE key = 'env') AS environment,
(SELECT value FROM UNNEST(labels) WHERE key = 'team') AS team,
SUM(cost) AS total_cost
FROM `my-project.billing_export.gcp_billing_export_v1_XXXXXX`
WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY environment, team
ORDER BY total_cost DESC;
-- 日別のコスト推移
SELECT
DATE(usage_start_time) AS usage_date,
SUM(cost) AS daily_cost
FROM `my-project.billing_export.gcp_billing_export_v1_XXXXXX`
WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY)
GROUP BY usage_date
ORDER BY usage_date;
コンピューティングコストの削減テクニック
最もコストが大きいコンピューティングリソースの最適化は、費用削減の第一歩です。
継続利用割引(Sustained Use Discounts)
Compute EngineのVMを月の25%以上使用すると、自動的に割引が適用されます。申し込み不要で、最大30%の割引を受けられます。
- 月の25%使用 → 割引開始
- 月の50%使用 → 約10%割引
- 月の75%使用 → 約20%割引
- 月の100%使用 → 約30%割引
確約利用割引(Committed Use Discounts / CUD)
1年または3年の利用を確約することで、大幅な割引を受けられます。
# 確約利用契約の作成(1年)
gcloud compute commitments create my-commitment \
--region=asia-northeast1 \
--plan=12-month \
--resources=vcpu=8,memory=32GB \
--type=GENERAL_PURPOSE
割引率の目安は以下の通りです。
- 1年確約:最大37%割引
- 3年確約:最大55%割引
過去3ヶ月以上の利用実績を分析し、常に稼働しているリソースに対して確約利用割引を適用するのが基本的な戦略です。
マシンタイプの最適化
GCPが提供するレコメンデーション機能を活用して、過剰なスペックのVMを特定しましょう。
# VMのリサイズ推奨事項を確認
gcloud recommender recommendations list \
--project=my-project \
--location=asia-northeast1-b \
--recommender=google.compute.instance.MachineTypeRecommender
# コスト削減の推奨事項を一覧
gcloud recommender recommendations list \
--project=my-project \
--location=asia-northeast1-b \
--recommender=google.compute.instance.IdleResourceRecommender
レコメンデーションの結果に基づいて、以下の対応を検討します。
- CPU使用率が常に低い:マシンタイプを1サイズダウン(例:e2-standard-4 → e2-standard-2)
- カスタムマシンタイプの活用:CPUとメモリを必要な分だけ指定して、無駄をなくす
- E2シリーズの検討:汎用ワークロードにはコスト効率の高いE2シリーズが適している
Spot VMの活用
バッチ処理やテスト環境など、中断可能なワークロードにはSpot VMを活用します。通常のVMの60〜91%割引で利用できます。
# Spot VMの作成
gcloud compute instances create batch-worker \
--zone=asia-northeast1-b \
--machine-type=e2-standard-4 \
--provisioning-model=SPOT \
--instance-termination-action=STOP
ストレージとネットワークの費用削減
コンピューティング以外のコスト要因も、地道な最適化で大きな削減効果を得られます。
Cloud Storageのライフサイクル管理
アクセス頻度に応じてストレージクラスを自動的に切り替えるライフサイクルルールを設定します。
# ライフサイクルルールの定義
cat << 'EOF' > lifecycle.json
{
"rule": [
{
"action": {
"type": "SetStorageClass",
"storageClass": "NEARLINE"
},
"condition": {
"age": 30,
"matchesStorageClass": ["STANDARD"]
}
},
{
"action": {
"type": "SetStorageClass",
"storageClass": "COLDLINE"
},
"condition": {
"age": 90,
"matchesStorageClass": ["NEARLINE"]
}
},
{
"action": {
"type": "SetStorageClass",
"storageClass": "ARCHIVE"
},
"condition": {
"age": 365,
"matchesStorageClass": ["COLDLINE"]
}
},
{
"action": {
"type": "Delete"
},
"condition": {
"age": 730
}
}
]
}
EOF
# ライフサイクルルールの適用
gcloud storage buckets update gs://my-bucket --lifecycle-file=lifecycle.json
ストレージクラスごとの保存費用(東京リージョン、1GBあたり月額)は以下の通りです。
- Standard:約$0.023
- Nearline:約$0.013(30日未満の削除は追加課金)
- Coldline:約$0.006(90日未満の削除は追加課金)
- Archive:約$0.0025(365日未満の削除は追加課金)
ネットワークコストの最適化
ネットワーク転送コストは見落とされがちですが、大量のデータ転送を行うシステムでは大きな割合を占めることがあります。
- 同リージョン内通信を優先する:リージョン間のデータ転送は有料。可能な限りリソースを同リージョンに配置する
- CDNの活用:Cloud CDNを導入し、静的コンテンツの配信コストを削減する
- プライベートGoogleアクセスの利用:GCPサービスへの通信をプライベートネットワーク経由にすることで、エグレスコストを削減する
不要リソースの定期棚卸し
使われていないリソースが放置されているケースは非常に多いです。定期的な棚卸しを行いましょう。
# 未使用のIPアドレスを検出
gcloud compute addresses list --filter="status=RESERVED"
# 未接続のディスクを検出
gcloud compute disks list --filter="-users:*"
# 古いスナップショットを一覧
gcloud compute snapshots list \
--sort-by=creationTimestamp \
--format="table(name,creationTimestamp,diskSizeGb,storageBytes)"
# 使用されていないイメージの検出
gcloud artifacts docker images list \
asia-northeast1-docker.pkg.dev/my-project/my-repo \
--filter="updateTime<2025-01-01"
コスト管理の自動化とガバナンス
コスト管理を個人の努力に依存するのではなく、組織的な仕組みとして自動化することが持続的な費用最適化の鍵です。
組織ポリシーによる制限
# 利用可能なリージョンを制限(不要なリージョンでのリソース作成を防止)
gcloud resource-manager org-policies set-policy \
--project=my-project \
policy.yaml
# policy.yaml の例
# constraint: constraints/gcloud.resourceLocations
# listPolicy:
# allowedValues:
# - asia-northeast1
# - asia-northeast2
開発環境の自動停止
営業時間外に開発環境のVMを自動停止するスケジュールを設定します。
# Cloud Schedulerで平日18時にVMを停止
gcloud scheduler jobs create http stop-dev-vms \
--schedule="0 18 * * 1-5" \
--time-zone="Asia/Tokyo" \
--uri="https://compute.googleapis.com/compute/v1/projects/my-project/zones/asia-northeast1-b/instances/dev-server/stop" \
--http-method=POST \
--oauth-service-account-email=scheduler@my-project.iam.gserviceaccount.com
# Cloud Schedulerで平日9時にVMを起動
gcloud scheduler jobs create http start-dev-vms \
--schedule="0 9 * * 1-5" \
--time-zone="Asia/Tokyo" \
--uri="https://compute.googleapis.com/compute/v1/projects/my-project/zones/asia-northeast1-b/instances/dev-server/start" \
--http-method=POST \
--oauth-service-account-email=scheduler@my-project.iam.gserviceaccount.com
この設定だけで、開発環境のVM稼働時間を約60%削減できます。
定期的なコストレビューの実施
コスト管理は一度設定して終わりではありません。以下のサイクルを回すことが重要です。
- 週次:予算消化率の確認、異常なコスト増加の検知
- 月次:サービス別・プロジェクト別のコスト分析、前月比の確認
- 四半期:確約利用割引の見直し、マシンタイプのレコメンデーション確認
- 年次:クラウド戦略の見直し、コスト削減施策の効果検証
Cloud Monitoringのダッシュボードにコスト推移のグラフを追加しておくと、日常的にコストの変動を意識できるようになります。
まとめ:継続的なコスト最適化で投資効果を最大化する
GCPのコスト管理は、クラウド活用の成果を左右する重要な要素です。この記事で紹介したポイントを整理します。
- 予算アラート:予算の50%・80%・100%・120%(予測)で多段階の通知を設定する
- コスト分析:ラベルを活用して費用の内訳を可視化し、BigQueryで詳細な分析を行う
- 確約利用割引:安定して稼働するリソースには1年または3年の確約利用割引を適用する
- リソース最適化:レコメンデーション機能でマシンタイプの見直し、Spot VMの活用を検討する
- ストレージ最適化:ライフサイクルルールで保存コストを自動的に削減する
- 自動化:開発環境の自動停止、不要リソースの定期棚卸しを仕組み化する
まずは予算アラートの設定と、リソースへのラベル付与から始めてください。コストの見える化ができれば、削減すべきポイントが明確になります。IAMによる権限管理でリソース作成権限を適切に制限することも、コストガバナンスの一環として重要です。Terraformでインフラをコード管理すれば、リソースの変更を承認フローに乗せることで、意図しないコスト増加を防ぐことができます。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践