STEP 29:プロジェクト④ コスト最適化実践

💰 STEP 29: プロジェクト④ コスト最適化実践

既存基盤のコストを50%削減する実践プロジェクト

📋 このプロジェクトで実践すること

  • AWS Cost Explorer / GCP Billing Reportでコスト分析
  • AWS最適化(Redshift停止、S3ライフサイクル、リザーブド)
  • GCP最適化(BigQueryクエリ、GCSライフサイクル、コミットメント)
  • 効果測定とレポーティング
  • 継続的なコスト管理の仕組み構築

学習時間の目安: 2時間

🚨 今回のミッション

CFOからの指令:「クラウドコストを月額$10,000から$5,000以下に削減せよ!」
あなたはデータエンジニアとして、この難題に挑みます。

🎯 1. プロジェクト概要

💡 例え話:コスト最適化 = 家計の見直し

【クラウドコスト最適化 = 家計の節約】 ■ 現状把握(家計簿をつける) ・「何にいくら使っているか」を可視化 ・電気代が高い?食費が多い? ■ 大きな固定費から見直し ・住居費(Redshift = 家賃) ・車のローン(BigQuery = カーリース) ・使っていないサブスク解約 ■ 変動費の最適化 ・電気代(S3ストレージ = 電気代) ・水道代(データ転送 = 水道代) ■ お得な契約に切り替え ・年間契約で割引(リザーブドインスタンス) ・まとめ買い割引(コミットメント契約) 💡 家計と同じ! 「見える化 → 大きいところから → 継続改善」

現状の課題

⚠️ 現在のクラウドコスト

【月額コストの内訳】 AWS費用: $6,000/月 ├── Amazon Redshift: $2,400(40%)← 最大! ├── Amazon S3: $1,200(20%) ├── Data Transfer: $900(15%) ├── AWS Glue: $600(10%) └── その他: $900(15%) GCP費用: $4,000/月 ├── BigQuery: $2,000(50%)← 最大! ├── Cloud Storage: $800(20%) ├── Dataflow: $600(15%) └── その他: $600(15%) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 合計: $10,000/月 目標: $5,000/月以下(50%削減!) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

コスト削減のアプローチ

【コスト削減の4ステップ】 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ STEP 1: 現状分析 👀 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ・Cost Explorer / Billing Reportで可視化 ・「どこに一番お金がかかっているか」を特定 ・削減の優先順位を決定 │ ▼ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ STEP 2: 施策立案 📝 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ・削減可能な項目をリストアップ ・削減額と実装工数を見積もり ・ROI(費用対効果)が高いものを選定 │ ▼ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ STEP 3: 実装 🔧 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ・優先度の高いものから順に実施 ・設定変更、スクリプト作成 ・影響範囲を確認しながら慎重に │ ▼ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ STEP 4: 効果測定 📊 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ・削減額を計測 ・経営層にレポート ・継続的なモニタリング体制を構築

📊 2. コスト分析(AWS編)

AWS Cost Explorerで分析

📝 Cost Explorerとは

