fastly導入にあたり、アクセスログはfastly経由のものを使うようにしようと計画している。
今回は、かなり小ネタだが、柔軟なアクセスログを出力する為の基本設定について書く。
- LogFormatのバージョンアップ
- s3の保存先に日付フォーマットを入れる(Athena)
ログを柔軟に操れるのは、Akamaiでは出来ないのでかなり優位な点かと思っている。
fastlyログのs3への出力設定は下記投稿が詳しい。
http://qiita.com/Satoshi-Ishii/items/1ec701a5d823807a3a78
LogFormatのバージョンアップ
fastlyのログフォーマットについて
fastlyには、ログのformatとして、v1とv2がある。
公式ドキュメントにあるとおり、デフォルトはv1になっており出力項目にかなり制限がありアクセスログとしてみた時に少し情報が少ない。。。
只、ログフォーマットを変更する事で、柔軟なログ出力が可能となるので今回はその手順を備忘録として書いておく。
- 変更は、API経由で行う。
- サービス毎に、設定を持っているので、service ID単位に設定を行う必要がある。
更新手順
ServiceIDとlog type(s3,ftp,,,)毎にカスタムログのversionを持っている模様。
イメージとしては、fastly上で先にログの設定を投入し、そのログプロファイルのformatをバージョンアップするようなイメージ
curl -X PUT -H 'Fastly-Key: <your Fastly API key>' -H 'Content-Type: application/json' 'https://api.fastly.com/service/<your Fastly service ID>/version/<version number/logging/<log type>/<log name>' --data-binary '{"format_version":"2"}'
現在の設定の確認
curl -X GET -H 'Fastly-Key: <your Fastly API key>' 'https://api.fastly.com/service/<your Fastly service ID>/version/<version number>/logging/<log type>/<log name>'|jq .
レスポンスをjqで表示するとざっくりこんな感じ
formatバージョンが変わっていれば成功!!
{
"placement": null,
"format_version": "2", ##ここが2になっていればバージョンアップ成功
"response_condition": "",
"gzip_level": "0",
"server_side_encryption_kms_key_id": null,
"secret_key": "***",
"public_key": null,
"updated_at": "2017-02-06T08:22:42+00:00",
"message_type": "classic",
"period": "3600",
"name": "ログプロファイル名",
"server_side_encryption": null,
"bucket_name": "s3のバケット名",
"timestamp_format": "%Y-%m-%dT%H:%M:%S.000",
"service_id": "***",
"domain": "s3-ap-northeast-1.amazonaws.com",
"redundancy": "standard",
"version": "26",
"path": "/***/",
"deleted_at": null,
"created_at": "2017-01-20T09:07:48+00:00",
"access_key": "***",
"format": "%t %m %U %q %a"
}
s3バケットの保存先に日付フォーマットを入れる
s3には、Athenaというサービスがあり、バケットに保存したデータにそのままSQL発行が出来る。
只、データを溜めるだけだとスキャン量が膨大になるので、hiveフォーマットのディレクトリ構造にデータを保管しパーティショニングするのが定石となっている。
今回、fastlyのエンジニアの方に日付フォーマットがログの出力先に使える事を聞いたので、その方法も書いておく。
設定
fastlyのログのAdvanced optons画面で下記のように書く事で日付毎のディレクトリ階層に出力が可能になる。
Hiveフォーマット
dt=yyyy-mm-dd(-HH-MM-SS)
AthenaでCREATE EXTERNAL TABLEする時に、下記のようにパーティションを設定すると良い。
CREATE EXTERNAL TABLE
...
...
PARTITIONED BY (dt string)
↓パーティショニングする
MSCK REPAIR TABLE [テーブル名]
クエリには、where句でスキャン対象のパーティションを指定してあげると対象を絞ってのクエリ発行が可能になる。
where dt<'2016-12-12' and dt>='2016-12-13'
今回は、かなり小ネタだったが、最終的には、elastic cloudにログを持っていこうと思っているのでそれはまた別の機会に書こうと思う。