AWS CLIを使用してCloudWatchLogsを操作してみる
こんにちは、CLI操作にハマっている下地です。
AWSを運用しているとCloudWatchのログを確認することはとても重要です。今回は、CloudWatchログの理解を深めるためAWS CLIコマンドを使用してCoudWatchLogs(Logs)を作成し確認してみようと思います。
手順
全体の流れとして作成したログストリームにイベントをPUTしデータを確認していきます。
- ロググループを作成する
- ストリームを作成する
- ログイベントをPUTする
- ログイベントを確認する
- tailコマンドを使ってみる
- ロググループを削除する
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
を使用します。
上記サイトを確認すると、PUT時にはリクエストに1つ前のリクエストで表示されたトークン(nextSequenceToken)を含める必要があります
という事がわかりました。
こちらより初回時にはトークンは不要ですが、2回目からはトークンが必要になりますので上記のリンクのコードを参考にログイベントをPUTするためのシェルファイル(put_event.sh)を作成します。
処理内容としては、以下のようになります。
- ストリーム名とメッセージ内容を引数で取得
- uploadSequenceTokenの有無を確認
- uploadSequenceTokenの有無によって処理内容を分岐
#!/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
を使ってログインベントを確認してみます。詳しい使い方についてはこちらの記事にまとまっておりましたので興味のある方はぜひ確認してみてください。
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についてはとても便利で今後使う頻度が多くなりそうだなと実感しました。