Article

クラウド費用最適化の新潮流:FinOpsでコスト管理を効率化

高田晃太郎
クラウド費用最適化の新潮流:FinOpsでコスト管理を効率化

Flexera 2024 State of the Cloud Reportでは、企業が自己認識するクラウド支出のムダが平均で約3割前後に達するとの報告があります¹。IBMのブログでも類似のレンジ(約3割)が取り上げられており、ムダの削減は依然として重要テーマです¹,⁷。FinOps Foundationの最新サーベイは、FinOpsの導入が進む一方で「エンジニアに行動してもらうこと」が最大の課題だと指摘します²,³。複数の公開レポートを突き合わせると、単なるコスト削減ではなく、予算の透明性(誰の費用かが明確)、予測の精度(先読みできる)、単位経済性(1取引や1ユーザーあたりのコスト)の改善を同時に進める体制が成果につながるという共通項が見えてきます⁴,⁶。つまり、FinOpsは節約術ではなく、エンジニアリングを核にした運用・財務・事業の協奏モデルです⁴。計測可能なKPI(タグ準拠率、コミットメント・カバレッジ、アロケーション率など)を設定し、プロダクトチームの日次の意思決定に落とし込める組織ほど、短期間で持続的な改善が進みやすいのは確かです。

FinOpsは「コスト削減」から「単位経済」への転換点

FinOpsの本質は、支出を抑えること自体ではなく、ビジネス価値に対して支出を最適化することにあります⁴。FinOps Foundationは、エンジニアリング、財務、運用が共通の指標と言語で対話し、コストを(可能な限り)リアルタイムに可視化し、各チームが自律的に最適化アクションを起こすループを提唱しています⁴。ここで重要なのは、クラウドの弾力性とスピードを犠牲にしないことです。リソースを止めることは簡単ですが、ユーザー体験や開発速度を損なえば本末転倒になります。そこで単位経済指標(例:トランザクションあたりコスト、1セッションあたりコスト、テナントあたりコスト)を導入し、スループットや遅延(SLI/SLOの視点)と併せて最適点を見つけます。透明性は協力の前提です。タグやコスト配賦(ショーバック/チャージバック:部門・プロダクトへ費用を見せる/按分する仕組み)が機能していない状態では、誰のコストかが分からず、エンジニアは行動しようがありません。まず高い配賦率(例:90%程度)を目標に、共通タグ設計、共有費用ルール、アカウント/プロジェクト階層の設計を整備します⁵。次に、Savings Plans(AWSの長期コミット割引)やCommitted Use Discount(GCPのコミット割引)といったコミット型割引のカバレッジと有効活用率を高めます。一般に、カバレッジはおおむね8割前後、利用率は9割台を狙う設計が採られることが多く、過不足のリスクを抑えやすい水準です。最後に、権限と責任の所在をプロダクトチームに戻します。ダッシュボードは財務向けの集計ではなく、エンジニアが日々のプルリクやデプロイに活かせる粒度とレイテンシで提供する必要があります²。

ROIと導入期間の目安

導入初期の数週間〜数カ月は、タグ準拠率の改善や未使用リソースの廃止といった「早期成果」が得られやすいフェーズです。続くフェーズでは、コミットメント最適化(Savings Plans/CUDの見直し)や権限移譲を進め、チームの自律運転を定着させます。ツール導入やダッシュボード基盤の整備には初期コストが伴いますが、効果の見え方は支出規模・季節性・自動化レベルに相関します。一定規模以上の支出がある組織では、四半期〜半年程度で定量的な改善が可視化されるケースが一般的です(あくまで目安であり環境依存です)。

組織設計と責務

センター・オブ・エクセレンスとしてのFinOpsコアは、ポリシー、計測、教育を担い、各プロダクトチームが実行主体になります。RACIに拘泥せず、ダッシュボードの所有権、閾値の調整、割引購入の承認フローを明文化し、アラートに反応してスケールやインスタンスタイプ変更を行う権限を、できるだけ現場に下ろします。最大の阻害要因は、情報の遅延です。翌月中旬の請求確定を待たず、1〜24時間遅延で使える未確定データを実装に繋ぐパイプラインを用意します。内部連携の具体像は、観測系と合わせて学ぶのが近道です。

実装ロードマップと技術スタック

