はじめに

こんにちは、MSPチームのクリスです!

今回は、複数AWSアカウントのAWS Budgets通知をPagerDutyのEvent Orchestrationで通知を一箇所に集めるような設定をしたので、それを紹介したいと思います!

みなさんはAWS Budgetsを利用していますか?

閾値に設定しておいた利用料金を超えたら通知してくれるとても優秀なAWSサービスです!

メール経由で通知するのは一般的な使い方でもありますが、今回はPagerDutyのEvent Orchestrationを活用して、複数のAWSアカウントの通知を一箇所に集めるようにしていきたいと思います!

この記事はその設定方法を紹介しますので、ゆっくりみていただけると嬉しいです!

手順

Serviceを用意する

作成方法が簡単なのと、今回のスコープ外なので、作成方法を割愛します

PagerDuty公式ドキュメント – Service and Integrations

Event Orchestration 作成

まずは主役のEvent Orchestrationを作成していきます!

  1. PagerDutyコンソールの上部にAIOpsのタブから、Event Orchestrationを選択する
  2. New Orchestrationで新規作成する
  3. 好きな名前と説明を入れて、作成できたら下記の画面に辿り着く
  4. 各部分の説明
    1. IntegrationsはAWSからの入口(キー、API、Email)
      1. 今回はE-mailを利用する
    2. Global Orchestration
    3. 契約によって利用不可の場合はあるが、今回は利用しないので特に問題ない
    4. Service Route
      1. 事前に作成したService、もしくは既存サービスへの分配
      2. 条件分岐で複数Serviceへ誘導することは可能
    5. Service Orchestrations
      1. 分配先ServiceのOrchestration設定
      2. 従来のEvent Rule と似たような設定(ただフロー図のように変更しただけ)
  5. 次はService Route の画面に入って、右上の「New Service Route」でServiceを追加しよう
  6. 「Always (for all events)」という全てのイベントをルートするように追加したら下のようになる
  7. ここまで設定できれば、このOrchestrationに来た通知はServiceのIncidentとして登録できるようになります!

AWS環境の設定

AWS環境で、SNSの設定とAWS Budgets の設定が必要になります。

SNS作成

1.FiFOではなく、スタンダードのトピックを作成する
2.名称はわかりやすいものであれば問題ない
3.作成後、該当SNSトピックのアクセスポリシーにAWS Budgetsを許可するポリシーを追加する必要があるため、下記のポリシーのように設定すれば問題ない

{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:Publish",
"SNS:RemovePermission",
"SNS:SetTopicAttributes",
"SNS:DeleteTopic",
"SNS:ListSubscriptionsByTopic",
"SNS:GetTopicAttributes",
"SNS:AddPermission",
"SNS:Subscribe"
],
"Resource": "<<<このトピックのarnを入れる>>>",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "<<<このトピックのアカウント番号>>>"
}
}
},
{
"Sid": "AWSBudgets-notification-1",
"Effect": "Allow",
"Principal": {
"Service": "budgets.amazonaws.com"
},
"Action": "SNS:Publish",
"Resource": "<<<このトピックのarnを入れる>>>"
}
]
}

4.その後、このトピックのサブスクリプションを作成する
5.プロトコルは「Eメール」にして、エンドポイントはEvent OrchestrationのIntegrationのメールアドレスを入れる

6.作成後、サブスクリプションステータスが「保留」のようなものになるが、PagerDuty Serviceに「AWS Notification – Subscription Confirmation」のメールが届くので、その承認リンクをクリックし、承認すれば、ステータスが「確認済み」になり、このSNSがPagerDutyに通知を送ることが可能になります!

AWS Budgets の作成

  1. 詳しい手順を省きますが、各自に適した設定で良いかと思います。
  2. AWS Budgetsの名称はPagerDutyの分岐に利用するため、アカウント番号を入れたり、「本番」、「検証」など、環境を分けるような文字を入れて良い
    1. 例:default-budget-prod、budget-alert-12345678912
  3. Budgetのアラートを設定する際は、通知設定をSNSして、事前に作成したSNSのarnを入れる
  4. その後、横にチェックマークが出て、PagerDutyに「SNS Topic Verified!」のインシデントが上がる(クローズするだけで問題ない)

SNSの作成とAWS Budgets の作成は複数アカウントで同じような手順で作成できます。

*SNSのサブスクリプションにPagerDuty Event Orchestration のメールを入れれば問題ないです!

PagerDuty Service Orchestration の Condition 設定

またPagerDutyの画面に戻りますが、今度は複数のアカウントからの通知を確認し、わかりやすいインシデント(アラート)に編集していきます!

  1. まずは先ほど作成したEvent OrchestrationのServiceにルールを追加していこう
  2. Service Routes から、Service名をクリックすると該当ServiceのService Orchestrationの画面になる
  3. 「New Rule」で、SNSから来たイベント(通知)に対して、分岐や編集することが可能になる
  4. まずは条件から見ていくと、下の画像のように、アラートメールが「Budget」を含むメールであれば、次のステップへ進むという条件分岐になる
  5. ここで、「Budget」文字をAWS Budgetsで設定したアカウント番号や環境名などに変更することで、複数のルールで環境を分岐可能になります(New Ruleで複数のルールを作成する)
  6. その後、右下の「Next」で画面遷移すると、Event Ruleの画面になって、SNSから送信された通知を編集可能です
  7. 左ペインから「Variables」画面に入って、通知メールの中の金額を抽出してみよう
  8. Variable Name は自分がわかりやすいもので問題ない。今回はbudgetsの閾値の「Threshold」と実際利用した金額の「actual_amount」を設定する。
    1. Event Field:通知されたイベントのJsonは分類されているので、budgetsのタイトルは「event.summary」で、メール本文は「event.custom_details.plain_body」になっています!
    2. Extraction Regex:メール本文からの金額を正規表現で抽出する(閾値:Alert Threshold:\s*>\s*\$([\d,.]+)、利用料金:ACTUAL Amount:\s*\$([\d,.]+)
  9. その後、左ペインの「Event Fields」に遷移し、先ほど作成した変数を利用して、出したいインシデントのタイトル(summary)を書き換える
  10. 設定した後、実際のインシデントは下記のように上がります
  11. Detailsにもメールの内容が貼ってありますが、上記のような修正によって、自動化ツールに利用されやすくしたり、ユーザが読みやすくしたりするようにできるので、色々試してみると良いです!

さいごに

以上が私が実際に利用しているAWS Budgetsのアラート設定でした!

その他の方法で、例えば Service Routes でアカウントを分岐し、環境はServiceでインシデントを発報させたりするのもありだと思いますので、その辺はニーズによって、色々やってみるのも面白いですね!

最後までお読みいただき、ありがとうございました!
この記事が、複数AWSアカウントでのBudgetアラート設定や、Service Event Orchestrationの活用に役立つヒントになれば幸いです!