こんにちは。クラウドの深淵を覗くエンジニアの皆さん。
インフラをコードで定義する(IaC)時代において、私たちは「構築のスピード」ばかりを追求しがちです。しかし、真のプロフェッショナルは「デプロイボタンを押す前に、そのコードがいくらの火種を抱えているか」を可視化しています。
「月末にAWSから届く予想外の請求書に震える」――そんな悲劇を過去のものにするための、プロアクティブなコストガードレール構築術を伝授しましょう。
—
1. なぜ「デプロイ前のコスト予測」が重要なのか?
CloudFormationでリソースを定義するのは簡単です。しかし、`AWS::RDS::DBInstance`のインスタンスタイプを一つ間違えるだけで、あるいはMulti-AZのフラグをオンにするだけで、月額コストは数万円単位で跳ね上がります。
後から「間違えました」では済みません。「デプロイ前にポリシー違反として弾く」ことこそが、SREとしての正義です。今回は、CloudFormation Guardを用いてテンプレートを静的解析し、コストに直結する設定をCI/CDの段階で検閲する仕組みを作ります。
—
2. ツールセットの準備
今回の戦略の核は、以下の2つです。
- CloudFormation Guard: IaCのテンプレートをDSLで検証するツール。ポリシーに反するコードはデプロイさせない。「門番」の役割です。
- Pythonスクリプト: AWS Cost Explorer APIを叩き、現在の予算状況をCI/CDパイプラインに通知する「監視役」。
インストール(環境構築)
まずは、ローカルマシン(またはCI環境)にガードマンを配置しましょう。
CloudFormation Guardのインストール
brew install cloudformation-guard # macOSの場合
Pythonの依存関係(Cost Explorer用)
pip install boto3
—
3. 実践:コストを制御する「門番」の実装
まずは、高額リソースを勝手に使わせないためのガードルール(`cost_guard.rules`)を作成します。
cost_guard.rules
RDSは特定の小規模インスタンスタイプ以外を禁止する
rule check_rds_instance_size {
Resources.[ Type == ‘AWS::RDS::DBInstance’ ] {
Properties.DBInstanceClass IN [‘db.t3.micro’, ‘db.t3.small’]
}
}
このルールをテンプレートに当てはめると、誰かが勝手に `db.r6g.large` を定義した瞬間にデプロイが停止します。
—
4. 【極秘】CI/CDパイプラインへのPython自動化スクリプト
ここからが本題です。Cost Explorer APIを使い、現時点での月間予想コストが予算を超過しそうならデプロイを止めるPythonスクリプトです。
import boto3
from datetime import datetime, timedelta
def get_monthly_forecast():
client = boto3.client(‘ce’)
# 今月の予想コストを取得
start = datetime.now().replace(day=1).strftime(‘%Y-%m-%d’)
end = (datetime.now() + timedelta(days=30)).replace(day=1).strftime(‘%Y-%m-%d’)
response = client.get_cost_forecast(
TimePeriod={‘Start’: start, ‘End’: end},
Metric=’UNBLENDED_COST’,
Granularity=’MONTHLY’
)
return float(response[‘Total’][‘Amount’])
予算閾値(ドル)
BUDGET_LIMIT = 500.0
def validate_cost():
forecast = get_monthly_forecast()
print(f”現在の月間予想コスト: ${forecast:.2f}”)
if forecast > BUDGET_LIMIT:
print(“警告: 予算超過の恐れがあります!デプロイを中断します。”)
exit(1) # ここでCIを失敗させる
print(“コスト基準OK。デプロイを続行します。”)
if __name__ == “__main__”:
validate_cost()
—
5. 現場で震えるほど役立つ運用フロー
この仕組みをGitHub ActionsやGitLab CIに組み込むときは、以下の順序でステップを構成してください。
1. 静的解析フェーズ: `cfn-guard check -r cost_guard.rules -d template.yaml`
- これで「設定ミス」を排除。
2. 予算判定フェーズ: `python check_budget.py`
- これで「ビジネス的な許容範囲」を判定。
3. デプロイ実行: `aws cloudformation deploy …`
この3段構えを構築するだけで、あなたのインフラ管理は劇的に堅牢になります。
最後に
「自動化」とは、単に手作業を減らすことではありません。「人間が犯すミスを、機械が先回りして防ぐ環境を作ること」です。
今回紹介した手法は、最初は少しの手間かもしれませんが、これが一度定着すれば、あなたは「コストの番人」としてチームから絶大な信頼を寄せられることになります。明日のデプロイからは、ぜひ「コストガード」を忘れずに。
何かあれば、いつでもコードの深淵で相談に乗りますよ。健闘を祈ります。