Contenu connexe
Similaire à Jawsug福岡 201606 up (20)
Plus de Ken'ichirou Kimura (20)
Jawsug福岡 201606 up
- 14. Lambda Functionを書きます。ログのパースにapachelogモジュールを、そこからクエリーパラメータをパースするのにurlparseを
使います。まずはs3からオブジェクト読み込んで、ログ解析用のフォーマットを設定。
Lambdaファンクション
# coding: utf-8
import boto3
import json
import sys
import ConfigParser
import urlparse
import apachelog
import slackweb
import re
def lambda_handler(event, context):
record = event["Records"][0]
bucket_region = record["awsRegion"]
bucket_name = record["s3"]["bucket"]["name"]
log_object_key = record["s3"]["object"]["key"]
s3 = boto3.client('s3', region_name=bucket_region)
logobj = s3.get_object(Bucket = bucket_name, Key = log_object_key)
try:
log = logobj["Body"].read().decode('utf-8');
except:
log = ''
fname = 'result.html'
format = r'%{id} %{backetname} %t %h %x %{uid} %{action} %f "%r" %>S %{z} %{a} %{b} %{c} %{d} "%{Referer}i" "%{User-
Agent}i" %y'
al = apachelog.parser(format)
- 15. S3オブジェクトから1行ずつ取り出して、対象のWEBアクセスであれば解析してSlackに飛ばします。
Lambdaの設定(2)
for line in log.split('n'):
try:
ldata = al.parse(line)
if ldata['%{action}'] == 'WEBSITE.GET.OBJECT' and ldata['%f'] == fname:
url = re.sub('^GET /(.*) HTTP/1..$',r"1",ldata['%r'],re.U)
o = urlparse.parse_qs(urlparse.urlparse(url).query)
from = o['from'][0].decode('shift_jis')
lname = o['lname'][0].decode('shift_jis')
body = o['body'][0].decode('shift_jis')
inifile = ConfigParser.SafeConfigParser()
inifile.read("./config.ini")
attachments = []
attachment = {
"fallback": u"From:%sn%s" % (lname,body),
"pretext": u"From:%snSub:%s" % (lname,from),
"color": "#aaaaaa",
"text": body
}
attachments.append(attachment)
slack = slackweb.Slack(url=inifile.get('slack', 'hook_url'))
slack.notify(attachments=attachments,
channel=inifile.get('slack', 'channel'),
username=inifile.get('slack', 'username'),
icon_emoji=inifile.get('slack', 'icon_emoji'))