😊
AWS WAF関連リソースの使用量の日次取得スクリプト
AWS WAFを使ったときに、WebACLやらRuleGroupsやらがリソースクォータ上限に引っかかりそうになったので、使用量を日次で監視したくて書いたLambda Function。
AWS WAF関連のリソースクォータの上限緩和した値がAWS CLIでもboto3でも取得出来ず、マネジメントコンソールでもデフォルト値しか見えないので、仕方なくハードコードにした。
社内確認したら、AWS サポート経由で無いと確認するルートが無いらしい。(本当?)
閾値はダミー。実際の環境に合わせて設定する。
import boto3
def check_resources():
client_wafv2 = boto3.client('wafv2', region_name='us-east-1')
response_list_rule_groups = client_wafv2.list_rulegroups(Scope='CLOUDFRONT')
list_rule_groups = [RULEGROUPS for RULEGROUPS in response_list_rule_groups['RuleGroups']]
while 'NextMarker' in response_list_rule_groups:
response_list_rule_groups = client_wafv2.list_rule_groups(Scope='CLOUDFRONT', NextMarker=response_list_rule_groups['NextMarker'])
for i in response_list_rule_groups['RuleGroups']:
list_rule_groups.append(i)
response_list_web_acls = client_wafv2.list_web_acls(Scope='CLOUDFRONT')
list_web_acls = [WEBACLS for WEBACLS in response_list_web_acls['WebACLs']]
while 'NextMarker' in response_list_web_acls:
response_list_web_acls = client_wafv2.list_web_acls(Scope='CLOUDFRONT', NextMarker=response_list_web_acls['NextMarker'])
for y in response_list_web_acls['RuleGroups']:
list_web_acls.append(y)
response_list_ip_sets = client_wafv2.list_ip_sets(Scope='CLOUDFRONT')
list_ip_sets = [IPSETS for IPSETS in response_list_ip_sets['IPSets']]
while 'NextMarker' in response_list_ip_sets:
response_list_ip_sets = client_wafv2.list_ip_sets(Scope='CLOUDFRONT', NextMarker=response_list_ip_sets['NextMarker'])
for x in response_list_ip_sets['IPSets']:
list_ip_sets.append(x)
client_sns = boto3.client('sns')
message = "現在のRuleGroups使用数:" + str(len(list_rule_groups))
message += "\n現在のWebACLs使用数:" + str(len(list_web_acls))
message += "\n現在のIPSets使用数:" + str(len(list_ip_sets))
message += "\n\n現在のRuleGroups上限:200(これ以上の緩和は不可)"
message += "n現在のWebACLs上限:200(これ以上の緩和は不可)"
message += "\n現在のIPSets上限:300(緩和申請可能)"
message += "\n------------------------------------------------\n"
if len(list_rule_groups) >= 3:
message += "\n【RuleGroups】閾値を超えています。リソースの集約や削減を検討してください"
elif 1 <= len(list_rule_groups) < 3:
message += "\n【RuleGroups】閾値を超えそうです。新規構築やルールカスタマイズの際は上限に注意してください"
else:
message += "\n【RuleGroups】閾値を超えていません"
if len(list_web_acls) >= 3:
message += "\n【WebACLs】閾値を超えています。リソースの集約や削減を検討してください"
elif 1 <= len(list_web_acls) < 3:
message += "\n【WebACLs】閾値を超えそうです。新規構築やルールカスタマイズの際は上限に注意してください"
else:
message += "\n【WebACLs】閾値を超えていません"
if len(list_ip_sets) >= 3:
message += "\n【IPSets】閾値を超えています。リソースの集約や削減を検討してください"
elif 1 <= len(list_ip_sets) < 3:
message += "\n【IPSets】閾値を超えそうです。新規構築やルールカスタマイズの際は上限に注意してください"
else:
message += "\n【IPSets】閾値を超えていません"
message += "\n------------------------------------------------\n"
message += "<本通知の目的>"
message += "リソースのクオータ上限に達すると新規にリソースが作成できなくなるため、"
message += "上限超過を防止するための日次監視です"
topic = 'SNSのTopicのARN'
subject = 'メール通知のタイトル'
region = 'ap-northeast-1'
response = client_sns.publish(
TopicArn=topic,
Message=message,
Subject=subject
)
def lambda_handler(event, context):
check_resources()
EventBridgeで時間指定して、決まった時間に実行されるようにする。
下記のようなメールが届く。
現在のRuleGroups使用数:X
現在のWebACLs使用数:Y
現在のIPSets使用数:Z
現在のRuleGroups上限:200
現在のWebACLs上限:200
現在のIPSets上限:300
------------------------------------------------
<本通知の目的>
リソースのクオータ上限に達すると新規にリソースが作成できなくなるため、
上限超過を防止するための日次監視です
Discussion