まずコストデータのパイプラインを確立します。AWSならCost and Usage Report(CUR:請求・使用詳細レポート)をS3に出力し、Athena(サーバレスのインタラクティブクエリ)で照会する構成が手堅い選択です。GCPはBigQueryへのBilling Export、AzureはCost Managementエクスポートが定番です。データモデルには、アカウント/プロジェクト、サービス、SKU、リージョン、タグ、コスト(Blended/Unblended/Amortized:混合/オンデマンド換算/償却按分)を含め、ショーバック/チャージバックの配賦ロジックをSQLとして明文化します。次にタグガバナンスを仕組みに落とし込みます。必須タグの強制はSCPやポリシーで行い、違反はConfigやPolicy Analyzerで検出し、週次の修復を自動化します。そのうえで、Kubernetesのリクエスト/リミットとHPA/VPA(Horizontal/Vertical Pod Autoscaler:負荷に応じた横/縦の自動スケール)を活用し、オートスケールの挙動とノード課金を整合させます。最後に、コミット型割引の最適化と異常検知を自動化し、予測機能で財務連携の摩擦を減らします。

Athenaで未タグコストを可視化するSQL

CURのタグをmap型で出力している前提で、必須タグの欠落コストを日次に集計します。

WITH cur AS (
  SELECT
    line_item_usage_start_date AS usage_start,
    line_item_product_code AS product,
    line_item_unblended_cost AS cost,
    resource_tags AS tags
  FROM cur_db.cur_table
  WHERE bill_billing_period_start_date >= DATE '2025-01-01'
)
SELECT
  date_trunc('day', usage_start) AS day,
  SUM(IF(tags['Owner'] IS NULL OR tags['CostCenter'] IS NULL, cost, 0)) AS untagged_cost,
  SUM(cost) AS total_cost,
  100.0 * SUM(IF(tags['Owner'] IS NULL OR tags['CostCenter'] IS NULL, cost, 0)) / NULLIF(SUM(cost),0) AS untagged_ratio
FROM cur
GROUP BY 1
ORDER BY 1;

この比率が高止まりしている限り、配賦の正確性が担保できず、FinOpsループは回りません。まずはこの数値を週次レポート化し、改善責任をチームに明確化します⁵。

BigQueryでGCPの未配賦コストを抽出

GCP Billing Exportでは、ラベル欠落の費用をSKU粒度で把握します。

SELECT
  service.description AS service,
  sku.description AS sku,
  SUM(cost) AS cost
FROM `my_project.billing.gcp_billing_export_v1_*`
WHERE usage_start_time BETWEEN TIMESTAMP('2025-01-01') AND TIMESTAMP('2025-01-31')
  AND (labels.owner IS NULL OR labels.cost_center IS NULL)
GROUP BY service, sku
ORDER BY cost DESC
LIMIT 50;

SKU単位での偏りを把握できれば、具体的な最適化対象が明確になります。Compute系のSKUに集中していれば、リザーブドやCUD検討の優先順位が上がります。

Terraformで必須タグを強制

AWS OrganizationsのタグポリシーをTerraformで実装し、OwnerとCostCenterの必須化を図ります。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

resource "aws_organizations_policy" "tag_policy" {
  name        = "required-tags"
  description = "Enforce Owner and CostCenter tags"
  type        = "TAG_POLICY"
  content     = jsonencode({
    tags = {
      Owner = {
        tag_key = { @mandatory = true }
        tag_value = { @pattern = ".+" }
      }
      CostCenter = {
        tag_key = { @mandatory = true }
        tag_value = { @pattern = "CC-[0-9]+" }
      }
    }
  })
}

resource "aws_organizations_policy_attachment" "attach" {
  policy_id = aws_organizations_policy.tag_policy.id
  target_id = data.aws_organizations_organization.org.roots[0].id
}

data "aws_organizations_organization" "org" {}

SCPやConfigルールと併用して、新規作成時のバイパス余地を減らすと同時に、逸脱の自動修復を用意すると運用負荷を最小化できます。

Kubernetesのリクエスト/リミットとHPA

CPUとメモリの要求量を正しく設定し、HPAでレプリカを自動調整します。ノードのオートスケーラと整合させることで、アイドルを抑えつつSLOを維持できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  labels:
    app: api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: ghcr.io/example/api:1.2.3
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "750m"
              memory: "512Mi"
          ports:
            - containerPort: 8080
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60

リクエスト過大はクラスタのノード数を押し上げ、直接課金に跳ね返ります。ワークロード観測の移動平均やp95レイテンシと併せ、定期的にチューニングする運用を組み込みます。

Boto3でコスト異常検知を自動化

Cost Explorerの異常検知をコードで有効化し、SNSで通知します。サービス障害と区別するために、監視系のアラートと相関を取るのが効果的です。

import boto3
from botocore.exceptions import BotoCoreError, ClientError

ce = boto3.client('ce')
sns = boto3.client('sns')

SNS_TOPIC_ARN = 'arn:aws:sns:us-east-1:123456789012:cost-anomaly'

