BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS・CloudFormation】CloudFormationで請求アラートをサクッと作ってみた

f:id:bftnagoya:20210625192516j:plain

はじめに

こんにちは!
CloudFormationが大好き!BFT名古屋支店・インフラ女子(?)のやまぐちです。

どこかのタイミングでCloudFormationを触ってやろうと機会をうかがっていたのですが 思いもよらぬ場面でやってきました。
今回はCloudWatch Alarmを使わずにCloudFormationを使って一瞬で請求アラートを作成する、ということをやっていきたいと思います。

CloudFormationで三段階のアラート設定にしてみた

当初調べた際にアラームを一つ一つ作成するしかないと知り、それは面倒だということで諦めていましたが、CloudFormationで作成すれば上限値やしきい値も柔軟に変更できそうなので設定することにしました。

実行するYAML

公式サイトなどを参考に作成したYAMLです(作成の様子は「CloudFormationのお話(おまけ)」で説明しています)
設定する金額、しきい値のパーセント(3つ)、送信先のメールアドレスはパラメータとしてCloudFormationを実行する際に指定します。

------
Description: "Set & Update Budget Alarts"

Parameters:
  Ammount:
    Type: String
    Default: 100
    Description: Budget Limit Amount
  MailAddress1:
    Type: String
    Description: Notification Email Address 1
  ThreshouldHigh:
    Type: Number
    Default: 150
    MinValue: 50
    MaxValue: 200
    Description: 50-200 % of budgeted amount(High)
  ThreshouldMid:
    Type: Number
    Default: 100
    MinValue: 50
    MaxValue: 200
    Description: 50-200 % of budgeted amount(Middle)
  ThreshouldLow:
    Type: Number
    Default: 80
    MinValue: 5
    MaxValue: 200
    Description: 50-200 % of budgeted amount(Low)

Resources:
  BudgetAlarts:
    Type: "AWS::Budgets::Budget"
    Properties:
      Budget:
        BudgetLimit:
          Amount: !Ref Ammount
          Unit: USD
        TimeUnit: MONTHLY
        BudgetType: COST
      NotificationsWithSubscribers:
        - Notification:
            NotificationType: ACTUAL
            ComparisonOperator: GREATER_THAN
            Threshold: !Ref ThreshouldHigh
          Subscribers:
            - SubscriptionType: EMAIL
              Address: !Ref MailAddress1
        - Notification:
            NotificationType: ACTUAL
            ComparisonOperator: GREATER_THAN
            Threshold: !Ref ThreshouldMid
          Subscribers:
          - SubscriptionType: EMAIL
            Address: !Ref MailAddress1
        - Notification:
            NotificationType: ACTUAL
            ComparisonOperator: GREATER_THAN
            Threshold: !Ref ThreshouldLow
          Subscribers:
          - SubscriptionType: EMAIL
            Address: !Ref MailAddress1

早速やってみた

作成したYAMLで実行できるのか検証もしたいので、「デザイナーでテンプレートを作成」を利用します。 下の[ テンプレート ] タブを開いて貼り付け、左上のチェックアイコンを押します。
f:id:bftnagoya:20210625115952p:plain:w600

構文や使用しているパラメータに問題がなければ画面上の中央に「テンプレートは有効です」と表示されます。もし問題があれば、画面右下のメッセージ部分にエラーメッセージが表示されます。
f:id:bftnagoya:20210625115934p:plain:w600

作成を進めます。Parametersで設定しているので、実行時にパラメータを変更することができます。
f:id:bftnagoya:20210625190233p:plain:w600

CloudFormationの、この作成中が私は好きです。どきどき。わくわく。
f:id:bftnagoya:20210625183457p:plain:w600

しばらくすると問題なく完了しました。
f:id:bftnagoya:20210625183645p:plain:w600

設定時に既に超過している場合はメールが飛んできます。
テストでは自分だけのアドレスにしていたので3通飛んできていました。
f:id:bftnagoya:20210625184622p:plain:w600

