AWSの高額請求に涙する前に設定しておきたいAWS BudgetsとSlack通知

# はじめに

この記事は [AWS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/aws) の24日目の記事です。

Advent Calendarで [AWSでやらかして3桁万円請求された話](https://qiita.com/kappa0923/items/dad1e37ee4127ea7132b) という記事を読んで、同じくAWSを運用している身として「ハッ！」としたので、急ぎ料金請求に関する対策を講じました。

# 予算の設定と通知される金額を設定する

予算に対してどれくらいの料金を使用しているか、日次でどのくらい請求されているかを通知する方法は複数考えられます。

- AWS Budgetsで予算と閾値の設定→AWS ChatbotでSlackに通知
    - 簡単
    - しかし閾値を超えないと通知が来ないので複数の閾値を設定しないと怖い
- AWS Cost and Usage ReportsでS3にコスト情報を出力する
    - S3に新しいオブジェクトが追加されたらLambdaをキックしてSlackに通知
    - ただし1時間ごとでさえ出力される情報量が多い

料金の推移を詳細に追従したいなら下の選択肢かと思います。

膨大な費用請求を避ける目的であれば上の選択肢で事足ります。今回はこれを取り上げたいと思います。

![Untitled Diagram-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/c28f1c0a-9c0b-6536-bff7-bd71af77a69f.png)


## AWS SNSの設定

1. SNSのホームにアクセス
2. "Create topic"をクリック
3. TypeでStandardを選択
4. Nameを任意で設定
5. Access Policyで "Advanced" を選択
6. Statementの配列 `"Statement": []` に以下のjsonを追加
7. この状態で一度保存

```json:追加するstatement
{
  "Sid": "E.g., AWSBudgetsSNSPublishingPermissions",
  "Effect": "Allow",
  "Principal": {
    "Service": "budgets.amazonaws.com"
  },
  "Action": "SNS:Publish",
  "Resource": "your topic ARN"
},
```

![Screen Shot 2020-12-24 at 11.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/1163aa09-d6e6-7098-5cc0-9655fd071b76.png)
 
![Screen Shot 2020-12-24 at 11.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/b0544ae2-423d-8836-1f84-f97e0c1df62d.png)

1. 保存するとARNが生成されるのでこれをコピー
2. 編集をクリック
3. Access Policyで `"your topic ARN"` をコピーしたARNに変更
4. 変更を保存

![Screen Shot 2020-12-24 at 11.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/1efc61fe-4160-0b15-3a2e-fb3e4d51f44c.png)

![Screen Shot 2020-12-24 at 11.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/00c7e6bd-b23d-48c4-df69-87929ae9f003.png)


## AWS Chatbotの設定

AWS Chatbot のコンソールにアクセスします。

1. "Configure new clients" をクリック
2. Slackを選択
3. AWSがSlackへのアクセスを許可するか聞かれるので "許可" を選択
4. "Configure Slack Channel" という画面に遷移される
5. Configuration nameを入力
6. 通知するSlackのチャンネル情報を入力
7. Slackに対するChatbotのIAM Roleを作成する
8. 上で作成したSNS Topicの情報を入力
9. 保存

これでChatbotがSNS TopicをSubscribeするようになります。

![Screen Shot 2020-12-24 at 12.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/0e953f4e-d067-03c5-fd09-2562996e6848.png)

![Screen Shot 2020-12-24 at 12.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/fd44c85f-acc3-401a-e918-d63e36b003e4.png)


## AWS Budgetsの設定

[AWS Budgets](https://console.aws.amazon.com/billing/home#/budgets#/home)にアクセスします。

### 注意

IAM Userを利用している場合、デフォルトではrootアカウントにしか権限がないのでエラーメッセージが表示されます。Full AdminのPolicyを持っていても表示されます。

そこで、IAM Userに料金情報にアクセスできるように設定します。

1. 一旦、rootアカウントでログインしなおす
2. ユーザー名をクリック
3. My Account をクリック
4. 下にスクロールし "IAM User and Role Access to Billing Information" を広げる
5. "Activate IAM Access" にチェック
6. "Update" を押す

![Screen Shot 2020-12-25 at 9.04.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/8c56d1bf-b2e7-cab9-ccce-00cc8ddae1ff.png)

![Screen Shot 2020-12-24 at 11.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/c41b9bae-06df-0ddf-eb86-7a5226da63f6.png)


### Budget Typeの設定

1. "Create a budget" をクリック
2. BudgetのNameを設定
3. Periodを選択
4. Specify your monthly budgetで "Fixed" を選択（予算が固定であれば）
5. 上記のPeriodでの予算を設定
6. 必要に応じて Aggregate costs by を変更
7. "Configure thresholds" で次へ

![Screen Shot 2020-12-24 at 11.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/e239c551-7191-cd2a-b98d-acf3ca8d127d.png)

![Screen Shot 2020-12-24 at 11.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/53a0336a-2f37-5aea-ed5b-4ea025990671.png)


### thresholdsの設定

1. 実際の料金に基づいて閾値を設定する場合は"Actual cost"を設定
2. 閾値を設定
3. Email Addressを入力（必須のようです）
4. Amazon SNSに先ほど設定したSNS TopicのArnを入力
5. Confirm budgetをクリックして完了

![Screen Shot 2020-12-24 at 11.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/ab9a8cfe-cf3a-4d59-7f79-7b39c5849c6c.png)


以上で設定は終わりです。お疲れ様でした！


# さいごに

~~通知のthresholdを設定してから時間が経っていないため、まだ通知が来ていません。汗~~

~~Advent Calendarの件もあるので、とりいそぎ手順だけでも投稿することにしました。実際の通知が来たらこちらの投稿を編集する予定です。（間に合わずすみません汗）~~

**追記**

21:16にSlackに通知が来ました！これで設定がしっかり完了していたようです！

![Screen Shot 2020-12-25 at 0.04.20 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/2f955518-1144-5e02-a789-79539790d0b4.png)


みなさんもクラウドインフラの高額請求には気をつけて、自分の資産を守りましょう。

それではみなさん、メリークリスマス！🎄

# 参考

- [Receiving budget alerts in Amazon Chime and slack](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/sns-alert-chime.html)
- [Creating an Amazon SNS topic for budget notifications](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-sns-policy.html)