try:
    monitor = ce.create_anomaly_monitor(
        AnomalyMonitor={
            'Name': 'daily-total-cost',
            'MonitorType': 'DIMENSIONAL',
            'MonitorDimension': 'SERVICE'
        }
    )
    ce.create_anomaly_subscription(
        AnomalySubscription={
            'Frequency': 'DAILY',
            'Subscribers': [{'Type': 'SNS', 'Address': SNS_TOPIC_ARN}],
            'Threshold': 20.0,
            'MonitorArnList': [monitor['AnomalyMonitor']['MonitorArn']]
        }
    )
    print('Anomaly detection configured')
except (BotoCoreError, ClientError) as e:
    print(f'Failed to configure anomaly detection: {e}')

しきい値は絶対額だけでなく、サービス別やアカウント別の相対変化と組み合わせると、不要なアラートを削減できます。

コスト予測で財務連携を滑らかにする

翌月の着地見込みをAPIで取得し、FP&Aの見通し会議に間に合わせます(Prediction Intervalを併記して不確実性を共有)。未確定データであっても、予測誤差のレンジを明示すれば意思決定に十分耐えます。

import boto3
from botocore.exceptions import BotoCoreError, ClientError
from datetime import date, timedelta

ce = boto3.client('ce')

def get_next_month_forecast():
    today = date.today()
    start = date(today.year, today.month, 1)
    next_month = (start.replace(day=28) + timedelta(days=4)).replace(day=1)
    end = (next_month.replace(day=28) + timedelta(days=4)).replace(day=1)
    try:
        resp = ce.get_cost_forecast(
            TimePeriod={'Start': next_month.isoformat(), 'End': end.isoformat()},
            Metric='AMORTIZED_COST',
            Granularity='MONTHLY',
            PredictionIntervalLevel=80
        )
        point = resp['ForecastResultsByTime'][0]
        return {
            'mean': float(point['MeanValue']),
            'p10': float(point['PredictionIntervalLowerBound']),
            'p90': float(point['PredictionIntervalUpperBound'])
        }
    except (BotoCoreError, ClientError) as e:
        raise RuntimeError(f'failed to forecast: {e}')

if __name__ == '__main__':
    forecast = get_next_month_forecast()
    print(forecast)

この値をBIに連携し、前提条件やキャンペーン計画と一緒にレビューすることで、調達や与信枠の調整が事前に可能になります。予測のMAPE(平均絶対百分率誤差)は初期は大きめでも、タグ準拠と単位経済指標の導入で改善しやすく、意思決定に耐える精度に収束させられます。

KPI設計とベンチマーク

FinOpsの進捗は、意志の強さではなくメトリクスで語るべきです。まず配賦の完全性を示すアロケーション率を定義し、総コストに対してタグやアカウント階層で誰の費用か判別できる割合を計測します。高い配賦率(例:90%程度)に届かない場合は最優先で改善します⁵。次にコミットメント最適化の成熟度を、カバレッジ(オンデマンド換算に対する対象使用量の割合)と利用率(購入分に対する実使用の割合)で追います。過不足の両リスクを抑えるため、カバレッジは8割前後、利用率は9割台を安定運用の目安にする設計がよく採られます²。権利サイズの見直しは四半期ごとのレビューに組み込み、需要の季節性と事業計画を反映します。ワークロード効率は、Kubernetesのリクエスト/実使用比、アイドル率、p95レイテンシで評価します。ここでの最適点は業務要件に依存しますが、アイドル率を抑えつつSLOを満たす構成を目指します。最後に、単位経済の改善を確認します。例として1,000リクエストあたりコスト、1ユーザーあたり月間コスト、1テナントあたりストレージコストなど、事業KPIに直結する指標を採用します。コスト削減がSLO悪化を招いていないかを同時に監視するため、対比表示すると意思決定が加速します⁴。

失敗パターンと対策

よくあるつまずきは、財務主導でエンジニアが関与しない状態です。この構図では、配賦の精度も、削減アクションの継続性も担保できません³。最初からプロダクトチームのダッシュボードに組み込み、PRやデプロイのチェックリストにコストインパクトを含めると、行動が継続します。次の落とし穴は、データのレイテンシです。請求確定ベースでは遅すぎ、日次〜時間単位でのダッシュボードが必要になります。最後に、割引最適化に偏りすぎる問題があります。確かに効果は大きいものの、ワークロードの効率化やアーキテクチャ見直しと併走しなければ、地力は上がりません。コミットメント、効率化、責任の分配という三本柱をバランスさせることが、持続的な成果の鍵になります⁴。

ケーススタディ:中規模SaaSでの取り組み例