CloudFormationのお話(おまけ)

CloudFormationはJsonYAMLを実行することでAWSリソースを作成する自動化ツールです。CloudFormationを利用すると自動的にS3にテンプレートが保存されます(逆にS3に置いてそれを利用することも可)。

パラメータで設定するとCloudFormation実行時に固有値を指定することができるので、汎用性を持たせて使いまわしがききます。また、CloudFormationで作成したリソース名などは変数に格納できるので、他のリソースを作成する時にはその変数で呼び出しできます(そのためにはエクスポートする必要があります)。

それって自動化する必要ある?

自動化につきものですが、自動化する価値があるかどうかは最初に考えなければいけません。なぜなら自動化するにはそれなりに工数が発生するからです。しかも書いたものを理解できる人しか変更できないのでAnsibleではせっかく作ったPlaybookが使い捨てになることもしばしば。

  • 同じ構成、異なるパラメータなどで頻繁に作業が発生する場合
    • IAMユーザの作成などがイメージしやすい
  • 更新作業が発生する、ヒューマンエラーを回避したい場合
    • 特にAWSGUIが頻繁に変わるので、GUIで手順を残しても後で使えなくなることがある
    • AWS CLIで残してもいいが、ヒューマンエラーが発生する可能性が残る

CloudFormationを作る手順

ネットで探すと「こうです」とか「こうしました」はあるのでそれをコピーして使いがちなのですが、きちんと公式サイトから作れると一番自分のやりたいことが実現できるのでオススメです。

やり方はたくさんあると思いますが、私は以下の順で試します。

  • 対象のリソースを作成するのにかかる費用を確認(失敗した時のリスクを見る)
  • AWSの公式のユーザガイドから項目や必須パラメータなどを確認
  • 例をコピーしてそこから加工する
  • 実際に動かしてみる

ここでは2番目AWSの公式のユーザガイドから項目や必須パラメータなどを確認」にフォーカスして記載していきます。

例えばこの費用アラートを作成する場合、まずはCloudFormationの公式ユーザガイドのところでそもそもBudgetsサービスが対応しているのかを確認することから始めます。

「cloudformation aws budgets」などで検索すると「AWS::Budgets::Budget - AWS CloudFormation」というサイトがHitします。これで作れそうだなーと希望が見えてきます。あとは中のパラメータを確認していきます。
f:id:bftnagoya:20210625110221p:plain:w600

このように細かいパラメータまで書いていない場合は、形式が別途記載してあるのでそのリンクに進みます。「BudgetData」を見ると、その下にどんなパラメータを設定できるのかがわかります。
f:id:bftnagoya:20210625110558p:plain:w600

例えばこのBudgetLimitというパラメータに何をどう書くべきかは下にスクロールすると出てきます。トータルの費用や使用率などなどが設定できて、「Spend」という書き方をするそうです。
f:id:bftnagoya:20210625111046p:plain:w600

次に「Spend」が何をどう書くのかを見るためにリンクをクリックします。
f:id:bftnagoya:20210625111607p:plain:w600

ここでようやくどう書くのかがわかります。AmountというパラメータではTypeにDoubleとありますがこれは「倍精度浮動小数点数型」だそうで、例を見るとUSDとして100と設定しているので数値を入れればいいということがわかります。UnitはUSDかGBですね。使用した分のお金にするかS3などでの使用量を設定できるようです。

あとここで重要なのがRequiredにYesと記載されている部分です。この部分は必須ということですね。

そうして一通りパラメータに目を通し、何を設定したいのかを整理します。それから例を見るとかなり理解が早くなります。

多少英語は読まないといけないですが、一つ一つ見ていけばちゃんと作れるのもCloudFormationのいいところです。

終わりに

YAMLさえできていればリソースの作成は5分もかかりません。やっぱりCloudFormationは最高です。

ここまで読んでいただきありがとうございました~^ ^