AWSサービスクォータ制限を監視してSlack通知してみた(AWS Trusted Advisor + AWS Step Functions + Amazon EventBridge + Slack Webhook)
意図しないAWSサービスクォータ枯渇を防ぐためには、監視の設定が必要です。
先日自動管理設定機能が追加されましたので、基本的にはこちらを使って監視することをお勧めします
上記の機能で要件を満たせない場合は、独自で仕組みを作る必要があります。
今回は、AWS Trusted Advisor + AWS Step Functions + Amazon EventBridge + Slack Webhookを組み合わせた構成をご紹介します。
構成
Slack通知にAmazon Q Developer in chat applications ではなくSlack Webhookを使った理由
Slackへの通知には、Amazon Q Developer in chat applications (旧称: AWS Chatbot)を使うことも可能です。
しかし、今回はSlack Webhookを使いました。
複数AWSアカウントへ展開する際の設定の手間を減らしたかったからです。
今回の仕組みをAWSアカウントごとに展開する場合、それぞれのAWSアカウントでAmazon Q Developer in chat applicationsの設定が必要になります。
一方、Slack Webhookの場合は、通知先のチャンネルごとにSlack側で1回発行すれば良いため、AWSアカウントごとに通知の設定を行う必要がありません。
Slack Webhookの呼び出しにStep Functionsを利用
今回Slack Webhookを叩く部分にStep Functionsを利用しました。
この処理はAPIリクエストを行うだけでかなりシンプルです。
Lambdaで実装することも可能ですが、ランタイムバージョンのメンテナンス負荷をなくすためにStep Functionsを利用しました。
やってみた
リソースをデプロイ
Terraformで作成しました。コードの全体は以下をご確認ください。
実行する際には、terraform.tfvars
を用意してSlack Webhook URLをセットしてください。
cp terraform.tfvars-sample terraform.tfvars
slack_webhook_url = "https://hooks.slack.com/services/hoge/fuga/piyo"
terraform init
terraform plan
terraform apply
サンプルコード中では、サービスクォータの監視対象としてVPC
VPC Internet Gateways
EC2-VPC Elastic IP Address
の3つとしています。
check-name
の配列部分に任意の対象を追加することで、監視対象を増やすことが可能です。
# EventBridge Rule for Trusted Advisor
resource "aws_cloudwatch_event_rule" "service_quota_monitoring" {
name = "ServiceQuotaMonitoring-Alert"
description = "Monitor AWS service quotas via Trusted Advisor alerts"
event_pattern = jsonencode({
source = ["aws.trustedadvisor"]
detail-type = ["Trusted Advisor Check Item Refresh Notification"]
detail = {
status = ["ERROR", "WARN"]
check-name = [
"VPC",
"VPC Internet Gateways",
"EC2-VPC Elastic IP Address",
]
}
})
state = "ENABLED"
}
Step FunctionsでCall HTTPS APIs
アクションを使うために、aws_cloudwatch_event_connection
を定義する必要がありました。
Slack Webhook URLを叩く際にはAPI Keyは不要ですが、上記のアクションを使う際に値が必要だったのでダミー値をセットしています。
# EventBridge Connection for HTTP calls
resource "aws_cloudwatch_event_connection" "slack_webhook" {
name = "ServiceQuotaMonitoring-SlackWebhook"
description = "Connection for Slack webhook"
authorization_type = "API_KEY"
auth_parameters {
api_key {
key = "Authorization"
value = "Bearer dummy" # Slack webhooks don't require auth, but connection needs this
}
}
}
動作確認
EIPをサービスクォータの上限値(デフォルト5個)まで作成して、Slack通知が飛ぶことをテストしました。
Slackを確認すると以下のメッセージが届きました。
おわりに
AWS Trusted Advisor + AWS Step Functions + Amazon EventBridge + Slack Webhookを組み合わせたサービスクォータ監視についてでした。
冒頭に紹介したAWS Service Quotasの自動管理機能が良さそうと思うのですが、現時点では通知タイミングやメッセージのカスタマイズには対応していません。
自動管理機能で要件を満たせなさそうな場合は、本ブログの構成も検討してみてください。