【AWS Cost Explorer = 家計簿アプリ】 機能: ・サービス別のコスト内訳 ・日別/月別の推移グラフ ・予測コスト(来月いくらかかるか) ・リザーブド購入の提案 アクセス方法: AWSコンソール → 「Billing and Cost Management」 → 「Cost Explorer」 💡 有効化が必要(初回のみ) 有効化後、データが表示されるまで24時間かかる
# AWS Cost Explorer APIでコスト分析 import boto3 from datetime import datetime, timedelta ce = boto3.client(‘ce’, region_name=’us-east-1′) # Cost ExplorerはUS East固定 # 過去30日のコスト取得 end_date = datetime.now().date() start_date = end_date – timedelta(days=30) response = ce.get_cost_and_usage( TimePeriod={ ‘Start’: str(start_date), ‘End’: str(end_date) }, Granularity=’MONTHLY’, # DAILY, MONTHLY, HOURLY Metrics=[‘UnblendedCost’], # 実際の請求額 GroupBy=[ {‘Type’: ‘DIMENSION’, ‘Key’: ‘SERVICE’} # サービス別に集計 ] ) # サービス別コスト集計 print(“【AWSサービス別コスト(過去30日)】”) print(“=” * 50) costs = {} for result in response[‘ResultsByTime’]: for group in result[‘Groups’]: service = group[‘Keys’][0] cost = float(group[‘Metrics’][‘UnblendedCost’][‘Amount’]) costs[service] = costs.get(service, 0) + cost # コストが高い順に表示 for service, cost in sorted(costs.items(), key=lambda x: x[1], reverse=True)[:10]: print(f”{service}: ${cost:,.2f}”)
【分析結果】 AWSサービス別コスト(過去30日) ================================================== Amazon Redshift: $2,400.00 ← 最大! Amazon Simple Storage Service: $1,200.00 AWS Data Transfer: $900.00 AWS Glue: $600.00 Amazon CloudWatch: $300.00 AWS Lambda: $200.00 Amazon EC2: $150.00 Amazon Athena: $100.00 その他: $150.00 ————————————————– 合計: $6,000.00 💡 Redshiftが40%を占めている! ここを最優先で最適化すれば効果大!

詳細分析:Redshiftの使用状況

【Redshiftの使用状況分析】 ■ 現在の構成 ・クラスタタイプ: dc2.large ・ノード数: 4ノード ・稼働時間: 24時間/365日 ■ 実際の使用状況 ・クエリ実行時間帯: 平日9:00〜18:00のみ ・週末: ほぼ使用なし ・夜間: バッチ処理が2:00〜3:00の1時間のみ ■ 問題点 ・実質稼働: 週40時間(168時間中) ・稼働率: 24%しか使っていない! ・76%の時間は「動いているだけ」でお金を払っている 💡 改善ポイント ・使っていない時間は停止する ・リザーブドインスタンスで割引 ・必要なノード数を見直す

📊 3. コスト分析(GCP編)

GCP Billing Reportで分析

📝 GCPのコスト分析ツール

【GCPのコスト分析方法】 1️⃣ Cloud Console → 「Billing」 ・サービス別の内訳 ・日別の推移 2️⃣ Billing Export to BigQuery ・詳細な分析が可能 ・SQLでカスタム集計 3️⃣ Recommender(推奨事項) ・GCPが自動で最適化を提案 ・「このVMは使われてないから削除しては?」 💡 Billing Export設定手順 Console → Billing → Billing export → BigQuery export → プロジェクトとデータセットを指定
# GCP Billing ExportからBigQueryで分析 from google.cloud import bigquery client = bigquery.Client() # Billing Exportテーブルからコスト取得 query = “”” SELECT service.description AS service, SUM(cost) AS total_cost, SUM(usage.amount) AS total_usage FROM `your-project.billing_dataset.gcp_billing_export_v1_XXXXXX` WHERE DATE(_PARTITIONTIME) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) AND cost > 0 — 無料枠を除外 GROUP BY service ORDER BY total_cost DESC LIMIT 10 “”” results = client.query(query).result() print(“【GCPサービス別コスト(過去30日)】”) print(“=” * 50) for row in results: print(f”{row.service}: ${row.total_cost:,.2f}”)

📝 Billing Exportクエリを詳細解説

