Qiita初投稿です。よろしくお願いします。
先日知らぬ間にAWSの使用料がすごいことになってしまいました…。再発防止のために「SlackにAWSのコストアラートを飛ぶようにしたいな~」と色々調べたところ、手ごろなAWS公式のドキュメントを見つけたので、こちらを基にコストアラートを実装した過程を記します。気になる方はぜひお手元で実装してみてください。
仕組み
AWSの公式ページからとってきた図です。真ん中のAmazon SNS, AWS Chatbotは変わらず、左端のPublisherがAWS Budgets、右端のChat room notificationsがSlackのチャンネルに当たります。「AWS Budgetsでコストの閾値を設定し、それを超えたタイミングでAmazon SNS、AWS Chatbotと経由してSlackのチャンネルに通知がとぶ」というのが今回の仕組みです。
実装手順1.Amazon SNSの設定
1.SNSのコンソールへ行きます。任意のトピック名を設定して「次のステップ」を選択します。画像にはありませんが、リージョンの確認をお忘れなく!
2.他は特にいじらず「トピックを作成」を選択します。(画像無し)
3.ARNをコピーした後「編集」を選択します。
4.AWS Budgetsが作成したSNSトピックを使えるようにするため、アクセスポリシーのJSONエディタ内に以下のコードを張り付けます。このとき、自分の環境に合わせて書き換えが計5か所必要ですのでお忘れなく。具体的には「上でコピーしたAmazon SNSのARN」と「自分のアカウントID」という部分です。それぞれ自分のアカウントIDまたは上でコピーしたAmazon SNSのARNに書き換えます。(参考URLはこちら)
{
"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:*"
}
}
}
]
}
5.コードを書き換えたら他はいじらず、「変更の保存」を選択します。(画像無し)
以上でAmazon SNSの設定は完了です。
実装手順2.AWS Chatbotの設定
1.AWS Chatbotから「Slack」、「クライアントを設定」を選択します。
2.所望のSlackのワークスペースを選んで「許可する」を選択します。
4.設定名は自由に、チャネルIDはSlackで任意のチャンネル名IDをコピーして選択します。(ダイレクトメッセージだと連携がうまくいかないので注意!地味にハマりました)
5.チャネルロールを選択し、チャネルロールは「テンプレートを使用してIAMロールを作成する」を選択します。ロール名は任意です。
6.チャネルガードレールポリシーは「PowerUserAccess」を選択します。(本来はもっと弱いポリシーを使った方がよいです)その後、リージョンに「東京」、トピックは先ほど選択したSNSトピックを選択します。その後「保存」を選択します。
以上でAWS Chatbotの設定は完了です。
実装手順3.AWS Budgetsの設定
1.コンソールからAWS Budgetsへいき、「予算の作成」を選択します。
2.予算の設定では「カスタマイズ(アドバンスト)」を選択し、予算タイプは「コスト予算」を選択します。画像にはありませんが「次へ」を選択します。
4.期間は「日」、予算更新タイプは「定期予算」、予算設定方法は「固定」、予算額はすぐにアラートが来るか確認したかったので「0.5ドル」としました。
5.範囲オプションは「すべてのAWSのサービス」、コストの集計基準は「非ブレンドコスト」、サポートされている請求タイプはデフォルトのままです。(「前払いの予約料金」、「定期的な予約料金」、「その他のサブスクリプションコスト」、「税金」、「サポートの料金」、「割引」)アラートの閾値は「100, 予算額の%」、トリガーは「実際」を選択します。
6.Amazon SNS ARNでARN名を入力し、「次へ」を選択します。
7.「予算を作成」を押します。(画像無し)
以上でAWS Budgetsの設定は完了です。
コストアラートを確認する
AWS Budgetsで情報が更新時、閾値を超えていれば下画像のようにSlackにアラートが届きます!ただし、AWS BudgetsはリアルタイムでAWSのコストを計算しているわけではない点にご注意ください。
まとめと感想
今回はコストアラートをSlackに通知する機能を実装しました。ここからさらにアラートの内容を充実させたり、アラートに応じて後続アクションの追加等検証したいと思います。ここまでご覧いただきありがとうございました。それでは皆様、よいクリスマスを