CloudWatch Logs へテストログを書き込み

1月 21, 2022AWS,CloudWatch

概要

  • 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つ目のテストログが出力されたことを確認します。

 

 

関連資料

AWS,CloudWatch

Posted by takaaki