「高額請求」にさよなら:GitHub PRでクラウド費用を自動見積もり

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

スピードの代償

TerraformやOpenTofuのようなInfrastructure as Code (IaC) ツールは、数行のHCLでグローバル規模の環境をデプロイできるという劇的な変化をもたらしました。しかし、そのスピードには「隠れた税金」が伴うことがよくあります。

急ぎすぎると、ある週末に「ちょっとした」ネットワークの変更で4,000ドルのコストが発生した理由を、困惑するCFOに説明する羽目になります。変数を一つ変えるだけで支出が5倍になることに気づかず、本来は db.m5.large で十分なところに、誤ってハイエンドな db.m5.12xlarge インスタンスをプロビジョニングしてしまったチームを私は見てきました。

多くのクラウドコスト管理は「リアクティブ(事後対応的)」です。AWS Cost Explorerの更新を待つか、最悪の場合、月末に届く請求書でようやく事態を把握することになります。その時には、すでにお金は失われています。予算を真にコントロールするには、コスト意識を「シフトレフト」させる必要があります。つまり、インフラが構築される前、開発者のワークフローの中に直接コストデータを組み込むのです。

Infracost:コードのための「財務リンター」

Infracostは、コードとプロバイダーの料金APIの架け橋となります。これは単なるツールではなく、「財務的なセーフティネット」です。Terraformファイルをスキャンし、AWS、Azure、GCPにわたる350万以上の価格ポイントのデータベースに照会して、コストの正確な内訳を出力します。抽象的なHCLを具体的な金額へと変換してくれるのです。

真の力は、Pull Request (PR) との連携にあります。開発者がコードをプッシュするたびに、ボットがPRにコメントし、財務的な影響を正確に示す表を表示します。変更によって月額費用が500ドル増える場合、全員が即座にそれを知ることができます。この透明性は、開発サイクルを遅らせることなく、説明責任を果たす文化を育みます。

セットアップ方法

導入は、APIキーの取得、ローカルでのロジック検証、そしてGitHub Actionsによる自動化という、シンプルな3つのステップで進みます。

1. APIキーの登録

このツールはオープンソースプロジェクトでは無料で、小規模チーム向けの寛容なプランも用意されています。まずはCLIをインストールし、アカウントを登録しましょう:

brew install infracost
infracost auth register

このコマンドを実行すると、ローカル設定にAPIキーが生成されます。これは後でGitHub Secretとして必要になるため、安全に保管してください。

2. ローカルでの動作確認

自動化する前に、ローカルディレクトリに対してInfracostを実行し、モジュールが正しく解析されるか確認しましょう。標準的な main.tf がある場合は、以下を実行します:

infracost breakdown --path .

現在の変更がデプロイ済みのものとどう違うかを確認するには、 diff コマンドを使用します:

infracost diff --path .

3. GitHub Actionsによる自動化

自動化されたコストの可視化は、チームのコードレビューのあり方を変えます。私はこのアプローチを50以上のマイクロサービスを持つ本番環境に適用してきましたが、請求が発生する前にオーバープロビジョニングのミスを一貫して防いでいます。ある開発者が誤ってNAT Gatewayの設定をミスした際も数秒で発見され、月額約2,100ドルの損失を回避できました。

まず、 INFRACOST_API_KEY をGitHubリポジトリのSecretsに追加します。次に、 .github/workflows/infracost.yml を作成します:

name: Infracost
on: [pull_request]

jobs:
  infracost:
    name: Infracost
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write

    steps:
      - name: ベースをチェックアウト
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.base.ref }}

      - name: Infracostのベースラインを生成
        run: |
          curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh
          infracost breakdown --path . \
                            --format json \
                            --out-file /tmp/infracost-base.json
        env:
          INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}

      - name: PRブランチをチェックアウト
        uses: actions/checkout@v4

      - name: Infracostの差分を生成
        run: |
          infracost diff --path . \
                        --format json \
                        --compare-to /tmp/infracost-base.json \
                        --out-file /tmp/infracost.json
        env:
          INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}

      - name: Infracostのコメントを投稿
        run: |
            infracost comment github --path /tmp/infracost.json \
                             --repo ${{ github.repository }} \
                             --github-token ${{ secrets.GITHUB_TOKEN }} \
                             --pull-request ${{ github.event.pull_request.number }} \
                             --behavior update
        env:
          INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}

このワークフローは、 main ブランチの現在の状態とPRを比較し、その結果をコメントとして投稿します。これにより、コードがもたらす実際の影響に議論を集中させることができます。

現場からのアドバイス

ツールのセットアップは簡単ですが、大規模な組織で運用するには少し戦略が必要です。

設定ファイルによるモノリポジトリの管理

リポジトリに複数のプロジェクト(例: stagingproduction )が含まれている場合は、ルートをスキャンしないでください。 infracost.yml ファイルを使用して、対象となるディレクトリを正確に定義します:

version: 0.1
projects:
  - path: terraform/staging
    usage_file: terraform/staging/infracost-usage.yml
  - path: terraform/production
    usage_file: terraform/production/infracost-usage.yml

変動コストの考慮

インスタンスの固定料金は追跡しやすいですが、データ転送量やLambdaの実行コストなどはHCL上では見えません。これらの変数を記述した infracost-usage.yml ファイルを使用しましょう。これにより、「理論上の」コストと実際の月次請求書の差を埋めることができます。

予算のガードレールの強化

FinOpsは、結果(制約)を伴うことで最も効果を発揮します。PRによってコストが設定したしきい値(例:500ドル)を超えた場合に、CIを失敗させるように設定できます。これにより、高額なリソースがプロビジョニングされる前に、DevOpsリードやマネージャーによる手動の承認を強制できます。

最後に

クラウド管理が毎月の「驚き」であってはなりません。InfracostをGitHub Actionsに組み込むことで、財務指標をエンジニアリングプロセスの標準的な一部に変えることができます。これにより、開発者は責任を持って構築するために必要なデータを手にできます。クラウドの利用を厳しく制限するのではなく、賢く利用するためのツールをチームに提供しましょう。まずは可視化から始めることで、効率化に向けた文化の変革が自然と後に続くはずです。

Share: