VTRyo Blog

一歩ずつ前に進むブログ

CloudFrontとELBのあるWEBサーバのaccess_logを解析する

f:id:vtryo:20180714152616p:plain

ELBからのアクセスログしか取れないよね

前回アクセスログをredshiftに送信した。

blog.vtryo.me

現構成ではCloudFront+ALB+EC2という状態なので、あのままではアクセス元のIPが所得できない。

なのでh2oのログフォーマットを少しいじることに。

h2oのログフォーマットを加工する

h2oのaccess-logのformatにはこんな感じで書いておく。

format: "remote_address:%h\tremote_logname:%l\tremote_user:%u\trequest_time:%{%Y-%m-%d %H:%M:%S}t\trequest_line:\"%r\"\tstatus_code:%s\tsize_of_the_response_body:%b\tuser_agent:\"%{User-agent}i\"\treferer:\"%{Referer}i\"\tforwarded:\"%{X-Forwarded-For}i\"\tproto:\"%{X-Forwarded-Proto}i\""

これでOK

HTTPしか許可してない構成なのでちょっと変える

プロトコルまでログに残しておく必要はないので変えてみた。

access-log:
  path: "/var/log/h2o/access.log"
  format: "remote_address:%h\tremote_logname:%l\tremote_user:%u\trequest_time:%{%Y-%m-%d %H:%M:%S}t\trequest_line:\"%r\"\tstatus_code:%s\tsize_of_the_response_body:%b\tuser_agent:\"%{User-agent}i\"\tforwarded:\"%{X-Forwarded-For}i\"\treferer:\"%{Referer}i\""

ログ取れた

/var/log/h2o/access.logで確認。

remote_address:xxx.xxx.xxx.xxx       remote_logname:-        remote_user:-   request_time:2017-08-10 12:14:45        request_line:"GET /contact.html HTTP/1.1"       status_code:304 size_of_the_response_body:0     user_agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.<OS build number>"    forwarded:"xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx"      referer:"https://tatoebakimigakizutuite.com/"

redshiftのテーブルも変える

前の記事を参考にテーブルのカラムを変えておく。

redashるぜ

クエリを書く。

  • アクセス元のIPを引っ張る
SELECT split_part(split_part(forwarded, '"', 2), ',' , 1), COUNT(*) AS COUNT FROM access_log group by forwarded limit 10;
  • ユーザエージェント
SELECT user_agent, COUNT(*) AS COUNT FROM access_log group by user_agent limit 10;
  • リファラー
SELECT referer, COUNT(*) AS COUNT FROM access_log group by referer limit 10;

グラフ

f:id:vtryo:20180714214945p:plain

まとめ

一度うまく行けば変更があっても割りとすぐ対応できる。

面白いねredash!