本日も乙

ただの自己満足な備忘録。

AWSの請求アラート(Billing Alerts)をAWS CLIで設定する

[toc]

[2017/07/21 13:10 アラームの設定が一部誤りがありましたので修正しました。]

AWSは便利な機能が豊富ですが、従量課金なので翌月頭に届く領収書(もしくは請求書)を見て、料金に驚くことも多々あります。 そのため、料金が想定よりも上回った場合に、CloudWatchのアラーム機能を利用して通知してくれる機能(請求アラート; Billing Alerts)を設定した方が良いでしょう。 今回は、請求アラートをAWS CLIで設定してみました(小ネタです)。

請求アラートについてもう少し説明

AWSの請求アラートの仕組みについて少し深掘りします。 AWSでは、AWS利用料金の概算をCloudWatchのメトリクスとして見ることができます。ただし、メトリクスで作成されるのは、バージニア北部リージョン(us-east-1)なので、実際にメトリクスを確認したい場合は、マネジメントコンソールのリージョン選択でバージニア北部リージョン(us-east-1)に切り替える必要があります。 CloudWatchのメトリクスなので、AWS利用料金が閾値(想定していた金額)よりも上回った場合に通知する、といったCloudWatchアラームを設定することができます。これが請求アラートです。

SNSトピックの設定

CloudWatchアラームで通知するために必要なAWS SNSの設定を行います。 CloudWatchの請求額メトリクスはバージニア北部リージョン(us-east-1)で作成されるため、--regionオプションでリージョンを指定する必要があります。

topic_arn=$(aws sns create-topic \
--region us-east-1 \
--name aws_billing_alert | jq -r '.TopicArn')

aws sns subscribe \
--region us-east-1 \
--topic-arn $topic_arn \
--protocol email \
--notification-endpoint email@example.com

email@example.comは通知先にしたいメールアドレスを指定します。 サブスクライブすると、email@example.com宛に承認メールが来ます。メールに記載されたConfirm subscriptionのリンクをクリックすることでサブスクライブされます。

CloudWatchアラームの設定

SNSトピックの設定ができたらCloudWatchアラームを設定します。今回は$10を上回ったら通知するようにします。

# 閾値(今回は$10)
billing=10

aws cloudwatch put-metric-alarm \
--region us-east-1 \
--alarm-name 'notification_aws_billing_alert' \
--comparison-operator GreaterThanThreshold \
--threshold $billing \
--alarm-description 'It will be notified when it exceeds $10 of the AWS forecasted amount.' \
--metric-name EstimatedCharges \
--evaluation-periods 1 \
--period 21600 \
--namespace "AWS/Billing" \
--statistic Maximum \
--dimensions Name=Currency,Value=USD \
--alarm-actions $topic_arn \
--treat-missing-data missing

$topic_arnは先ほど作成したSNSトピックのARN(arn:aws:sns:us-east-1:<AWSアカウントID>:<SNSトピック名>)となります。 請求額のメトリクスは21600秒(=6時間)と長めにしています。また、従量課金なので利用料金が下がることはないため、--evaluation-periods(何回目でアラームとするか)では1としています。

最後に

小ネタでしたが、AWS CLIAWS請求アラートを設定しました。 AWSビリングのダッシュボードで当月の予測額が確認できるので、例えば、予測額の80%、90%を上回ったら通知するといったこともできます。 事前に予測額よりも上回りそうだとわかれば、手を打てる施策が増えるのでこういった使い方もできます。