📝
CloudWatchログをターミナルで見ましょう
背景
ECSタスクやLambda関数、その他のAWSサービスからのログを確認する際に。よく下記の流れでやっていませんか?
- AWSコンソールにロググループを開く
- ロググループの中からログストリームを選択する
- ログストリームの中からログを確認する
- Resumeを押してログを更新する
特にLambdaの場合は、時間が経つとログストリームが増えていくので、ログストリームを選択するのが面倒です。
本記事では、awslogsを用いてCloudWatchログをターミナルで確認する方法を紹介します。
1. awslogsとは
awslogsはCloudWatchのログからグループ、ストリーム、イベントをクエリするためのシンプルなコマンドラインツールです。
awslogsを使うことで 複数のストリームからイベントの照会、grepなどのツールを使用してイベントをフィルタリングすることができます。
2. awslogsをインストールする
awslogsは、pipやHomebrewを使ってインストールすることができます。
pipを使ったインストール方法:
pip install awslogs
Homebrewを使ったインストール方法:
brew install awslogs
2. awslogsの基本的な使い方
2.1. ロググループの一覧を表示する
awslogs groups
# 出力例
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA
/aws/ECS/cluster/ecs-test-cluster
2.2. ログストリームの一覧を表示する
awslogs streams /aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA
# 出力例
2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d
2.3. ログを表示する
例のログにはDEBUG, ERROR及びJSONのログが混在していて、一旦awslogs get <log-group-name>
で全てのログを取得します。
# --start='1h ago' は、1時間前からログを表示するオプションです。
awslogs get /aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA --start='1h ago'
# 出力例
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d START RequestId: ed2b4d4b-f279-4295-8946-450770d296c9 Version: $LATEST
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d DEBUG: 2023-01-02 21:20:41.551065192 +0000 UTC m=+0.045506188
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d ERROR: 2023-01-02 21:20:41.551065192 +0000 UTC m=+0.045506188
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d END RequestId: ed2b4d4b-f279-4295-8946-450770d296c9
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d REPORT RequestId: ed2b4d4b-f279-4295-8946-450770d296c9 Duration: 8.40 ms Billed Duration: 9 ms Memory Size: 128 MB Max Memory Used: 29 MB Init Duration: 89.89 ms
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d START RequestId: 5f8fedb7-d5d5-42a7-b0bb-a0ddce3cc72a Version: $LATEST
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d END RequestId: 5f8fedb7-d5d5-42a7-b0bb-a0ddce3cc72a
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d REPORT RequestId: 5f8fedb7-d5d5-42a7-b0bb-a0ddce3cc72a Duration: 14.63 ms Billed Duration: 15 ms Memory Size: 128 MB Max Memory Used: 30 MB
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d DEBUG: 2023-01-02 21:21:18.925114173 +0000 UTC m=+37.419555196
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d ERROR: 2023-01-02 21:21:18.925114173 +0000 UTC m=+37.419555196
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f START RequestId: 6e70b7a7-0920-4f2f-8e07-80fb910c0cf4 Version: $LATEST
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f DEBUG: 2023-01-02 21:48:49.242059152 +0000 UTC m=+0.040957870
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f ERROR: 2023-01-02 21:48:49.242059152 +0000 UTC m=+0.040957870
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f {"hello": "world"}
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f END RequestId: 6e70b7a7-0920-4f2f-8e07-80fb910c0cf4
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f REPORT RequestId: 6e70b7a7-0920-4f2f-8e07-80fb910c0cf4 Duration: 8.74 ms Billed Duration: 9 ms Memory Size: 128 MB Max Memory Used: 30 MB Init Duration: 81.81 ms
2.4. ログを継続的に表示する
--watch
オプションを使うと、ログを継続的に表示することができます。
awslogs get /aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA --watch
2.5. Filterを使ってログを表示する
--filter-pattern
オプションを使うと、ログをフィルタリングすることができます。
# DEBUGのみを表示する
awslogs get /aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA --start='1h ago' --filter-pattern='DEBUG'
# 出力例
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d DEBUG: 2023-01-02 21:20:41.551065192 +0000 UTC m=+0.045506188
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]efc4cbfd5f524ff98a102892333e5c2d DEBUG: 2023-01-02 21:21:18.925114173 +0000 UTC m=+37.419555196
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f DEBUG: 2023-01-02 21:48:49.242059152 +0000 UTC m=+0.040957870
2.6 ripgrep(grep)を使ってログを絞る
ripgrep超高速テキスト検索ツールで、もちろんawslogsとの組み合わせも可能です。
# {"hello": "world"}を含むログを表示する
awslogs get /aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA --start='1h ago' | rg '"hello": "world"'
# 出力例
/aws/lambda/awslogs-test-lambda-HelloWorldFunction-LaSGYdgx6oeA 2023/01/02/[$LATEST]e117341f6afb4928b3173000aaed4b6f {"hello": "world"}
以上で、awslogsの使い方を紹介しました。
Discussion