もくじ
条件
- EC2に割り当てるIAMロール
AmazonS3FullAccess - S3にリージョン米国西部(オレゴン)でバケットを作成
sgapache - Athena Location of Input Data Set
s3://sgapache25254649/athena_apache/
Amazon Linux2設定
Apache, td-agentの導入
時刻設定 JST
$ sudo vi /etc/sysconfig/clock ZONE="Asia/Tokyo" UTC=true
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime $ sudo reboot
Apacheのインストール
yum install httpd systemctl start httpd systemctl enable httpd
td-agentのインストール
curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh // Redhatの場合 curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
# usermod -a -G apache td-agent # chown apache:apache /var/log/httpd/ # chmod g+rx /var/log/httpd
設定を作成
# vi /etc/td-agent/td-agent.conf <source> @type tail path "/var/log/httpd/access_log" pos_file "/var/log/td-agent/access_log.pos" tag log.access format apache2 </source> <match log.access> @type s3 s3_bucket sgapache25254649 ←バケット名 path "athena_apache/" s3_object_key_format %{path}%{time_slice}/access_%{index}.%{file_extension} buffer_path /var/log/td-agent/s3/access time_slice_format year=%Y/month=%m/day=%d/hour=%H/minute=%M time_slice_wait 10s buffer_chunk_limit 64m format json include_time_key true time_key log_time </match>
設定の読み込み/起動
systemctl restart td-agent systemctl enable td-agent
アクセスしてApacheログに書き込みを行う
http://IPアドレス/
ログがS3に数分待ってもPUTされない場合はログを確認する
# tail -n 200 /var/log/td-agent/td-agent.log
S3にログが出力されていたら成功
Athena
データベースの作成
CREATE DATABASE IF NOT EXISTS yuuDb;
テーブルの作成
CREATE EXTERNAL TABLE IF NOT EXISTS yuuDb.apache_access ( `host` string, `user` string, `log_time` string, `method` string, `path` string, `code` int, `size` int, `referer` string, `agent` string ) PARTITIONED BY ( year int, month int, day int, hour int, minute int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH serdeproperties ( 'paths'='host, user, log_time, method, path, code, size, referer, agent' ) LOCATION 's3://sgapache25254649/athena_apache/';
データのロード
MSCK REPAIR TABLE yuuDb.apache_access;
セレクト
SELECT * from yuuDb.apache_access LIMIT 10;
結果
よく使うクエリ
2019年2月7日木曜日18時10分から~19時00分までのログを2000行降順で抽出
SELECT * FROM yuuDb.apache_access where log_time < '2019-02-07T18:10:00' AND log_time < '2019-02-07T19:00:00' ORDER BY log_time DESC LIMIT 2000;
気をつけたい
最新のデータで検索したい時はテーブルを更新する必要があります。
テーブルの洗い替え
CREATE EXTERNAL TABLE IF NOT EXISTS yuuDb.apache_access ( `host` string, `user` string, `log_time` string, `method` string, `path` string, `code` int, `size` int, `referer` string, `agent` string ) PARTITIONED BY ( year int, month int, day int, hour int, minute int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH serdeproperties ( 'paths'='host, user, log_time, method, path, code, size, referer, agent' ) LOCATION 's3://sgapache25254649/athena_apache/';
データのロード
MSCK REPAIR TABLE yuuDb.apache_access;