📝

CloudWatchログをターミナルで見ましょう

2023/01/03に公開

背景

ECSタスクやLambda関数、その他のAWSサービスからのログを確認する際に。よく下記の流れでやっていませんか?

  1. AWSコンソールにロググループを開く
  2. ロググループの中からログストリームを選択する
  3. ログストリームの中からログを確認する
  4. 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