CloudWatch Logs へテストログを書き込み
概要
- CloudWatch Logs のログストリームにテストログを書き込む方法を記載します。今回の私の目的は、CloudWatch Logs にサブスクリプションフィルターを設定後、フィルターが正しく機能しているかを確認するためでした。
- テストログの書き込みは、AWS CLI の aws logs put-log-events を使用します。
- 新しく作成されたログストリームにPutLogEvents が呼ばれた場合はシーケンストークンの指定は必要ありませんが、後続のPutLogEvents の呼び出しには、前回のPutLogEvents のレスポンスから取得したシーケンストークンを指定する必要があります。
- 前回のレスポンスが不明な場合、シーケンストークンは、aws logs describe-log-streams から確認することができます。
- ログイベントは、Timestamp順に時系列である必要があります。Timestampは、イベントが発生した時刻であり、Unix time (1970/1/1 00:00:00 UTC)からのミリ秒数で表現されます。
- Timestampの指定は、2時間以上未来の場合や、14 日以上過去の場合、ロググループの保持期間より古い場合は記録されません。
- ログストリームごとに1秒あたり5リクエストのクォータがあります。
- アップロードするログの最大バッチサイズは、1MBです。これは、指定のログに26 Byteを加えたものです。
- その他の説明は、こちらのドキュメントを参照。
ロググループ / ログストリームを作成する
- テストログを出力する先のロググループ / ログストリームを作成します。
- コンソールから CloudWatch のサービスを開きます。
- ロググループを選択し、「ロググループを作成」を押します。
- ロググループ名を指定し、「作成」を押します。
- 作成したロググループを選択し、「ログストリームを作成」を押します。
- ログストリーム名を指定し、「Create」を押します。
- ログストリームが作成されました。
テストログを書き込む
- AWS CLI のaws logs put-log-eventsを使用します。
- timestamp には
node -e 'console.log(Date.now())
によって現在日時を設定します。
aws logs put-log-events --log-group-name ロググループ名 --log-stream-name ログストリーム名 --log-events timestamp=$(node -e 'console.log(Date.now())'),message="テストログ"
- 以下、AWS CLI のaws logs put-log-events の実行結果です。レスポンスに、シーケンストークンが出力されました。
$ aws logs put-log-events --log-group-name niikawa-test --log-stream-name Testlog --log-events timestamp=$(node -e 'console.log(Date.now())'),message="ERROR-1"
{
"nextSequenceToken": "49624509995586930163950622318112001238954107959752261730"
}
- CloudWatch Logs に、テストログが出力されたことを確認します。
- 再度、aws logs put-log-events を実行するとInvalidSequenceTokenException のエラーになります。
$ aws logs put-log-events --log-group-name niikawa-test --log-stream-name Testlog --log-events timestamp=$(node -e 'console.log(Date.now())'),message="ERROR-2"
An error occurred (InvalidSequenceTokenException) when calling the PutLogEvents operation: The given sequenceToken is invalid. The next expected sequenceToken is: 49624509995586930163950622318112001238954107959752261730
- 新しく作成されたログストリームにログを書き込む場合はシーケンストークンを指定する必要はありません。しかし、後続の書き込みは、以下の様にaws logs put-log-events にシーケンストークンを指定する必要があり、シーケンストークンを指定しないと、InvalidSequenceTokenException のエラーが発生します。
$ aws logs put-log-events --log-group-name niikawa-test --log-stream-name Testlog --log-events timestamp=$(node -e 'console.log(Date.now())'),message="ERROR-2" --sequence-token 49624509995586930163950622318112001238954107959752261730
{
"nextSequenceToken": "49623824394611685460412219365418983372009176809665986610"
}
- シーケンストークンは、前回のコマンドのレスポンスから取得する方法以外に、aws logs describe-log-streams を使用することで確認ができます。
niikawa@niikawa1:~$ aws logs describe-log-streams --log-group-name niikawa-test
{
"logStreams": [
{
"logStreamName": "Testlog",
"creationTime": 1642771386503,
"firstEventTimestamp": 1642771886935,
"lastEventTimestamp": 1642771886935,
"lastIngestionTime": 1642772636190,
"uploadSequenceToken": "49623824394611685460412219365418983372009176809665986610",
"arn": "arn:aws:logs:ap-northeast-1:111111111111:log-group:niikawa-test:log-stream:Testlog",
"storedBytes": 0
}
]
}
- CloudWatch Logs に、2つ目のテストログが出力されたことを確認します。