Cloud Watch Insightsは、膨大なCloud Watchのログから必要なものをフィルタリングするのに便利です。 AWSコンソール上から利用できるようになっていますが、AWS CLIからも利用ができるとのことで実際に試してみました。
動作環境
# uname -a Linux b93945d429ec 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 GNU/Linux # cat /etc/os-release PRETTY_NAME="Debian GNU/Linux bookworm/sid" NAME="Debian GNU/Linux" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"
Cloud Watchにログを用意する
Lambdaからログを吐かせる等して、Cloud Watchにログが存在する状態にしておきます。
AWS CLIのインストール・認証情報の用意
シェルスクリプトからAWS CLIを使いますので、予めAWS CLIをインストールし、アクセスキー・シークレットアクセスキーを用意しておいて下さい。
シェルスクリプトを書く
"/aws/lambda/hoge"というロググループに対してクエリを実行する場合は下記のようになります。
#!/bin/bash -eu QUERY_ID=`aws logs start-query \ --log-group-name "/aws/lambda/hoge" \ --start-time 1648393200 \ --end-time 1648476000 \ --query-string \ "fields @timestamp, @message | sort @timestamp desc | limit 10" \ | jq ".queryId" \ | sed "s/\"//g"` while : do STATUS=`aws logs get-query-results --query-id $QUERY_ID | jq ".status"` if [ $STATUS = '"Complete"' ]; then break fi sleep 1s done aws logs get-query-results --query-id $QUERY_ID
aws logs start-query
でクエリを実行しています。aws logs get-query-results
でクエリの実行結果を取得できます。
ここで注意すべき点は、クエリ実行直後は結果取得ができないのでウェイトを挟む必要があることです。 (while文でstatusが"Complete"になるまでsleepさせているのはその為。)
参考情報
CloudWatch Logs Insights のクエリ構文 - Amazon CloudWatch Logs