AWS CLIを使用してCloudWatchLogsを操作してみる

2020.12.19

こんにちは、CLI操作にハマっている下地です。

AWSを運用しているとCloudWatchのログを確認することはとても重要です。今回は、CloudWatchログの理解を深めるためAWS CLIコマンドを使用してCoudWatchLogs(Logs)を作成し確認してみようと思います。

手順

全体の流れとして作成したログストリームにイベントをPUTしデータを確認していきます。

  1. ロググループを作成する
  2. ストリームを作成する
  3. ログイベントをPUTする
  4. ログイベントを確認する
  5. tailコマンドを使ってみる
  6. ロググループを削除する

1. ロググループを作成

まずはcreate-log-groupを使用してロググループを作成します。

$ aws logs create-log-group --log-group-name ロググループ名

2. ストリームを作成

次にcreate-log-streamを使用して作成したロググループに2つのストリームを作成します。

$ aws logs create-log-stream --log-group-name ロググループ名 --log-stream-name stream_1
$ aws logs create-log-stream --log-group-name ロググループ名 --log-stream-name stream_2

3. ログイベントをPUTする

では作成したストリームにイベントをPUTします。PUTする際にはput-log-eventsを使用します。

文字列をCloudWatchLogsにPUTしてみた

上記サイトを確認すると、PUT時にはリクエストに1つ前のリクエストで表示されたトークン(nextSequenceToken)を含める必要がありますという事がわかりました。 こちらより初回時にはトークンは不要ですが、2回目からはトークンが必要になりますので上記のリンクのコードを参考にログイベントをPUTするためのシェルファイル(put_event.sh)を作成します。

処理内容としては、以下のようになります。

  • ストリーム名とメッセージ内容を引数で取得
  • uploadSequenceTokenの有無を確認
  • uploadSequenceTokenの有無によって処理内容を分岐

put_event.sh

#!/usr/bin/bash

LOG_GROUP_NAME=ロググループ名
LOG_STREAM_NAME="$1" # 第一引数: stream名を取得
LOG_MSG="$2"         # 第二引数: msg内容を取得

TIME_EPOCH="`date +%s`000"
LOG_EVENTS="timestamp=${TIME_EPOCH},message=\"${LOG_MSG}\"" # timestampとメッセージ内容

# uploadSequenceTokenの有無を確認する
UploadSequenceToken=$(aws logs describe-log-streams --log-group-name "$LOG_GROUP_NAME" --query 'logStreams[?logStreamName==`'$LOG_STREAM_NAME'`].[uploadSequenceToken]' --output text)

# uploadSequenceTokenの有無によって処理内容を分岐
if [ "$UploadSequenceToken" != "None" ]
then
  # トークン有りの場合
  aws logs put-log-events --log-group-name ${LOG_GROUP_NAME} --log-stream-name ${LOG_STREAM_NAME} --log-events "${LOG_EVENTS}" \
      --sequence-token ${UploadSequenceToken}
else
  # トークン無しの場合(初回のput)
  aws logs put-log-events --log-group-name ${LOG_GROUP_NAME} --log-stream-name ${LOG_STREAM_NAME} --log-events "${LOG_EVENTS}"
fi

では作成したシェルファイルを使用して各ストリームに2件ずつデータをPUTします。

$ bash put_cwevent.sh stream_1 "ERROR: test1"
{
    "nextSequenceToken": "1234567890***********************************************"
}
$ bash put_cwevent.sh stream_1 "PASS: test1"
{
    "nextSequenceToken": "1234567890***********************************************"
}

$ bash put_cwevent.sh stream_2 "ERROR: test2"
{
    "nextSequenceToken": "1234567890***********************************************"
}
$ bash put_cwevent.sh stream_2 "PASS: test2"
{
    "nextSequenceToken": "1234567890***********************************************"
}

無事にPUTする事ができました。

4. ログイベントを確認する

ではget-log-eventsを使用してPUTしたログイベントを確認します。

$ aws logs get-log-events --log-group-name ロググループ名 --log-stream-name stream_1
{
    "events": [
        {
            "timestamp": 1608*********,
            "message": "ERROR: test1",
            "ingestionTime": *******
        },
        {
            "timestamp": 1608*********,
            "message": "PASS: test1",
            "ingestionTime": *******
        }
    ],
    "nextForwardToken": "f/1234567890***********************************************",
    "nextBackwardToken": "b/1234567890***********************************************"
}
$ aws logs get-log-events --log-group-name ロググループ名 --log-stream-name stream_2
{
    "events": [
        {
            "timestamp": 1608*********,
            "message": "ERROR: test2",
            "ingestionTime": *******
        },
        {
            "timestamp": 1608*********,
            "message": "PASS: test2",
            "ingestionTime": *******
        }
    ],
    "nextForwardToken": "f/1234567890***********************************************",
    "nextBackwardToken": "b/1234567890***********************************************"
}

stream_1とstream_2にPUTしたイベントを確認できました。

5. tailコマンドを使ってみる

では次に、tailを使ってログインベントを確認してみます。詳しい使い方についてはこちらの記事にまとまっておりましたので興味のある方はぜひ確認してみてください。

AWS CLI V2でCloudWatch Logsのロググループをtailできるようになりました!

tail使用時には、ロググループ名を指定してロググループ単位でイベントの確認を行います。

では実行してみます。

$ aws logs tail ロググループ名
2020-12-16T01:17:13+00:00 stream_1 ERROR: test1
2020-12-16T01:17:35+00:00 stream_1 PASS: test1
2020-12-16T01:17:43+00:00 stream_2 ERROR: test2
2020-12-16T01:17:54+00:00 stream_2 PASS: test2

確認できました。

次に特定の文字列(ERROR)のみのイベントを確認するために --filterを使用します。

$ aws logs tail ロググループ名 --filter ERROR
2020-12-16T01:17:43+00:00 stream_2 ERROR: test2

結果が返ってきましたがERROR2しか表示されません。

tail実行時のデフォルトのログ取得範囲が10分になるためERROR1を投入して10分を超えた事が原因のようです。そのため、--sinceを使用して1時間以内のデータを確認するように修正します。

$ aws logs tail ロググループ名 --filter ERROR --since 1h
2020-12-16T01:17:13+00:00 stream_1 ERROR: test1
2020-12-16T01:17:43+00:00 stream_2 ERROR: test2

確認できました!

6. ロググループを削除する

最後にdelete-log-groupを使用して作成したロググループを削除します(ロググループ削除時に含まれているストリームも削除されます)。

今回は全て削除するのですが個別のストリームのみを削除したい場合はdelete-log-streamを使用します。

$ aws logs delete-log-group --log-group-name ロググループ名

削除後の戻り値はありませんので、describeを使用して削除されたか確認します。

& aws logs describe-log-groups --log-group-name-prefix ロググループ名
{
    "logGroups": []
}

指定したロググループの取得結果がない事から削除されている事が確認できました。

まとめ

AWSを運用する上で大切なCloudWatchログの理解を深めるためにAWS CLIを使用して実装してみました。特にtailについてはとても便利で今後使う頻度が多くなりそうだなと実感しました。

参考リンク