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