😊

AWS WAF関連リソースの使用量の日次取得スクリプト

2022/02/25に公開

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