CloudFormation一撃で予算アラート(Budgets)を作成してみた

CloudFormation一撃で予算アラート(Budgets)を作成してみた

Clock Icon2019.07.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS事業本部 梶原@明太子DeepRacerです。 最近DeepRacerを始めたのですが、利用料ちょっと気になりませんか?私はとても気になります。 ということで、利用料が超えそうになったらちょっと今月は控えた方がいいなとか。 こういう使い方だとここまでかかるのかとか早めに知りたくないですか? そんなあなたにAWS Budgetsというこで 基本的にはコンソールでポチポチした方がわかりやすいのですが、やりたいことはある程度決まっていて、なんどもやるのがめんどかったので、CloudFormation一撃化しました。

やりたいこと

  • 月の利用額が予測額を超えそうな場合にアラート通知
  • 月の予算額が実際に50%,75%,100% を超えた場合にアラート通知
  • コストの集計基準はブレンドコスト
  • アラートの通知先はメール
  • 月の予算額は最初はスモールスタート、じょじょに様子見で上げていく予定なので、予算額はパラメータ化したい((ゝ∀・) あちゃー

AWS Budgetsとは

AWS Budgets 予算のしきい値を超えたときにアラートを発信するカスタム予算を設定します。

AWS 予算には、カスタム予算を設定して、コストまたは使用量が予算額や予算量を超えたとき (あるいは、超えると予測されたとき) にアラートを発信できる機能が用意されています。また、AWS 予算を使用して予約の使用率またはカバレッジターゲットを設定し、使用率が設定したしきい値を下回った場合にアラートを受け取ることもできます。予約のアラートは、Amazon EC2、Amazon RDS、Amazon Redshift、Amazon ElastiCache、Amazon Elasticsearch の予約でサポートされています

https://aws.amazon.com/jp/aws-cost-management/aws-budgets/

Budgetsアラートの作成

CloudFormation一撃

以下の内容はパラメータ化してますので、CloudFormationの実行の際に入力してください

  • 通知先メールアドレス(EmailAddress)
  • 予算額(デフォルト100$) ドル(USD) (Amount)
  • ブレンドコスト(Yes/No)
  • 予測額のアラートの割合(Forecasted)
  • 実際の使用料のアラートの割合(Actual1)
  • 実際の使用料のアラートの割合(Actual2)
  • 実際の使用料のアラートの割合(Actual3)

以下のボタンを選択すると、CloudFormationでBudgetsアラートの作成ができるようにしています。

設定内容の確認

正常にCloudFormationが実行されれば AWS Budgetsに追加されているはずですのでご確認ください。

AWS Budgetsのコンソールはこちら https://console.aws.amazon.com/billing/home?#/budgets

通知の確認

最初は予算を低めに設定し、実際にアラート通知がくるかチェックしてみてください。 (すでに予算をオーバーしている場合は、設定と同時に通知されます) こんな感じの電子メールが届きます(T_T

まとめ

設定しなきゃってわかってるけど、ついついめんどくさくなりがちな予算のアラート設定をCloudFormationで設定してみました。

なお

料金の発生から AWS Budgets の請求通知を受け取るまでの間に遅延が生じることがあります。この遅延は、AWS リソースが使用されてからリソースの使用に課金されるまでの時間差が原因です。AWS Budgets から通知を受ける前に、追加のコストや使用料が発生して予算通知のしきい値を超える場合があります。

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html

ということもありますので、一気に使いすぎるとオーバーすることもあるかと思いますのでご注意ください。

参考URL

AWS::Budgets::Budget https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budget.html

CloudFormation Template

使用するテンプレートはこちらになります。

---
Description: "Basic Budget"
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Parameters:
- EmailAddress
- Amount
- Parameters:
- UseBlended
- Parameters:
- Forecasted
- Actual1
- Actual2
- Actual3
Parameters:
Amount:
Type: String
Default: 100
Description: Budgeted amount
EmailAddress:
Type: String
AllowedPattern: '/[^\s@]+@[^\s@]+\.[^\s@]+/'
Description: Notification email address
Forecasted:
Type: Number
Default: 100
MinValue: 1
MaxValue: 100
Description: "% of budgeted amount (Forecasted Costs)"
Actual1:
Type: Number
Default: 50
MinValue: 1
MaxValue: 100
Description: "% of budgeted amount (Actual Costs)"
Actual2:
Type: Number
Default: 75
MinValue: 1
MaxValue: 100
Description: "% of budgeted amount (Actual Costs)"
Actual3:
Type: Number
Default: 100
MinValue: 1
MaxValue: 100
Description: "% of budgeted amount (Actual Costs)"
UseBlended:
Type: String
Default: yes
AllowedValues: [yes,no]
Description: Budgeted amount

Resources:
Budget:
Type: AWS::Budgets::Budget
Properties:
Budget:
# BudgetName: String
BudgetLimit:
Amount: !Ref Amount
Unit: USD
TimeUnit: MONTHLY
CostTypes:
UseBlended: !Ref UseBlended
BudgetType: COST
NotificationsWithSubscribers:
- Notification:
NotificationType: FORECASTED
ComparisonOperator: GREATER_THAN
Threshold: !Ref Forecasted
Subscribers:
- SubscriptionType: EMAIL
Address: !Ref EmailAddress
- Notification:
NotificationType: ACTUAL
ComparisonOperator: GREATER_THAN
Threshold: !Ref Actual1
Subscribers:
- SubscriptionType: EMAIL
Address: !Ref EmailAddress
- Notification:
NotificationType: ACTUAL
ComparisonOperator: GREATER_THAN
Threshold: !Ref Actual2
Subscribers:
- SubscriptionType: EMAIL
Address: !Ref EmailAddress
- Notification:
NotificationType: ACTUAL
ComparisonOperator: GREATER_THAN
Threshold: !Ref Actual3
Subscribers:
- SubscriptionType: EMAIL
Address: !Ref EmailAddress
Outputs:
BudgetId:
Value: !Ref Budget

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.