Contents
1. はじめに – なぜコスト管理が必要か
AWS は 従量課金制 であるため、使った分だけ請求されます。
しかし、リソースを「作って放置」したままだと見えない費用が積み重なりやすく、月額数万円~数百万円規模の無駄遣いになることがあります。
- 可視化:どのサービス・タグ・期間で費用が発生しているかを把握する。
- 予算管理:設定した上限を超えたら自動で通知し、早期に対策できるようにする。
- 最適化:実際の使用量に合わせてインスタンスタイプや購入オプション(スポット・RI・Savings Plans)を見直す。
本稿は「AWS を初めて使う人」でも理解できるよう、専門用語の解説と具体的な手順を交えて説明します。
2. Cost Explorer の概要と設定手順
2‑1. 用語解説
| 用語 | 意味 |
|---|---|
| Cost Explorer | 過去の請求データをグラフや表で可視化できる AWS のサービス。 |
| メトリクス | リソースごとに記録される利用量・課金情報(例:EC2 の「使用時間」)。 |
| タグ | Key=Value 形式でリソースに付与し、コスト配分や検索に利用できるメタデータ。 |
2‑2. 有効化手順
※この操作は ルートアカウントまたは Billing 権限が付与された IAM ユーザー が行う必要があります。
- AWS Management Console にサインイン → 画面右上の 「サービス」 メニューから 「Billing」 を選択。
- 左側メニューの 「Cost Explorer」 をクリックし、「Enable Cost Explorer」 ボタンを押す。
- 有効化後、最初の集計に 12〜24 時間程度かかります。
- 「Reports」 タブで 「Create report」 → 「Usage type」「Service」など分析したい項目を選択。
- 必要に応じて フィルター にタグ(例:
Environment=Production)や期間(例:Last 30 days、Custom range)を設定。 - 作成したレポートは右上の 「Download CSV」 でローカルに保存し、Excel 等で詳細分析が可能です。
2‑3. ポイント
- デフォルトビュー はサービス別合計費用ですが、タグや使用タイプ(例:
BoxUsage:t3.medium)で絞り込むと「どのプロジェクトがコストを食っているか」が瞬時に分かります。 - 保存したレポート は自動で毎日更新されるので、定期的なレビューに最適です。
参考: AWS公式ドキュメント – Cost Explorer の使用方法
3. AWS Budgets の概要と設定手順
3‑1. 用語解説
| 用語 | 意味 |
|---|---|
| AWS Budgets | 月次・年次の予算上限を設定し、超過時にメールや SNS で通知できるサービス。 |
| アラート閾値 | 予算の何%に達したときに通知するかを決める数値(例:80%)。 |
3‑2. 設定手順
- Billing コンソール左メニューから 「Budgets」 を選択。
- 「Create budget」 → 「Cost budget」→ 次へ。
- 予算額(例:¥500,000)と期間(毎月・四半期など)を入力し、「Configure alerts」 で以下を設定
- 80% 到達時 → メール通知
- 100% 超過時 → SNS トピックにメッセージ送信(Slack と連携可)
- フィルター にタグやサービスを指定すれば、部門別・プロジェクト別の予算管理が可能。
- 作成完了後は 「Budgets Dashboard」 に現在の実績と残額がリアルタイムで表示されます。
3‑3. ポイント
- 予算上限はハードリミットではなくアラートです。超過したら自動でリソースを停止する仕組みは別途 Lambda 等で実装します(次章参照)。
- 複数の予算 を作成すれば、全体予算と部門ごとのサブ予算を同時に管理できます。
参考: AWS公式ドキュメント – AWS Budgets の概要
4. タグ付け戦略と IAM ポリシーのベストプラクティス
4‑1. なぜ「タグ」が重要か
- コスト配分:Cost Explorer のフィルターでタグ単位に集計できる。
- 自動化トリガー:AWS Config や Lambda が「タグが付いていない」リソースを検出し、削除や停止のアクションを起こすことができる。
4‑2. 推奨するタグキー(例)
| タグキー | 用途 |
|---|---|
Project |
プロジェクト名(例:MyApp) |
Environment |
Production / Staging / Development |
Owner |
担当者の IAM ユーザー名または部門コード |
CostCenter |
経費科目や部門番号 |
タグ付与を徹底する方法
- CloudFormation / CDK のテンプレートに必須タグパラメータを組み込む。
- AWS Config ルール 「required-tags」を有効化し、違反リソースが作成されたら自動で非稼働状態にする。
|
1 2 3 4 5 6 7 8 9 10 |
{ "ConfigRuleName": "required-tags", "Scope": { "ComplianceResourceTypes": ["AWS::EC2::Instance","AWS::RDS::DBInstance"] }, "Source": { "Owner": "AWS", "SourceIdentifier": "REQUIRED_TAGS" }, "InputParameters": "{\"tag1Key\":\"Project\",\"tag2Key\":\"Environment\"}" } |
4‑3. IAM ポリシーで「タグ必須」ルールを実装(正しい例)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:RunInstances", "rds:CreateDBInstance" ], "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:RequestTag/Project": "${aws:username}", "aws:RequestTag/Environment": ["Production","Staging","Development"] } } }, { "Effect": "Allow", "Action": [ "tag:GetResources", "tag:TagResources" ], "Resource": "*" } ] } |
- ポイント
StringNotEqualsIfExistsにより、リクエストに必須タグが無い場合は Deny が適用されます。aws:username(実行ユーザー名)を使えば「自分が所有するプロジェクト」だけ作成可能にできます。
注意: AWS には「費用ベースの条件キー」は存在しません(例:
aws:RequestedRegionCostは無効)。コスト上限でリソース作成を制御したい場合は、Budgets + Lambda の連携が推奨されます。
5. リソース最適化:サイズ変更・スポット・予約/ Savings Plans
5‑1. インスタンスのリサイズ(実績に基づくダウングレード)
| 手順 | 内容 |
|---|---|
| ① | CloudWatch メトリクスで CPU 使用率、メモリ使用率(CloudWatch エージェント)を取得。 |
| ② | 平均使用率が 30 % 以下 の場合は同クラスの小型インスタンスへ変更を検討。 |
| ③ | テスト環境で ステージングデプロイ → パフォーマンスに問題なければ本番に適用。 |
実例(2023 年度実績)
- EC2 t3.large → t3.medium:月額 ¥12,000 削減(約 22 %)。
- RDS db.m5.large → db.t3.medium:月額 ¥9,500 削減(約 15 %)。
根拠: AWS の公式料金表に基づく計算(Amazon EC2 Pricing)。実際の削減率は使用パターン次第です。
5‑2. スポットインスタンス活用
- スポットとは:AWS が余っているキャパシティを最大 90 %(オンデマンド価格に対して) の割引で提供。実際の割引率はリージョン・時間帯により変動し、70 % 前後が一般的な上限です【※AWS Documentation】。
- 適用対象:バッチ処理、データ解析、CI/CD ジョブなど「途中で停止しても再実行できる」ワークロード。
実装フロー
- 対象ジョブを Auto Scaling Group(ASG) の Launch Template に
InstanceMarketOptionsで Spot 設定。 - Capacity Rebalancing を有効化し、スポットが回収される前に新しいインスタンスへ自動置換。
- 必要なら On‑Demand フォールバック(最大 20 % のキャパシティは On‑Demand に切り替える)を設定。
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "LaunchTemplateName": "my-spot-template", "InstanceMarketOptions": { "MarketType": "spot", "SpotOptions": { "MaxPrice": "0.03", // 上限価格(USD/時間) "InstanceInterruptionBehavior": "terminate" } } } |
5‑3. Reserved Instances (RI) と Savings Plans の選び方
| 購入形態 | 割引率(最大) | 特徴 |
|---|---|---|
| Standard RI(1 年・3 年) | 72 %(All Upfront) | インスタンスタイプ・リージョン固定。長期安定稼働に最適。 |
| Convertible RI(1 年・3 年) | 54 %(All Upfront) | インスタンスファミリ変更可能だが、割引率はやや低め。 |
| Compute Savings Plans | 66 %(All Upfront) | EC2、Fargate、Lambda の使用量全体に適用可。インスタンスタイプ・リージョンの柔軟性あり。 |
| EC2 Instance Savings Plans | 72 %(All Upfront) | 対象は特定インスタンスファミリのみだが、RI と同等の割引率。 |
根拠: AWS の公式ページに記載された「最大割引率」【AWS Documentation – Savings Plans】。実際の割引は購入時点のオンデマンド価格と使用量によって変わります。
選定チェックリスト
- 稼働パターンが安定か → RI または Compute Savings Plans(3 年契約がおすすめ)。
- インスタンスファミリを頻繁に変更する可能性 → Compute Savings Plans が柔軟。
- 予算が確保できるか → 「All Upfront」購入で最大割引率を取得(キャッシュフローに余裕がある場合)。
6. 自動化で継続的削減を実現する方法
6‑1. Lambda + EventBridge によるスケジュール停止・起動
用語解説
- Lambda:サーバーレスでコードを実行できるサービス。
- EventBridge(旧 CloudWatch Events):時間やイベントに応じてターゲット(Lambda 等)を自動起動できる。
実装例(Python 3.9)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import boto3 ec2 = boto3.client('ec2') def lambda_handler(event, context): # タグ AutoStop=true が付いたインスタンスを取得 resp = ec2.describe_instances( Filters=[{'Name': 'tag:AutoStop', 'Values': ['true']}] ) ids = [i['InstanceId'] for r in resp['Reservations'] for i in r['Instances']] if not ids: return {'status': 'no instances'} # EventBridge のイベント種別で停止/起動を分岐 if event.get('detail-type') == 'Scheduled Event': ec2.stop_instances(InstanceIds=ids) return {'status': f'stopped {len(ids)} instances'} else: ec2.start_instances(InstanceIds=ids) return {'status': f'started {len(ids)} instances'} |
設定手順
1. IAM ロールに ec2:StopInstances / ec2:StartInstances 権限を付与。
2. Lambda 関数作成 → 上記コード貼り付け → 保存。
3. EventBridge で以下のような cron 式 を設定
- 停止:cron(0 22 ? * MON-FRI *)(平日 22:00 に停止)
- 起動:cron(0 6 ? * MON-FRI *)(平日 06:00 に起動)
ポイント:タグ
AutoStop=trueが付いていないインスタンスは対象外になるため、テスト環境だけに適用可能。
6‑2. Trusted Advisor と Compute Optimizer の活用
| サービス | 主な機能 | 有効化手順 |
|---|---|---|
| Trusted Advisor(Business/Enterprise) | コスト最適化、セキュリティ、耐障害性のベストプラクティスチェック。 | Support コンソール → Trusted Advisor → 「Cost Optimizing」カテゴリを有効化。 |
| Compute Optimizer | 24 時間以上データ収集し、機械学習で最適インスタンスタイプと削減見込額を提示。 | Compute Optimizer コンソール → 「Get started」→ 対象リソース(EC2, ASG, EBS, Lambda)選択 → データ取得完了後に「Recommendations」を確認。 |
- 実装のヒント
- Trusted Advisor の Idle Load Balancers と Underutilized EC2 Instances は、即座に停止/削除できる候補です。
- Compute Optimizer の推奨は「Potential Savings」として金額が表示されるので、優先順位付けに活用できます。
参考: AWS Documentation – Trusted Advisor、Compute Optimizer
7. 組織単位のガバナンス(AWS Organizations & SCP)
7‑1. 基本概念
| 用語 | 意味 |
|---|---|
| AWS Organizations | 複数アカウントを一元管理し、請求・ポリシーを集中化できるサービス。 |
| OU(Organizational Unit) | アカウントの階層的なグループ。例:Finance、Engineering。 |
| SCP(Service Control Policy) | OU やアカウント単位で許可・拒否できる上位レベルのポリシー。IAM ポリシーよりも強い制約を掛けられる。 |
7‑2. 設定フロー
- Organizations の作成
-
コンソール → “AWS Organizations” → “Create organization”。デフォルトで「All features」モード(SCP が利用可能)に設定。
-
OU の構築
text
Root
├─ Finance
├─ Engineering
│ ├─ Dev
│ └─ Prod
└─ R&D - SCP の作成例(サービス制限)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:RunInstances", "rds:CreateDBInstance" ], "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:RequestedRegion": ["ap-northeast-1", "us-east-1"] } } } ] } |
ポイント
- SCP は「Deny が優先」なので、たとえ個別 IAM ポリシーで許可されていても上記条件に合致すれば実行できません。
- コストベースの制御は直接できないため、Budgets + SNS + Lambda で「予算超過時に対象アカウントを一時的に無効化」する仕組みと併用します。
- Consolidated Billing の活用
- 各子アカウントの Budgets は Organizations の “Billing” ダッシュボードで一括表示でき、全体予算超過時はルートアカウントに通知が届くよう設定可能です。
参考: AWS Documentation – AWS Organizations User Guide
8. サードパーティーツール比較と導入ステップ
| ツール | 主な機能 | 料金体系(目安) | 学習コスト | 推奨シーン |
|---|---|---|---|---|
| CloudHealth by VMware | コスト可視化、リソース最適化提案、タグポリシー自動化、予算管理 | 従量課金($0.10/インスタンス 時間単位) | UI が豊富で学習曲線やや高め | 大規模マルチアカウント・ハイブリッド環境 |
| CloudCheckr | コスト削減、セキュリティ・コンプライアンスレポート、SCP 生成支援 | $0.08/リソース(月額最低 $200) | 初期設定がやや複雑 | 中小企業でも予算超過防止に有効 |
| AWS 公式(Cost Explorer + Budgets) | 基本的な可視化・アラート、AWS サービスとのシームレス連携 | 無料(使用量に応じた課金なし) | UI がシンプルで学習コスト最小 | コスト管理の第一歩として必須 |
導入ステップ
- ベースライン取得
- Cost Explorer と Budgets を有効化し、過去 3 ヶ月分の費用を把握。
- タグポリシーと IAM 制御の整備(第4章参照)。
- インスタンスリサイズ・スポット導入(第5章)。
- 自動化スクリプト(Lambda + EventBridge) をデプロイし、夜間停止を実装。
- Trusted Advisor と Compute Optimizer のレポートで未使用リソースを洗い出す。
- 必要に応じてサードパーティーツール導入:コスト分析が手作業でも追いつかない場合は CloudHealth 等を試用。
9. まとめ・次のアクション
| 項目 | 今すぐできること |
|---|---|
| 可視化 | Cost Explorer を有効にし、タグ別レポートを作成。 |
| 予算管理 | AWS Budgets で月次上限と通知設定(80 % / 100 %)。 |
| タグ付与 | 必須タグ (Project, Environment 等) を CloudFormation に組み込み、AWS Config の required-tags ルールを有効化。 |
| 最適化 | CloudWatch メトリクスでインスタンス利用率を確認し、過剰スペックをダウングレード。スポットインスタンスはバッチジョブに導入。 |
| 自動化 | Lambda + EventBridge で「業務時間外停止」スクリプトをデプロイ。 |
| ガバナンス | Organizations を作成し、OU ごとに SCP(サービス制限)を適用。Budgets の集約表示で全体予算を監視。 |
最終的な目標は「見える化 → 予算設定 → 自動抑止 → 継続的改善」のサイクルを回すことです。このフローを社内の DevOps プロセスに組み込めば、AWS コストは 30 %〜50 % 程度削減できるケースが多数報告されています(実績は各社環境に依存)。まずは「Cost Explorer の有効化」から始めてみましょう。
本稿の情報は 2024 年 3 月時点の AWS 公開ドキュメントを元に作成しています。サービス仕様や価格は予告なく変更されることがありますので、最新情報は公式ページをご確認ください。