【SQLクエリの各部分を理解しよう】 FROM `your-project.billing_dataset.gcp_billing_export_v1_XXXXXX` │ │ │ │ │ └── テーブル名 │ │ ・v1_XXXXXX の XXXXXX は │ │  課金アカウントIDの一部 │ │ ・GCPが自動で名前を付ける │ │ │ └── データセット名 │ ・Billing Exportを設定した時に指定 │ ・例: billing_dataset, billing_data │ └── プロジェクトID ・Billing Exportを設定したプロジェクト ┌─────────────────────────────────────────────────────────┐ │ テーブル名の確認方法 │ ├─────────────────────────────────────────────────────────┤ │ 1. GCPコンソール → 「Billing」 │ │ 2. 左メニュー「Billing export」 │ │ 3. 「BigQuery export」タブ │ │ 4. 「Project」と「Dataset」を確認 │ │ 5. BigQueryコンソールでテーブル名を確認 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ WHERE DATE(_PARTITIONTIME) >= DATE_SUB(…) │ ├─────────────────────────────────────────────────────────┤ │ _PARTITIONTIME とは? │ │ ・BigQueryの特殊カラム(パーティション日時) │ │ ・テーブルがパーティション分割されている場合に使用 │ │ ・このカラムで絞り込むと、必要な日付だけスキャン │ │ ・クエリコスト削減に効果的! │ │ │ │ DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) │ │ ・今日から30日前の日付を計算 │ │ ・例: 今日が2025/1/15 → 2024/12/16 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ service.description AS service │ ├─────────────────────────────────────────────────────────┤ │ Billing Exportテーブルの構造 │ │ │ │ service:(STRUCT型 = 複数のフィールドを持つ) │ │ ├── id: サービスID(例: “6F81-5844-456A”) │ │ └── description: サービス名(例: “BigQuery”) │ │ │ │ → service.description でサービス名を取得 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ SUM(cost) AS total_cost │ ├─────────────────────────────────────────────────────────┤ │ cost カラム │ │ ・各利用レコードのコスト(USD) │ │ ・マイナスの場合もある(クレジット、割引など) │ │ │ │ SUM(cost) │ │ ・サービスごとに合計を計算 │ │ ・GROUP BY service と組み合わせて使用 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ AND cost > 0 │ ├─────────────────────────────────────────────────────────┤ │ なぜ必要? │ │ ・無料枠の利用は cost = 0 で記録される │ │ ・クレジットは cost < 0 で記録される │ │ ・実際の支払いコストだけを見たい場合に使用 │ │ │ │ 注意: │ │ ・クレジットを含めたい場合は条件を外す │ │ ・正確な請求額はcostとcreditsを両方考慮 │ └─────────────────────────────────────────────────────────┘

📝 Billing Exportテーブルの主要カラム

【よく使うカラム一覧】 ┌─────────────────────────────────────────────────────────┐ │ カラム名 │ 説明 │ ├───────────────────────┼─────────────────────────────────┤ │ service.description │ サービス名(BigQuery, GCS等) │ │ sku.description │ SKU名(詳細な利用内容) │ │ cost │ コスト(USD) │ │ usage.amount │ 使用量 │ │ usage.unit │ 使用量の単位(GB, hour等) │ │ project.id │ プロジェクトID │ │ labels │ ラベル(タグ)情報 │ │ credits │ クレジット(割引)情報 │ │ invoice.month │ 請求月(YYYYMM形式) │ └───────────────────────┴─────────────────────────────────┘ 【実践的なクエリ例】 — プロジェクト別コスト SELECT project.id AS project, SUM(cost) AS total_cost FROM `billing_table` GROUP BY project.id — 日別コスト推移 SELECT DATE(_PARTITIONTIME) AS date, SUM(cost) AS daily_cost FROM `billing_table` GROUP BY date ORDER BY date
【分析結果】 GCPサービス別コスト(過去30日) ================================================== BigQuery: $2,000.00 ← 最大! Cloud Storage: $800.00 Cloud Dataflow: $600.00 Compute Engine: $300.00 Cloud Pub/Sub: $150.00 Cloud Functions: $100.00 その他: $50.00 ————————————————– 合計: $4,000.00 💡 BigQueryが50%を占めている! クエリ最適化で大幅削減が可能!

詳細分析:BigQueryの使用状況

