Amazon CloudTrailのログをElasticsearchに投入してKibanaで見やすくするソリューションはわりと知られているが、特に最近はCloudWatch Logsに「Streaming to Amazon Elasticsearch Service」機能があるので、ワンクリックでKibanaの可視化が出来たりする。具体的に言うと、Elasticsearchの新規インスタンス作成、CloudWatch LogsからElasticsearchへログを送るためのLambda、必要なIAM Roleの設定がさっくりできる。
参照:【運用】CloudTrailで取得した監査ログをElasticSearch Serviceで活用する【簡単設定】 | Developers.IO
ただこの機能で作ったElasticsearchの設定だと、自動作成である故に少々運用に辛いポイントがいくつかあったので、カスタマイズした点をまとめてみる。
not_analyzed設定
自動作成されたElasticsearchのmappingには、not_analyzed
が一切設定されていない。なのでリージョン名すら「ap」「northeast」「1」が分かれてグラフ化されるという悲しいことになるので改善する。
CloudTrailのログだけあってstring
のフィールドはかなり多いので、まとめてdynamic_templatesを当ててしまうのが早かった。インデックスは日付毎に切られるので"cwl-*"
でワイルドカード指定にする。
{
"template": "cwl-*",
"mappings": {
"_default_": {
"dynamic_templates": [
{ "es": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}}
]
}
}
}
curl
で設定。
$ curl -XPUT xxx.es.amazonaws.com/_template/mapping -d @mapping.json
type名の変更
type
にはCloudWatch Logsのロググループ名が割り当てられるのだが、ロググループ名というとスラッシュを含める場合が少なくない(はず?)。Elasticsearchのtype
にスラッシュが含まれるというのがどうにも気持ち悪かったので、任意のものに変更する。
変更箇所としては、「Streaming to Elasticsearch Service」機能で作られたLambda Function内。function transform
がElasticsearchへのRequest Bodyを構成しているので、ここの以下の箇所を変更する。
var action = { "index": {} };
action.index._index = indexName;
action.index._type = "logs";
action.index._id = logEvent.id;
またindex
も同様にここで変えられる。デフォルトではログの日付毎に別のindex
が切られ、cwl-YYYY.MM.DD
の形式で名前が充てられるが、例えば1つのindex
にまとめたいのであれば、indexName
に固定値を指定することで実現できる。日付でindex
を分けておくと、古いログをローテートするような実装を行いたい場合、index
ごとごっそり消せばよいので楽だったりするが、そのあたりは好みの問題かなと思う。
個人的な見解としては、CloudTrailのログは別で保存されており、Elasticsearchで永続的にログを保持する必要はなかった(直近1か月ぐらい取りあえずKibanaで見られればよい)ので、index
はそのままで外からcronで削除のリクエストを定期的に発行している。ドキュメントの有効期限を設定するttl
の機能もあるようだが、Deprecatedとのことなので採用はしなかった。
参考:TTL Documents, Shield and Found | Elastic
Cluster Healthの適正化
デフォルトで作成されたElasticsearch Serviceのインスタンスは、ダッシュボードで見たときCluster Health
のStatus
が"Yellow"になってしまう。これはデフォルトのノード数が1であるため、同じくデフォルト設定の条件であるレプリカ数=1を満たせないことによる。解消するにはノードを増やすかレプリカ数を0にするかだが、CloudTrailのログであれば耐障害性もそこまで必要ないので、後者を選択する。
{
"template" : "*",
"settings" : {
"number_of_replicas" : 0
}
}
先述の通りindex
が毎日増えていく設定となっているため、Index Templatesでデフォルトの設定としてしまう。
$ curl -XPUT xxx.es.amazonaws.com/_template/replica -d @replica.json