月額のクラウド支出が一定規模に達するB2C SaaSを題材に、典型的な進め方を紹介します(一般化した事例)。着手時点の課題は、タグ準拠率の低さと割引カバレッジ不足でした。最初のフェーズでは、タグポリシーの強制と修復を自動化して準拠率を大幅に引き上げ、並行してKubernetesのリクエスト見直しとHPA設定の最適化でアイドルを抑制しました。次のフェーズでSavings Plans(またはCUD)の購入戦略を見直し、カバレッジと利用率のバランスを取り直しました。結果として、総コストのトレンドは安定化し、予測精度が向上、デプロイ前にコスト差分を確認する文化が根付きました。大規模キャンペーン時にはキャパシティ確保とコストの見通しが一致し、経営会議での意思決定が速くなるという副次効果も得られます。似た規模感の組織では、この順序と考え方が一つのベンチマークになるはずです。

実務で使うダッシュボードの要件

役割ごとに必要な視点は異なります。経営と財務はトレンドと予測レンジ、プロダクトは単位経済とSLO、プラットフォームは割引とキャパシティ、SREは異常検知と効率の時系列という構成が実務的です。どの視点でも共通して重要なのは、アクション可能性です。たとえば、未タグ費用が日次で検出されたら、その場でタグ修復の自動化ジョブを起動できる動線、リクエスト/リミットの過大が見つかったら、直近30日分の分位点を提示しながら安全な設定案を提案するガードレールが求められます。

まとめ:行動が生む最適化、文化が支える持続性

FinOpsは、コスト表計算のきれいな整列では終わりません。タグ準拠を高め、データの遅延を解消し、単位経済を事業の会話に乗せることで、エンジニアが毎日の意思決定で最適化を積み重ねられる環境を用意します。ダッシュボードが翌日以降の行動を変えていなければ、それはまだ可視化の段階にとどまっています。まずは未タグ比率、コミットメントのカバレッジと利用率、Kubernetesのアイドル率という三点を、今週から測り始めてください。測定が始まれば、改善の会話が始まり、改善の会話が始まれば、文化が生まれます。あなたの組織では、最初にどどの指標をゼロから一に動かしますか。内部の合意形成が必要であれば、ここで紹介したSQLやTerraform、Pythonのスクリプトを、そのままプロトタイプとして導入してみてください。小さな成功が、持続可能な最適化の土台になります。

参考文献

  1. Flexera. New Flexera report finds 84 percent of organizations struggle to manage cloud spend. https://www.flexera.com/about-us/press-center/new-flexera-report-finds-84-percent-of-organizations-struggle-to-manage-cloud-spend#:~:text=third%20%2833,percentage%20points%20year%20over%20year
  2. FinOps Foundation. Key priorities shift in 2024. https://www.finops.org/insights/key-priorities-shift-in-2024/?_hsenc=p2ANqtz—TAEQGjjrNQNIvwVaHiRL7h8eASo5EyNk9waPfGsYCR5iqX17JE7NLr1qmVFHXw5UU-waj_u4hQ5eCPQnE_Ar8P_N8bg&_hsmi=295159983&utm_campaign=Brand+Growth&utm_content=295159983&utm_medium=email&utm_source=hs_email#:~:text=1,managing%20commitments%2C%20mirroring%20economic%20uncertainty
  3. FinOps Foundation. Encouraging engineers to take action. https://www.finops.org/wg/encouraging-engineers-to-take-action/#:~:text=The%20State%20of%20FinOps%20survey,related%20challenge
  4. FinOps Foundation. Topic: Optimization. https://www.finops.org/topic/optimization/#:~:text=Ultimately%2C%20all%20of%20these%20FinOps,cost%20cutting%20to%20value%20creation
  5. FinOps Foundation. Capability: Allocation. https://www.finops.org/framework/capabilities/allocation/#:~:text=The%20FinOps%20Principle%2C%20%E2%80%9CEveryone%20takes,usage%2C%E2%80%9D%20is%20enabled%20by%20Allocation
  6. Datanami. Reducing Cloud Waste a Top Priority in 2024, FinOps Foundation Says. https://www.datanami.com/2024/02/27/reducing-cloud-waste-a-top-priority-in-2024-finops-foundation-says/#:~:text=%E2%80%9CThis%20year%E2%80%99s%20data%20illustrate%20that,%E2%80%9D
  7. IBM. How to limit cloud cost waste with FinOps accountability and automation. https://www.ibm.com/blog/how-to-limit-cloud-cost-waste-with-finops-accountability-and-automation/#:~:text=An%20estimated%C2%A032,and%20hybrid%20environments%20make%20ingestion