yigarashiのEMブログ

学んだことや考えていることを書きます

AWS ECSのログを無難に見られるようになるための覚え書き

自分が関わっているサービスが徐々にECSに移転している。CloudWatchログのコンソールやチームのドキュメントにあるawslogsコマンドをなんとなく使ってログを見ていたものの、不必要なログが混ざったりして困ることがあった。テクノロジー面のモチベーションが上がってきており、いい加減ちゃんと見られるようになろうということで、基礎概念やawslogsコマンドの使い方をザクっとまとめる。

基礎概念

  • ECS
    • タスク
      • タスク定義から生成される実行単位
      • 複数種類のコンテナをひとまとめにした実行単位を作れて、サイドカーのNginxをつけたりすることが多そう
    • サービス
      • 複数のタスクをデーモン化して動かすことをサポートする概念
      • タスク数を維持するためにスケジュールし直すといった機能もここについているっぽい
    • クラスター
      • Amazon ECS クラスターは、タスクまたはサービスの論理グループです。タスクとサービスは、クラスターに登録されているインフラストラクチャで実行されます

  • CloudWatch Logs

こんな感じなので、たとえば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の基礎的なところを調査して、無難にログを見られるようになったと思う。最近はテクノロジー面のモチベーションが高まっているので、この調子で少しずつ解像度を上げていきたい。