aws wafのログを取ってくるスクリプト

タイトルの通り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に引っかからないリクエストを撮ってくるという意味になります。