エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

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をインストールし、アクセスキー・シークレットアクセスキーを用意しておいて下さい。

docs.aws.amazon.com

シェルスクリプトを書く

"/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させているのはその為。)

参考情報

CloudWatch Logs Insights のクエリ構文 - Amazon CloudWatch Logs

start-query — AWS CLI 2.7.29 Command Reference

get-query-results — AWS CLI 2.7.29 Command Reference