タダです.
最近もっぱら ECS 周りを触っているんですが,コンテナのログを CloudWatch Logs に出すのはコスト的に避けたかったので FireLens 経由で S3 に出すようにしました.S3 に出しちゃえば Athena からログをクエリできると思ってやってみたのでこの記事でやり方をまとめていきます.
FireLens のログの中身について
まず,FireLens から送られてくるログの中身をみていきましょう.ログの中身は次の項目がはいった JSON 形式になっています.
- container_id
- container_name
- ecs_cluster
- ecs_task_arn
- ecs_task_definition
- log
{"container_id":"xxx","container_name":"xxx","ecs_cluster":"xxx","ecs_task_arn":"arn:aws:ecs:xxx:xxx:task/xxx/xxx","ecs_task_definition":"xxx:xxx","log":"INFO: xxx"}
なので,これら形式に合うように Athena のテーブルを作る必要があります.
Athena のテーブル作成
Athena でテーブルを作っていくんですが,全てのログは必要ないため今回は絞ってcontainer_id
, container_name
,log
をカラムにしました.下記のクエリが Athena のテーブル作成用のクエリ例です.
CREATE EXTERNAL TABLE xxx ( container_id string, container_name string, log string ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://xxx/'
これでクエリができるようになったので,クエリをしてみたところ下記の画像のようにクエリ結果を得ることができました.log
の中にログの詳細が全て含まれてしまっているのでログの中身で絞り込みたい時は LIKE
などを使って絞り込みすると良さそうです.
まとめ
小ネタですが,FireLens で出力された S3 のログに Athena からクエリを発行してみました.今担当しているコンテナのログは一個しか出てないのですが,状況見ながら出し分け先を変えたりも FireLens ではできそうなのでまたそれもできたら記事にしていきたいと思います.