Cloud Watch Insightsのクエリをシェルスクリプトから実行する
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をインストールし、アクセスキー・シークレットアクセスキーを用意しておいて下さい。
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
シェルスクリプトを書く
“/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でクエリを実行しています。--log-group-name: ロググループ名--start-time: 対象期間の開始(UNIX time)--end-time: 対象期間の終了(UNIX time)--query-string: Cloud Watch Insightsのクエリ構文を指定
aws logs get-query-resultsでクエリの実行結果を取得できます。
ここで注意すべき点は、クエリ実行直後は結果取得ができないのでウェイトを挟む必要があることです。 (while文でstatusが“Complete”になるまでsleepさせているのはその為。)
参考情報
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/start-query.html
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/get-query-results.html