AWSフリーティア超過を防ぐ:CloudWatch請求アラームで$5超えをメール通知する設定手順
AWSアカウントを作成したばかりのとき、フリーティアの範囲内で収まっているつもりが、月末に予想外の請求が届いた——そういう経験をしたエンジニアは少なくない。CloudWatchの請求アラームを使えば、推定料金が指定した閾値を超えた時点でメール通知を受け取れる。この記事では、推定料金が$5を超えた場合にアラートを送る設定を、CLIとコンソール両方の手順で解説する。
TL;DR:請求アラーム設定の概要
| 手順 | 内容 | 注意点 |
|---|---|---|
| 1. 請求アラートを有効化 | アカウントの請求設定でモニタリングを有効にする | us-east-1リージョン限定の操作 |
| 2. SNSトピック作成 | メール通知用のSNSトピックとサブスクリプションを作成 | サブスクリプション確認メールへの承認が必要 |
| 3. CloudWatchアラーム作成 | EstimatedChargesメトリクスに$5の閾値を設定 | メトリクスはus-east-1にのみ存在する |
| 4. 動作確認 | アラームの状態とSNS連携を確認 | メトリクスデータは数時間遅延する場合がある |
請求アラームの仕組みを理解する
CloudWatchの請求アラームは、AWSが内部で集計する推定請求額(EstimatedCharges)メトリクスを監視する。このメトリクスはAWSサービス全体の推定コストを反映しており、us-east-1リージョンにのみ存在する。他のリージョンでは参照できないため、アラームの作成もus-east-1で行う必要がある。
メトリクスの更新頻度はおおよそ数時間ごとであり、リアルタイムの課金状況を反映するものではない。あくまで推定値であることを前提に運用する必要がある。
通知の経路はSNS(Simple Notification Service)を経由する。CloudWatchアラームがSNSトピックにメッセージをパブリッシュし、そのトピックにサブスクライブしたメールアドレスへ通知が届く。
EC2 / S3 など"] --> B["推定料金を集計
数時間ごとに更新"] B --> C["EstimatedCharges
メトリクス (us-east-1)"] C --> D["CloudWatchアラーム
閾値: $5"] D -->|"閾値超過"| E["ALARM状態に遷移"] E --> F["SNSトピックへ
メッセージ送信"] F --> G["メール通知受信"]
- AWSサービス利用:EC2、S3などの利用料金が発生する
- 推定料金の集計:AWSが内部でEstimatedChargesメトリクスを更新(数時間ごと)
- CloudWatchが監視:設定した閾値($5)と比較する
- アラーム状態に遷移:閾値を超えるとALARM状態になる
- SNSへ通知:SNSトピックにメッセージがパブリッシュされる
- メール受信:サブスクライブしたアドレスにメールが届く
前提条件:請求アラートの有効化
CloudWatchで請求メトリクスを利用するには、まずアカウントレベルで請求アラートを有効化する必要がある。この設定はAWSマネジメントコンソールのアカウント設定から行う。CLIで直接この設定を変更するAPIは現時点では提供されていないため、コンソールから操作する。
手順:
- AWSマネジメントコンソールにルートユーザーまたは請求情報へのアクセス権を持つIAMユーザーでサインインする
- 右上のアカウント名をクリックし、「請求とコスト管理」を選択する
- 左メニューから「請求設定」を開く
- 「CloudWatch請求アラートを受け取る」にチェックを入れて保存する
この設定はアカウント全体に適用される一度きりの操作だ。有効化後、EstimatedChargesメトリクスがus-east-1に表示されるまで数時間かかることがある。
ステップ1:SNSトピックとサブスクリプションを作成する
CloudWatchアラームが通知を送るためのSNSトピックを先に作成する。アラームを先に作ってしまうと、通知先が未確定のまま設定が完了してしまう。SNSのサブスクリプション確認(メールへの承認リンクのクリック)が完了していないと、実際にアラームが発火しても通知が届かない。
# SNSトピックを作成する(us-east-1で実行すること)
aws sns create-topic \
--name billing-alert-topic \
--region us-east-1
コマンドの出力にTopicArnが含まれる。次のステップで使用するため、この値を控えておく。
# メールアドレスをサブスクライブする
# TopicArnは上のコマンドで取得した値に置き換えること
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
--protocol email \
--notification-endpoint your-email@example.com \
--region us-east-1
コマンド実行後、指定したメールアドレスにAWSから確認メールが届く。メール内の「Confirm subscription」リンクをクリックして承認を完了させる。この承認が完了するまで、SNSはそのアドレスへの通知を送信しない。
ステップ2:CloudWatch請求アラームを作成する
SNSサブスクリプションの確認が完了したら、CloudWatchアラームを作成する。EstimatedChargesメトリクスはus-east-1にのみ存在するため、アラームも必ずus-east-1で作成する。他のリージョンで作成しようとしてもメトリクスが見つからない。
aws cloudwatch put-metric-alarm \
--alarm-name "FreeTierBillingAlarm" \
--alarm-description "推定料金が$5を超えた場合に通知する" \
--metric-name EstimatedCharges \
--namespace AWS/Billing \
--statistic Maximum \
--period 86400 \
--threshold 5 \
--comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
--dimensions Name=Currency,Value=USD \
--treat-missing-data notBreaching \
--region us-east-1
各パラメータの意図を補足する:
- --period 86400:評価期間を86400秒(24時間)に設定する。EstimatedChargesは頻繁に更新されないため、短い期間を設定しても意味がない
- --statistic Maximum:期間内の最大値で評価する。請求額の監視には最大値が適切
- --treat-missing-data notBreaching:メトリクスデータが存在しない場合(アカウント作成直後など)にアラームがALARM状態にならないようにする
- --dimensions Name=Currency,Value=USD:通貨をUSDに指定する。このディメンションは必須
ステップ3:アラームの状態を確認する
アラームを作成した直後は、メトリクスデータが不足しているためINSUFFICIENT_DATA状態になることがある。これは正常な動作だ。数時間後にEstimatedChargesメトリクスが更新されると、OK状態またはALARM状態に遷移する。
aws cloudwatch describe-alarms \
--alarm-names "FreeTierBillingAlarm" \
--region us-east-1
出力のStateValueフィールドで現在の状態を確認できる。OK、ALARM、INSUFFICIENT_DATAのいずれかが返る。
IAMポリシー:必要な権限
IAMユーザーでこれらの操作を行う場合、以下の権限が必要になる。ルートユーザーでの日常操作は推奨されないため、専用のIAMユーザーまたはロールで操作することを前提にしている。
🔽 IAMポリシーの例(クリックして展開)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SNSOperations",
"Effect": "Allow",
"Action": [
"sns:CreateTopic",
"sns:Subscribe",
"sns:ListTopics"
],
"Resource": "*"
},
{
"Sid": "CloudWatchBillingAlarm",
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricAlarm",
"cloudwatch:DescribeAlarms",
"cloudwatch:GetMetricStatistics"
],
"Resource": "*"
}
]
}
なお、請求設定の変更(請求アラートの有効化)はIAMポリシーだけでなく、アカウントレベルの請求情報へのアクセス許可も必要になる。IAMユーザーに請求情報へのアクセスを許可するには、アカウントのルートユーザーがIAMアクセスの有効化を行う必要がある。
よくある失敗パターン:メトリクスが見つからない
アラームを作成したのにINSUFFICIENT_DATAのまま変化しない、あるいはCLIでメトリクスを確認しようとしても何も返ってこない——この状況に陥ったとき、最初に疑うのはリージョンの指定ミスだ。
実際にあった誤りのパターン:ap-northeast-1(東京リージョン)でアラームを作成してしまい、EstimatedChargesメトリクスが永遠に見つからない。コンソールで確認するとアラームは存在するが、メトリクスとの紐付けが機能していない状態になる。
正しい診断手順:
# us-east-1でEstimatedChargesメトリクスが存在するか確認する
aws cloudwatch list-metrics \
--namespace AWS/Billing \
--metric-name EstimatedCharges \
--region us-east-1
このコマンドがメトリクスを返さない場合、請求アラートが有効化されていないか、有効化後の反映待ちの可能性がある。us-east-1以外のリージョンで実行しても結果は返らない。
もう一つの見落としやすいポイント:SNSサブスクリプションの承認を忘れていること。アラームがALARM状態に遷移してもメールが届かない場合、まずSNSコンソールでサブスクリプションのステータスを確認する。
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
--region us-east-1
SubscriptionArnがPendingConfirmationになっていれば、確認メールの承認が完了していない。
設定フローの全体像
コンソールのアカウント設定"] --> B["2. SNSトピック作成
us-east-1"] B --> C["3. メールアドレスをサブスクライブ"] C --> D{"4. 確認メールを承認したか?"} D -->|"未承認"| E["確認メールの
リンクをクリック"] E --> D D -->|"承認済み"| F["5. CloudWatchアラーム作成
us-east-1 / $5閾値"] F --> G["6. アラーム状態を確認
describe-alarms"] G --> H{"StateValueは?"} H -->|"OK"| I["設定完了 ✓"] H -->|"INSUFFICIENT_DATA"| J["数時間待機後に再確認"] H -->|"ALARM"| K["メール通知を確認"]
- 請求アラート有効化:コンソールのアカウント設定から一度だけ実施する
- SNSトピック作成:通知の宛先となるトピックを用意する
- メール承認:サブスクリプション確認メールを承認しないと通知が届かない
- CloudWatchアラーム作成:us-east-1でEstimatedChargesを監視するアラームを設定する
- 状態確認:INSUFFICIENT_DATAからOKへの遷移を確認して設定完了
まとめと次のステップ:請求アラームの設定を完了させる
CloudWatch請求アラームの設定は手順自体は単純だが、us-east-1限定のメトリクスとSNSサブスクリプションの承認という2つの落とし穴を知っているかどうかで、設定が機能するかどうかが決まる。$5という閾値はフリーティアの早期警告として機能するが、実際のフリーティア上限はサービスごとに異なるため、AWS Cost Explorerや予算アラート(AWS Budgets)との併用も検討する価値がある。
AWS Budgetsを使うと、サービス別の使用量アラートや、フリーティアの使用率に対するアラートも設定できる。CloudWatch請求アラームは推定料金の総額監視に適しており、より細かいサービス別の監視にはAWS Budgetsが補完的に機能する。
用語集
| 用語 | 説明 |
|---|---|
| EstimatedCharges | AWSが集計する推定請求額のCloudWatchメトリクス。us-east-1にのみ存在し、数時間ごとに更新される |
| SNSトピック | メッセージの配信先となるエンドポイント。CloudWatchアラームはここにメッセージをパブリッシュする |
| サブスクリプション確認 | SNSがメールアドレスへの通知を開始する前に必要な承認プロセス |
| INSUFFICIENT_DATA | 評価に必要なメトリクスデータが不足している場合のアラーム状態。アラーム作成直後に発生することがある |
| treat-missing-data | メトリクスデータが存在しない場合のアラーム評価動作を制御するパラメータ |
コメント
コメントを投稿