CloudFormation一撃で予算アラート(Budgets)を作成してみた
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