Edited at

CloudTrailと連携させたElasticsearch Serviceをカスタマイズして使う

More than 3 years have passed since last update.

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-*"でワイルドカード指定にする。


mapping.json

{

"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 HealthStatusが"Yellow"になってしまう。これはデフォルトのノード数が1であるため、同じくデフォルト設定の条件であるレプリカ数=1を満たせないことによる。解消するにはノードを増やすかレプリカ数を0にするかだが、CloudTrailのログであれば耐障害性もそこまで必要ないので、後者を選択する。


replica.json

{

"template" : "*",
"settings" : {
"number_of_replicas" : 0
}
}

先述の通りindexが毎日増えていく設定となっているため、Index Templatesでデフォルトの設定としてしまう。

$ curl -XPUT xxx.es.amazonaws.com/_template/replica -d @replica.json