— BigQueryのクエリコスト分析 — INFORMATION_SCHEMAから高コストクエリを特定 SELECT user_email, query, total_bytes_processed / (1024*1024*1024) AS gb_processed, total_bytes_processed / (1024*1024*1024*1024) * 5 AS estimated_cost_usd, creation_time FROM `region-asia-northeast1`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE DATE(creation_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND job_type = ‘QUERY’ AND total_bytes_processed > 0 ORDER BY total_bytes_processed DESC LIMIT 20;
【BigQueryの問題点】 ■ 高コストクエリTOP3 1. SELECT * FROM large_table → 500GB/回 → $2.50/回 2. 日次バッチ(パーティションなし)→ 200GB/回 → $1.00/回 3. ダッシュボード更新(毎分) → 10GB/回 → $0.05/回 ■ 問題のパターン ❌ SELECT * を多用している ❌ パーティションプルーニングしていない ❌ 同じクエリを何度も実行している ❌ キャッシュが効いていない 💡 改善ポイント ・必要なカラムのみSELECT ・WHERE句でパーティション指定 ・マテリアライズドビュー活用 ・クエリ結果のキャッシュ利用

⚙️ 4. AWS最適化施策

施策1: Redshiftの一時停止スケジュール($1,200削減)

💡 例え話:エアコンのつけっぱなし

【Redshift24時間稼働 = エアコンつけっぱなし】 ■ 現状 ・会社を出る時もエアコンつけっぱなし ・週末も誰もいないのに動いている ・電気代が高い! ■ 改善 ・帰宅時に消す(夜間停止) ・週末は消す(休日停止) ・タイマーで自動ON/OFF 💡 Redshiftも同じ! ・使わない時間は停止 ・再開も数分で完了 ・停止中は課金されない
# Redshift自動停止/再開スクリプト import boto3 from datetime import datetime redshift = boto3.client(‘redshift’, region_name=’ap-northeast-1′) CLUSTER_ID = ‘my-analytics-cluster’ def pause_cluster(): “””Redshiftクラスターを一時停止””” try: response = redshift.pause_cluster( ClusterIdentifier=CLUSTER_ID ) print(f”✅ {datetime.now()}: クラスター停止開始”) return response except Exception as e: print(f”❌ エラー: {e}”) def resume_cluster(): “””Redshiftクラスターを再開””” try: response = redshift.resume_cluster( ClusterIdentifier=CLUSTER_ID ) print(f”✅ {datetime.now()}: クラスター再開開始”) return response except Exception as e: print(f”❌ エラー: {e}”) # Lambda + EventBridgeでスケジュール実行 # 平日 8:00 → resume_cluster() # 平日 20:00 → pause_cluster() # 土日は停止状態を維持

📝 EventBridgeスケジュール設定

【スケジュール設定例】 ■ 再開スケジュール(平日8:00 JST = 23:00 UTC前日) Cron式: cron(0 23 ? * SUN-THU *) ■ 停止スケジュール(平日20:00 JST = 11:00 UTC) Cron式: cron(0 11 ? * MON-FRI *) 【削減効果の計算】 元の稼働時間: 24時間 × 7日 = 168時間/週 新しい稼働時間: 12時間 × 5日 = 60時間/週 削減率: (168 – 60) / 168 = 64%削減! 元のコスト: $2,400/月 新しいコスト: $2,400 × 36% = $864/月 削減額: $1,536/月

施策2: S3ストレージクラス最適化($480削減)

# S3ライフサイクルポリシー設定 import boto3 import json s3 = boto3.client(‘s3’) lifecycle_policy = { ‘Rules’: [ { ‘ID’: ‘Archive old data’, ‘Status’: ‘Enabled’, ‘Filter’: {‘Prefix’: ‘raw/’}, # raw/フォルダに適用 ‘Transitions’: [ { ‘Days’: 30, ‘StorageClass’: ‘STANDARD_IA’ # 30日後にIA }, { ‘Days’: 90, ‘StorageClass’: ‘GLACIER_IR’ # 90日後にGlacier } ], ‘Expiration’: { ‘Days’: 365 # 1年後に削除 } }, { ‘ID’: ‘Delete old logs’, ‘Status’: ‘Enabled’, ‘Filter’: {‘Prefix’: ‘logs/’}, ‘Expiration’: { ‘Days’: 90 # ログは90日で削除 } } ] } s3.put_bucket_lifecycle_configuration( Bucket=’my-data-lake-bucket’, LifecycleConfiguration=lifecycle_policy ) print(“✅ ライフサイクルポリシーを適用しました”)
【S3ストレージクラス別料金(東京リージョン)】 Standard: $0.023/GB ← 今ここ Standard-IA: $0.0125/GB ← 30日後(46%安い) Glacier IR: $0.004/GB ← 90日後(83%安い) 削除: $0 ← 365日後 【削減効果の計算】 現在のデータ量: 500GB ・30日以内: 100GB → $2.30/月(Standard) ・30-90日: 200GB → $2.50/月(IA) ・90日以上: 200GB → $0.80/月(Glacier) 元のコスト: 500GB × $0.023 = $11.50/月 新しいコスト: $2.30 + $2.50 + $0.80 = $5.60/月 削減率: 51% ※ 大規模データなら効果はさらに大きい! 10TBなら月額$115 → $56($59削減)

施策3: リザーブドインスタンス購入($320削減)

【リザーブドインスタンスとは】 ■ オンデマンド(今の契約) ・使った分だけ払う ・いつでも解約できる ・一番高い ■ リザーブド(1年/3年契約) ・前払いで割引 ・1年契約: 約40%割引 ・3年契約: 約60%割引 ・途中解約できない 【Redshiftリザーブドノード】 dc2.large オンデマンド: $0.25/時間 dc2.large リザーブド1年: $0.15/時間(40%割引) 【削減効果】 稼働時間: 60時間/週 × 4週 = 240時間/月 オンデマンド: 240 × $0.25 = $60/ノード/月 リザーブド: 240 × $0.15 = $36/ノード/月 3ノード × ($60 – $36) = $72/月削減 ⚠️ 注意: 1年間解約できないので慎重に! まずは使用状況を3ヶ月観察してから購入推奨

🎯 AWS削減合計

【AWS最適化の効果】 施策1: Redshift一時停止 -$1,536 施策2: S3ライフサイクル -$480 施策3: リザーブド購入 -$320 施策4: 不要リソース削除 -$64 ──────────────────────────── 合計削減: -$2,400 元のコスト: $6,000/月 新しいコスト: $3,600/月 削減率: 40%

⚙️ 5. GCP最適化施策

施策1: BigQueryクエリ最適化($1,200削減)

💡 例え話:図書館で本を探す

【BigQueryクエリ = 図書館で本を探す】 ■ 悪い探し方(SELECT *) ・図書館の全ての本を1冊ずつ確認 ・目的の情報が1ページだけでも全部読む ・めちゃくちゃ時間(お金)がかかる ■ 良い探し方(パーティション活用) ・「2025年の本」の棚だけ見る ・必要な章だけ読む ・すぐ見つかる(安い) 💡 BigQueryは「読んだデータ量」で課金 $5/TB → 読む量を減らせばコストも減る!
— ❌ 悪い例(500GBスキャン → $2.50/回) SELECT * FROM `project.dataset.large_table` WHERE user_id = ‘user123’; — ✅ 良い例(5GBスキャン → $0.025/回) SELECT user_id, event_type, timestamp FROM `project.dataset.large_table` WHERE DATE(timestamp) = ‘2025-01-15’ — パーティション指定 AND user_id = ‘user123’; — 💡 100倍の差!

📝 BigQuery最適化テクニック

【コスト削減テクニック】 1️⃣ SELECT * を禁止 ❌ SELECT * FROM table ✅ SELECT col1, col2 FROM table → 必要なカラムだけ指定 2️⃣ パーティションプルーニング ❌ WHERE EXTRACT(DATE FROM timestamp) = ‘2025-01-15’ ✅ WHERE DATE(timestamp) = ‘2025-01-15’ → パーティションが効く書き方に 3️⃣ クラスタリング活用 → よく使うカラムでクラスタリング → WHERE句で指定するとスキャン量削減 4️⃣ マテリアライズドビュー → 頻繁に使う集計を事前計算 → 自動更新で常に最新 5️⃣ クエリキャッシュ活用 → 同じクエリは24時間キャッシュ → 2回目以降は$0! 【削減効果】 元のクエリコスト: $2,000/月 最適化後: $800/月 削減額: $1,200/月(60%削減)

施策2: GCSライフサイクル管理($320削減)

# GCSライフサイクル設定 from google.cloud import storage client = storage.Client() bucket = client.bucket(‘my-data-lake-bucket’) # 既存のルールをクリア bucket.lifecycle_rules = [] # 新しいルールを追加 rules = [ # 30日後にNEARLINE { ‘action’: {‘type’: ‘SetStorageClass’, ‘storageClass’: ‘NEARLINE’}, ‘condition’: {‘age’: 30, ‘matchesPrefix’: [‘raw/’]} }, # 90日後にCOLDLINE { ‘action’: {‘type’: ‘SetStorageClass’, ‘storageClass’: ‘COLDLINE’}, ‘condition’: {‘age’: 90, ‘matchesPrefix’: [‘raw/’]} }, # 365日後に削除 { ‘action’: {‘type’: ‘Delete’}, ‘condition’: {‘age’: 365, ‘matchesPrefix’: [‘logs/’]} } ] bucket.lifecycle_rules = rules bucket.patch() print(“✅ GCSライフサイクルを設定しました”)

施策3: コミットメント契約($480削減)

【GCPコミットメント(Committed Use Discounts)】 ■ BigQuery スロット予約 ・オンデマンド: $5/TB ・スロット予約(100スロット/月): 定額 ・月額$10,000以上のクエリがあるなら検討 ■ GCS コミットメント(新機能) ・1年契約で最大30%割引 ・3年契約で最大50%割引 ■ Compute Engine コミットメント ・Dataflow等のVMに適用 ・1年契約: 37%割引 ・3年契約: 55%割引 【今回の適用】 Dataflowワーカー: 2台常時稼働 オンデマンド: $600/月 コミットメント1年: $378/月 削減額: $222/月 GCS 500GB: オンデマンド: $10/月 コミットメント: $7/月 削減額: $3/月 ※ 大規模環境ほど効果大!

🎯 GCP削減合計

【GCP最適化の効果】 施策1: BigQueryクエリ最適化 -$1,200 施策2: GCSライフサイクル -$320 施策3: コミットメント契約 -$222 施策4: 不要リソース削除 -$258 ──────────────────────────── 合計削減: -$2,000 元のコスト: $4,000/月 新しいコスト: $2,000/月 削減率: 50%

📈 6. 効果測定とレポート

最終結果

項目 最適化前 最適化後 削減額
AWS $6,000 $3,600 -$2,400
GCP $4,000 $2,000 -$2,000
合計 $10,000 $5,600 -$4,400
【最終レポート】 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📊 クラウドコスト最適化プロジェクト 結果報告 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ 目標 ・月額コストを$10,000から$5,000以下に削減(50%削減) ■ 結果 ・最適化前: $10,000/月 ・最適化後: $5,600/月 ・削減額: $4,400/月(44%削減) ・年間削減額: $52,800 ■ 主な施策 【AWS】 ・Redshift一時停止スケジュール: -$1,536 ・S3ライフサイクル最適化: -$480 ・リザーブドインスタンス: -$320 ・不要リソース削除: -$64 【GCP】 ・BigQueryクエリ最適化: -$1,200 ・GCSライフサイクル: -$320 ・コミットメント契約: -$222 ・不要リソース削除: -$258 ■ 今後の施策 ・さらに$600削減で目標達成可能 ・Redshift Serverless移行検討 ・BigQuery定額プラン検討 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🎉 目標達成まであと一歩!

目標の50%削減($5,000)に対して、44%削減($5,600)を達成しました。
継続的な最適化で目標達成が見込めます!

🔄 7. 継続的なコスト管理

1️⃣ 定期モニタリング

  • 週次でコストレビュー
  • 異常値を即座に検知
  • 予算アラート設定
  • Slackに自動通知

2️⃣ タグ付け戦略

  • 部署別にタグ付け
  • プロジェクト別に集計
  • 責任者を明確化
  • チャージバック実施

3️⃣ 自動化

  • 未使用リソースの自動停止
  • スケール調整の自動化
  • レポートの自動生成
  • 異常検知アラート

予算アラートの設定

# AWS予算アラート設定 aws budgets create-budget \ –account-id 123456789012 \ –budget ‘{ “BudgetName”: “Monthly-Cloud-Budget”, “BudgetLimit”: { “Amount”: “5600”, “Unit”: “USD” }, “BudgetType”: “COST”, “TimeUnit”: “MONTHLY” }’ \ –notifications-with-subscribers ‘[{ “Notification”: { “NotificationType”: “ACTUAL”, “ComparisonOperator”: “GREATER_THAN”, “Threshold”: 80 }, “Subscribers”: [{ “SubscriptionType”: “EMAIL”, “Address”: “[email protected]” }] }]’ # GCP予算アラート設定 gcloud billing budgets create \ –billing-account=XXXXX-XXXXX-XXXXX \ –display-name=”Monthly-Cloud-Budget” \ –budget-amount=5600USD \ –threshold-rule=percent=50 \ –threshold-rule=percent=80 \ –threshold-rule=percent=100

📝 8. STEP 29 のまとめ

✅ このプロジェクトで達成したこと

  • コスト可視化:Cost Explorer / Billing Reportで現状を把握
  • AWS最適化:Redshift停止、S3ライフサイクル、リザーブドで$2,400削減
  • GCP最適化:BigQueryクエリ最適化、コミットメントで$2,000削減
  • 合計$4,400/月削減(44%削減、年間$52,800の節約)
  • 継続的なコスト管理:予算アラート、自動化の仕組み構築

💡 次のステップへ

これで実践的な4つのプロジェクトが完了しました!

最後のSTEP 30では、学習の総まとめとキャリアパスを解説します。
クラウド認定資格や、さらに学ぶべき技術についても紹介します!

❓ よくある質問

Q1: コスト最適化で性能が落ちることはない?
適切に行えば落ちません。今回の施策は「使っていない時間の停止」「効率的なクエリへの書き換え」が中心で、必要な処理性能は維持しています。ただし、リソース削減は慎重に行い、性能テストを実施しましょう。
Q2: リザーブドインスタンスは本当にお得?
使用状況によります。24時間365日稼働するリソースなら確実にお得です。ただし、使用量が変動する場合は損することも。まずは3ヶ月程度の使用状況を分析してから購入を検討しましょう。
Q3: BigQueryの定額プランはいつ使うべき?
月額$10,000以上のクエリコストがある場合に検討します。100スロット/月の定額プランは約$2,000〜。これ以上クエリを実行するなら定額の方がお得です。少量なら従量課金の方が安いです。
Q4: コスト最適化は誰の仕事?
データエンジニア全員の責任です。クエリを書く人がSELECT *を使えばコストが上がります。FinOps(Financial Operations)という考え方では、エンジニアも含めた全員がコストを意識することが重要とされています。
Q5: Savings PlansとReserved Instancesの違いは?
柔軟性の違いです。Reserved Instancesは特定のインスタンスタイプに固定。Savings Plansは使用量(ドル/時間)をコミットするので、インスタンスタイプを変更しても割引が適用されます。新規導入ならSavings Plansがおすすめです。