自分が関わっているサービスが徐々にECSに移転している。CloudWatchログのコンソールやチームのドキュメントにあるawslogs
コマンドをなんとなく使ってログを見ていたものの、不必要なログが混ざったりして困ることがあった。テクノロジー面のモチベーションが上がってきており、いい加減ちゃんと見られるようになろうということで、基礎概念やawslogs
コマンドの使い方をザクっとまとめる。
基礎概念
- ECS
- CloudWatch Logs
- ロググループとログストリームの操作 - Amazon CloudWatch ログ
- awslogs ログドライバーを使用する - Amazon Elastic Container Service
- ログストリーム
同じソースを共有する一連のログイベントです
- ECSだとコンテナひとつひとつがログストリームのソースになるっぽい
prefix-name/container-name/ecs-task-id
という名前になる
- ロググループ
ロググループは、保持、監視、アクセス制御について同じ設定を共有するログストリームのグループです
- コンテナ(ログストリーム)ごとにロググループを選択できそう
こんな感じなので、たとえばECSのサービスやクラスターごとにロググループがあり、そこにコンテナごとのログストリームがまとまっているといった構成が一般的になると思う。同僚がログストリームを階層的に整理する知見をまとめたりしていて参考になる。
ログの見方
CloudWatchログのコンソールで見る場合は、上の事柄が頭に入っていれば困ることはなさそう。ロググループ、ログストリームの順番で検索しつつ絞り込めるようなUIになっている。
CloudWatchログをCLIで見るためにawslogs
というコマンドも作られている。ログを見たい場合は以下の形式になる。
$ awslogs get <log_group_name> <log_stream_name>
特にログストリーム名は正規表現による指定が可能なので、prefix-name/container-name
までで絞り込んだりすれば、全てのタスクからログを集めてくるといった操作が簡単にできる。よく使いそうなオプションは以下。
-w
watch-G
-S
それぞれロググループ名とログストリーム名を表示から取り除く-s
-e
ログを取得する期間の開始と終了を指定する- 絶対時間ではなく
5m
のような相対形式で指定できるのが手軽で良さそう
- 絶対時間ではなく
-f
フィルターパターンによる絞り込み- JSONやtsvに対して高度なクエリを書くことができる
色々眺めて遊んでいたところ以下のようなエラーに遭遇することがあった。
The number of streams that match your pattern 'XXX' is 'NNN'. AWS API limits the number of streams you can filter by to 100.It might be helpful to you to not filter streams by any pattern and filter the output of awslogs.
どうやらロググループに紐づいているログストリームの数が多すぎてAPIの制限にひっかかっているということらしい。別の手段でフィルターせよと言われているが、フィルターパターンでコンテナを区別するのは難しそうだし、一旦ロググループの全てのログストリームを流してからgrep
すると処理する量が多すぎて困ることもある。基本的にはログストリームのパターンマッチが効くようにロググループを設計しておくのが良さそうに見える。
まとめ
ECSとCloudWatchの基礎的なところを調査して、無難にログを見られるようになったと思う。最近はテクノロジー面のモチベーションが高まっているので、この調子で少しずつ解像度を上げていきたい。