タイトルの通りboto3を入れたサーバーで実行すると、aws waf のログが持ってこれるスクリプトです。
import os import json from datetime import datetime, timedelta, timezone import boto3 tmpfile = 'ログファイルのパス' waf = boto3.client('waf', aws_access_key_id='****************', aws_secret_access_key='**************', region_name='ap-northeast-1' ) def time2str(x): x['Timestamp'] = x['Timestamp'].isoformat() return x webaclid = '************' acl = waf.get_web_acl(WebACLId=webaclid) WebACLName = acl['WebACL']['Name'] marge_logs = [] for rule in acl['WebACL']['Rules']: ruleid = rule['RuleId'] r = waf.get_sampled_requests( MaxItems=500, WebAclId=webaclid, RuleId="Default_Action", TimeWindow={ 'EndTime': datetime(2015, 1, 1)(いつまでのログを検索するか), 'StartTime': datetime(2015, 1, 1)(いつからのログを検索するか) } ) logs = list(map(time2str, r['SampledRequests'])) for l in logs: # add rule id to log l['RuleId'] = ruleid marge_logs.append(json.dumps(l)) if marge_logs != []: now = datetime.utcnow().strftime('%Y-%m-%d/%H-%M-%S-%f') try: with open(tmpfile, 'w') as outfile: outfile.write('\n'.join(marge_logs)) except Exception as e: print(e, "Error to write output file")
まあほとんど https://dev.classmethod.jp/cloud/aws/get-aws-waf-sample-logs/ と同じようなものではあるのですが……
ちなみに、get_sampled_requestsというメソッドを使うときのRuleIdというパラメータが重要で、wafのRuleIdを指定するとそのruleによって弾かれたリクエストを取ってくるという意味になります。 Default_Actionを指定すると、すべてのRuleに引っかからないリクエストを撮ってくるという意味になります。