【初心者向け】AWS ChatbotでコストアラートをSlackチャンネルへ飛ばす

Qiita初投稿です。よろしくお願いします。
先日知らぬ間にAWSの使用料がすごいことになってしまいました…。再発防止のために「SlackにAWSのコストアラートを飛ぶようにしたいな～」と色々調べたところ、[手ごろなAWS公式のドキュメント](https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/sns-alert-chime.html)を見つけたので、こちらを基にコストアラートを実装した過程を記します。気になる方はぜひお手元で実装してみてください。

## 仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/86e44c18-36ff-df16-fe36-35eecabb4d67.png)
[AWSの公式ページ](https://aws.amazon.com/jp/chatbot/)からとってきた図です。真ん中のAmazon SNS, AWS Chatbotは変わらず、左端のPublisherがAWS Budgets、右端のChat room notificationsがSlackのチャンネルに当たります。「AWS Budgetsでコストの閾値を設定し、それを超えたタイミングでAmazon SNS、AWS Chatbotと経由してSlackのチャンネルに通知がとぶ」というのが今回の仕組みです。

## 実装手順1.Amazon SNSの設定
１．SNSのコンソールへ行きます。任意のトピック名を設定して「次のステップ」を選択します。画像にはありませんが、リージョンの確認をお忘れなく！　![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/7d7d1b6b-75b7-7475-7ad9-f140694d6a36.png)

２．他は特にいじらず「トピックを作成」を選択します。(画像無し)
３．ARNをコピーした後「編集」を選択します。![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/6364e032-6f53-f274-f550-a70c4f3f0d27.png)

４．AWS Budgetsが作成したSNSトピックを使えるようにするため、アクセスポリシーのJSONエディタ内に以下のコードを張り付けます。このとき、自分の環境に合わせて**書き換えが計5か所必要ですのでお忘れなく。具体的には「上でコピーしたAmazon SNSのARN」と「自分のアカウントID」という部分です**。それぞれ自分のアカウントIDまたは上でコピーしたAmazon SNSのARNに書き換えます。[(参考URLはこちら)](https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/budgets-sns-policy.html) ![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/5986ec15-f6a3-3fda-d4b0-2883097156fc.png)


```json
{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish"
      ],
      "Resource": "上でコピーしたAmazon SNSのARN",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "自分のアカウントID"
        }
      }
    },
    {
      "Sid": "E.g., AWSBudgetsSNSPublishingPermissions",
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "上でコピーしたAmazon SNSのARN",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "自分のアカウントID"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:budgets::自分のアカウントID:*"
        }
      }
    }
  ]
}
```
５．コードを書き換えたら他はいじらず、「変更の保存」を選択します。（画像無し）

以上でAmazon SNSの設定は完了です。

## 実装手順2.AWS Chatbotの設定
１．AWS Chatbotから「Slack」、「クライアントを設定」を選択します。![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/dc9bce30-43e8-2624-27f1-91ac39af3e78.png)

２．所望のSlackのワークスペースを選んで「許可する」を選択します。
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/12a0af37-987f-0a17-222f-ae7f3fa0b117.png)

３．「新しいチャネルを設定」を選択します。![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/0a4b3e7f-29ce-b206-c1e2-8763c648f021.png)

４．設定名は自由に、チャネルIDはSlackで任意のチャンネル名IDをコピーして選択します。(ダイレクトメッセージだと連携がうまくいかないので注意！地味にハマりました)![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/cb144c3b-6048-50b5-49ac-2bf5599fe5d6.png)

５．チャネルロールを選択し、チャネルロールは「テンプレートを使用してIAMロールを作成する」を選択します。ロール名は任意です。![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/32992816-b135-a300-ba83-8699c95e63ac.png)

６．チャネルガードレールポリシーは「PowerUserAccess」を選択します。(本来はもっと弱いポリシーを使った方がよいです)その後、リージョンに「東京」、トピックは先ほど選択したSNSトピックを選択します。その後「保存」を選択します。

以上でAWS Chatbotの設定は完了です。


## 実装手順3.AWS Budgetsの設定
１．コンソールからAWS Budgetsへいき、「予算の作成」を選択します。![スライド10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/f49163ab-4dfd-bef5-f929-fe999b351e72.png)

２．予算の設定では「カスタマイズ（アドバンスト）」を選択し、予算タイプは「コスト予算」を選択します。画像にはありませんが「次へ」を選択します。![スライド11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/9fa2f000-6105-3ee2-9ad8-92f954c28058.png)

３．予算名は自由記入です。![スライド12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/87ac06a6-d10b-a755-a115-5b0a19d4aa66.png)

４．期間は「日」、予算更新タイプは「定期予算」、予算設定方法は「固定」、予算額はすぐにアラートが来るか確認したかったので「0.5ドル」としました。
![スライド13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/fa9769e3-c890-d736-5c67-aa1975f2b774.png)

５．範囲オプションは「すべてのAWSのサービス」、コストの集計基準は「非ブレンドコスト」、サポートされている請求タイプはデフォルトのままです。(「前払いの予約料金」、「定期的な予約料金」、「その他のサブスクリプションコスト」、「税金」、「サポートの料金」、「割引」）アラートの閾値は「100, 予算額の%」、トリガーは「実際」を選択します。![スライド14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/b937eeed-edc0-5ba2-46af-8e4be079daeb.png)


６．Amazon SNS ARNでARN名を入力し、「次へ」を選択します。
![blog用_20221223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/fb1098dd-aecf-c859-feb3-74176395d110.png)

７．「予算を作成」を押します。(画像無し)

以上でAWS Budgetsの設定は完了です。

## コストアラートを確認する
AWS Budgetsで情報が更新時、閾値を超えていれば下画像のようにSlackにアラートが届きます！ただし、AWS BudgetsはリアルタイムでAWSのコストを計算しているわけではない点にご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/f605610c-5317-a83c-eab9-32664bc74b6d.png)

## まとめと感想
今回はコストアラートをSlackに通知する機能を実装しました。ここからさらにアラートの内容を充実させたり、アラートに応じて後続アクションの追加等検証したいと思います。ここまでご覧いただきありがとうございました。それでは皆様、よいクリスマスを:snowflake: