ECSのログパターンについて考えている〜ログを送るところまで
概要
いくつかパターンと懸念があるので考えた。メモ書きレベル。
考慮事項
- ログの欠損を最小限にしたい。可能な限り拾いたい
- fluentdのメモリ内のログが欠損するのは許容(どうにもならない)
- それ以外のログの欠損を防ぐ
考慮点
- fluentdを使うかどうか
- ログを一度ファイルにするか
awslogs driver -> CWLogs
- コンテナのログをCWlogsに送る
- もろもろの考慮が不要なため初期は一番楽だと思われる
- とにかく料金がネックになる
- S3に送るにもCWLogsを一度経由する必要があり大変
- CWLogsのRatelimit引っかかったことはないがどうか?log streamを分ければある程度スケールするかも。
fluentdパターン
- 柔軟にログを送ることができる
- fluentd -> kinesis -> kinesis firestream -> ElasticSearch Serviceなどの構成にできればログが増えてもある程度スケールしそう(ただし、kinesisの料金が高くなりがちなので注意が必要)
- fluentdを採用する場合にいくつかのパターンが考えられる。
Json-file driver + fluentd forwarder process (every host machine)
- k8sやdatadog-agentと似たような方式、一度ファイルに書き込む
- hostマシンにfluentd(td-agent)のプロセスを立ち上げる
- コンテナのライフサイクルと分離できる
- コンテナインスタンスがdrainingされたときもprocessは生き続けるので、ログが欠損しにくい
- fluentd が死んだ場合の再起動などについての考慮が必要
- fluentdの設定変更に考慮が必要
- インスタンス終了時にdrainigするだけでいいので気楽
- スケールしやすい
Json-file driver + fluentd forwarder container
- k8sやdatadog-agentと似たような方式、一度ファイルに書き込む
- daemonSetを使ってfluentdを書くホストに起動させる
- スケールしやすい
fluentd driver -> nlb + fargate fluentd
- fargateで別Serviceを立ち上げる
- インスタンス入れ替え時の考慮が不要
- スケールしやすい
- docker -> nlb -> fluentd間でkeepaliveを貼りそうなので相性はよさそう?
- fargate が死んだらその分ログが欠損する
- EFSを利用することで防げるかもしれない?
- 安定すればそれほど懸念することではないかも
- 一旦受ける用fluentdがlogに書き込み。tail君を別で立ち上げる?
- hostのログを取れない
- cloudwatch-agentでいいんでは?
- ログが分割されている場合、他のfargeteタスクにログが送られてしまうと復旧できない?(16KBの制限)
- fluentd側の処理でコンテナIDとかを見ればできるか検証したい
- fargate使うとしたときのfluentdの監視はどうする?
fluentd driver -> fluentd(sidecar)
- fluentdをsidecarとして立ち上げる。
- アプリケーションと1:1にできるのでコンテナライフサイクル管理が楽
- リソース管理が難しい。
まとめ
fargateパターンが良さそうな気がしているので試したい