EP.03〜07 で集めた / CI/CD / クラウド / のコストを、個人・チーム・プロジェクト に配賦して 1 表に統合します。これで「Aさん今月 $1,200、ほぼ 」「B チーム今月 $5,800、半分が BigQuery」が見える。
識別子の名寄せ
| プロバイダ | 識別子 | person への紐付け |
|---|---|---|
| Anthropic | api_key_id | key 名規約 (`tanaka-cli`) → 個人 |
| OpenAI | api_key_id | 同上 |
| Actions | actor (PR 作者) | GitHub login → 個人 |
| / | tag (Owner) / labels | メールアドレス → 個人 |
| user_email | そのまま | |
| user_name | ID → 個人 |
identity マッピングの中央管理
YAML
# people.ymlpeople: tanaka: name: 田中 team: platform emails: [tanaka@hukuhuku.co.jp] github_login: tanaka-jp api_keys: anthropic: [tanaka-cli, tanaka-cursor] openai: [tanaka-py] snowflake_users: [TANAKA]BigQuery 統合テーブルの設計
engineering_costs 統合テーブル
SQL
CREATE TABLE engineering_costs ( date DATE NOT NULL, source STRING, -- 'anthropic' | 'openai' | 'github_actions' | 'aws' | 'gcp' | 'bigquery' | 'snowflake' category STRING, -- 'llm' | 'cicd' | 'cloud' | 'dwh' person_id STRING, -- 個人ID (people.yml の key) team STRING, project STRING, cost_usd FLOAT64, detail STRUCT< request_count INT64, tokens INT64, seconds FLOAT64 >)PARTITION BY dateCLUSTER BY person_id, team;月次レポートの自動生成
Slack に月初送信
Python
import pandas as pdfrom google.cloud import bigquery
bq = bigquery.Client()df = bq.query("""SELECT person_id, team, category, SUM(cost_usd) AS costFROM engineering_costsWHERE date >= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH) AND date < DATE_TRUNC(CURRENT_DATE(), MONTH)GROUP BY 1, 2, 3""").to_dataframe()
# 個人別 TOP 10top = df.groupby("person_id")["cost"].sum().sort_values(ascending=False).head(10)
message = "📊 先月の Engineering コスト TOP 10:\n"for person, cost in top.items(): message += f" {person}: ${cost:,.0f}\n"
post_to_slack(message)ダッシュ設計
- 個人別月次コスト: 累計、月次、カテゴリ内訳
- チーム別月次コスト: 予算 vs 実績
- プロジェクト別: 受託案件のチャージバック計算
- 急増アラート: 個人レベルで前月比 +200% などをトリガー
- 未配賦コスト: タグ無し・key 未マッピングを毎週 0 化目標
次の話
EP.09 では DORA 4 metrics + 活用度メトリクスを扱います。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。