※本記事は [ストックリスト:AWS CLIでゼロから構築するWeb監視システム&自動コスト防衛] の第3弾です。
1. はじめに
👉 [前回の記事] https://qiita.com/4eena/items/b2225d1399d482c0ba27
AWSでWebサイトやモニタリングシステムを構築する際、誰もが恐れるのが**「予期せぬ課金や破産(クラウドアラート見落としによる破産)」**です。
多くの記事では「AWS Budgetsでアラートメールを飛ばす」ところで終わりますが、**「メールに気づかなかったら結局課金される」**というリスクが残ります。
そこで本記事では、**「予算上限($1.00や無料枠の80%)に達した瞬間、システム自らが定期実行ルールを無効化(DisableRule)して自動停止する『セルフヒーリング/フェイルセーフ機構』」**をAWS CLIのみで一撃構築する手順を解説します。
2. システム構成とガードレールアーキテクチャ
🌐 ① メインシステム(Webモニタリング&配信)
-
EventBridge (
check-site-status-rule): 5分おきに定期実行 -
Lambda (
check-site-status): サイト死活チェック&HTML生成 - S3: 生成された静的コンテンツの格納
- CloudFront: キャッシュ配信(高速・無料枠内での配信)
🛡️ ② コスト防衛ガードレール(自律停止機構)
- AWS Budgets: 毎月の予算(例: $1.00)およびアラート閾値を監視
-
Amazon SNS (
budget-alert-topic): 予算超過メッセージの受取&中継 -
番犬Lambda (
budget-guardrail-lambda): SNSトリガーで起動し、events:DisableRuleAPIを実行 -
対象ルール:
check-site-status-ruleをDISABLEDに変更して定期実行を即座に遮断
3. 主な構築コマンド(AWS CLI / CloudShell)
※マネジメントコンソールを使わず、再現性の高いCLI/IaCアプローチで構築します。
① 防衛用Lambda(budget-guardrail-lambda)のコード
import json
import boto3
import os
events = boto3.client('events')
RULE_NAME = os.environ.get('TARGET_RULE_NAME', 'check-site-status-rule')
def lambda_handler(event, context):
print("Received event:", json.dumps(event))
print(f"Target rule to disable: {RULE_NAME}")
try:
response = events.disable_rule(Name=RULE_NAME)
print("Successfully disabled rule:", response)
return {
'statusCode': 200,
'body': json.dumps(f'Rule {RULE_NAME} disabled successfully.')
}
except Exception as e:
print(f"Error disabling rule: {str(e)}")
raise e
② 環境変数の設定コマンド例
aws lambda update-function-configuration \
--function-name budget-guardrail-lambda \
--environment "Variables={TARGET_RULE_NAME=check-site-status-rule}"
4. 動作検証(テストと目視確認)
構築して終わりではなく、**「本当に自律停止するか」**を目視確認・ログ検証します。
① 手動テストの実行
# 1. 現在の状態を確認 (ENABLED)
aws events describe-rule --name check-site-status-rule --query "State" --output text
# 2. ガードレールLambdaを擬似実行(予算超過アラート模倣)
aws lambda invoke --function-name budget-guardrail-lambda response.json
# 3. ルールが自動停止したか確認 (DISABLED)
aws events describe-rule --name check-site-status-rule --query "State" --output text
② コンソール・ログでのダブルチェック(検証エビデンス)
-
EventBridge コンソール: 「スケジューラ / クラシックイベントルーティング」上のルール状態が緑の
有効から即座に無効に切り替わることを確認。 -
CloudWatch Logs:
/aws/lambda/budget-guardrail-lambda内に以下の成功ログが記録されていることを確認。Target rule to disable: check-site-status-rule
Successfully disabled rule: {'ResponseMetadata': {'HTTPStatusCode': 200...}}
5. まとめ・工夫したポイント
- 「人間頼みの運用」からの脱却: メール通知だけでなく、システム自らがリソースを止めるアーキテクチャを実現。
- CLI駆動の再現性: すべての構築手順をCLI化することで、他プロジェクトへの水平展開や自動化が容易。
- 依存関係の分離: 配信側(CloudFront/S3)は生かしたまま、課金元となる「定期トリガー(EventBridge)」のみをピンポイントで止める最小限の影響範囲設計。
