[アップデート] CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
先日、CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました。
アップデート前まで
アップデート前までログイベントあたりの最大サイズは 256 KB でした。この値は、ハードリミットのため、拡張できませんでした。
cloudwatch logs 256 KB で調べてみると、いくつかのサービスではログのサイズが 256 KB を超えると、ログの送信をスキップしたり、欠損する処理が発生することがわかりました。
私は体験したことが(おそらく)ないのですが、この事象が発生すると、いざとなったときに辛いですね。ログの流量を制御する必要があります。
アップデート後
今回のアップデートで最大ログサイズが 256 KB から 1 MB に拡張されました。これにより、先ほどの欠損トラブルが起きにくい状況になりました。
また、 OpenTelemetry Protocol (OTLP) endpoint にも有効な仕様のようです。
Amazon CloudWatch Logs now supports log events up to 1 MB in size, a 4x increase from the previous 256 KB limit. This enhancement applies to the CloudWatch Logs PutLogEvents API and OpenTelemetry Protocol (OTLP) endpoint.
やってみる
それでは 256 KB を超えるログを PutLogEvents してみましょう。コードは生成 AI に作ってもらいました。my-log-group
と my-log-stream-test
は作成しておきます。
#!/bin/bash
# 環境変数からパラメータを取得し、デフォルト値を設定
LOG_GROUP_NAME="${LOG_GROUP_NAME:-my-log-group}"
LOG_STREAM_NAME="${LOG_STREAM_NAME:-my-log-stream-test}"
FILE_SIZE="${FILE_SIZE:-1048000}" # デフォルトは約1MB
LOG_FILE="${LOG_FILE:-}" # ログファイルのパス(指定がなければ生成)
echo "=== CloudWatch Logs 大容量ログ送信テスト ==="
echo "ロググループ: $LOG_GROUP_NAME"
echo "ログストリーム: $LOG_STREAM_NAME"
echo "ターゲットサイズ: $FILE_SIZE バイト"
# ログストリームの確認と作成
aws logs describe-log-streams \
--log-group-name "$LOG_GROUP_NAME" \
--log-stream-name-prefix "$LOG_STREAM_NAME" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "ログストリームを作成します..."
aws logs create-log-stream \
--log-group-name "$LOG_GROUP_NAME" \
--log-stream-name "$LOG_STREAM_NAME"
fi
# シーケンストークンの取得
SEQUENCE_TOKEN=$(aws logs describe-log-streams \
--log-group-name "$LOG_GROUP_NAME" \
--log-stream-name-prefix "$LOG_STREAM_NAME" \
--query 'logStreams[0].uploadSequenceToken' \
--output text)
# シーケンストークンパラメータの設定
TOKEN_PARAM=""
if [ "$SEQUENCE_TOKEN" != "None" ] && [ -n "$SEQUENCE_TOKEN" ]; then
TOKEN_PARAM="--sequence-token $SEQUENCE_TOKEN"
fi
# 現在のタイムスタンプ (ミリ秒)
TIMESTAMP=$(date +%s000)
# ログメッセージの準備
if [ -n "$LOG_FILE" ] && [ -f "$LOG_FILE" ]; then
# 指定されたファイルを使用
echo "指定されたログファイルを使用します: $LOG_FILE"
ACTUAL_SIZE=$(wc -c < "$LOG_FILE")
echo "ファイルサイズ: $ACTUAL_SIZE バイト"
if [ $ACTUAL_SIZE -gt $FILE_SIZE ]; then
echo "ファイルが指定サイズより大きいため、${FILE_SIZE}バイトに切り詰めます"
head -c $FILE_SIZE "$LOG_FILE" > "${LOG_FILE}.tmp"
LOG_CONTENT=$(cat "${LOG_FILE}.tmp")
rm "${LOG_FILE}.tmp"
else
LOG_CONTENT=$(cat "$LOG_FILE")
fi
else
# 指定されたサイズのログを生成
echo "指定されたサイズ(${FILE_SIZE}バイト)のログを生成します..."
# ログメッセージのプレフィックス
PREFIX="This is a test log message of size ${FILE_SIZE} bytes. Generated at $(date). "
PREFIX_LEN=${#PREFIX}
# 残りのスペースを埋めるための文字を生成
REMAINING_SIZE=$((FILE_SIZE - PREFIX_LEN))
if [ $REMAINING_SIZE -le 0 ]; then
# プレフィックスだけで十分な場合
LOG_CONTENT="${PREFIX:0:$FILE_SIZE}"
else
# 'A'を繰り返して残りのスペースを埋める(効率的な方法)
FILLER=""
CHAR="A"
FILLER="$CHAR"
# ダブリングアプローチで文字列を効率的に生成
while [ ${#FILLER} -lt $REMAINING_SIZE ]; do
FILLER="$FILLER$FILLER"
done
# 正確なサイズに切り詰め
FILLER="${FILLER:0:$REMAINING_SIZE}"
LOG_CONTENT="$PREFIX$FILLER"
fi
fi
# 実際のログサイズを確認
ACTUAL_LOG_SIZE=${#LOG_CONTENT}
echo "生成されたログメッセージサイズ: $ACTUAL_LOG_SIZE バイト"
# 一時JSONファイルを作成
TMP_FILE=$(mktemp)
echo "{" > "$TMP_FILE"
echo " \"logGroupName\": \"$LOG_GROUP_NAME\"," >> "$TMP_FILE"
echo " \"logStreamName\": \"$LOG_STREAM_NAME\"," >> "$TMP_FILE"
echo " \"logEvents\": [" >> "$TMP_FILE"
echo " {" >> "$TMP_FILE"
echo " \"timestamp\": $TIMESTAMP," >> "$TMP_FILE"
echo " \"message\": \"$LOG_CONTENT\"" >> "$TMP_FILE"
echo " }" >> "$TMP_FILE"
echo " ]" >> "$TMP_FILE"
echo "}" >> "$TMP_FILE"
# JSONファイルのサイズを確認
JSON_SIZE=$(wc -c < "$TMP_FILE")
echo "JSONペイロードサイズ: $JSON_SIZE バイト"
# ログイベントを送信
echo "CloudWatch Logsにログを送信しています..."
aws logs put-log-events \
--cli-input-json file://"$TMP_FILE" \
$TOKEN_PARAM
# 結果のステータスコードを保存
RESULT=$?
# 一時ファイルを削除
rm "$TMP_FILE"
# 結果を表示
if [ $RESULT -eq 0 ]; then
echo "✅ ログイベントの送信に成功しました!"
else
echo "❌ ログイベントの送信に失敗しました。エラーコード: $RESULT"
fi
まずは 500 KB を指定してログを送信します。うまくログが転送できていますね。
takakuni@cwl % FILE_SIZE=500000 ./send_large_log.sh
=== CloudWatch Logs 大容量ログ送信テスト ===
ロググループ: my-log-group
ログストリーム: my-log-stream-test
ターゲットサイズ: 500000 バイト
指定されたサイズ(500000バイト)のログを生成します...
生成されたログメッセージサイズ: 500000 バイト
JSONペイロードサイズ: 500184 バイト
CloudWatch Logsにログを送信しています...
{
"nextSequenceToken": "49661067834680783184671566391485838831999976091498316530"
}
✅ ログイベントの送信に成功しました!
マネジメントコンソールからも確認してみます。内容はあまり良いログではないですが、送信できていることがわかります。
続いてスレスレの 1048000 バイトで試してみます。こちらも送信できました。
takakuni@cwl % FILE_SIZE=1048000 ./send_large_log.sh
=== CloudWatch Logs 大容量ログ送信テスト ===
ロググループ: my-log-group
ログストリーム: my-log-stream-test
ターゲットサイズ: 1048000 バイト
指定されたサイズ(1048000バイト)のログを生成します...
生成されたログメッセージサイズ: 1048000 バイト
JSONペイロードサイズ: 1048184 バイト
CloudWatch Logsにログを送信しています...
{
"nextSequenceToken": "49659709580765963496453739927788357617099063702788767922"
}
✅ ログイベントの送信に成功しました!
最後に 1048600 バイトを指定して送信してみます。想定通り 1 MB より大きいログは送信できないことがわかりますね。
takakuni@cwl % FILE_SIZE=1048600 ./send_large_log.sh
=== CloudWatch Logs 大容量ログ送信テスト ===
ロググループ: my-log-group
ログストリーム: my-log-stream-test
ターゲットサイズ: 1048600 バイト
指定されたサイズ(1048600バイト)のログを生成します...
生成されたログメッセージサイズ: 1048600 バイト
JSONペイロードサイズ: 1048784 バイト
CloudWatch Logsにログを送信しています...
An error occurred (InvalidParameterException) when calling the PutLogEvents operation: Log event too large: 1048644 bytes exceeds limit of 1048576
❌ ログイベントの送信に失敗しました。エラーコード: 254
ログの取り込み料金に注意
今回、PutLogEvents API あたりのログの最大取り込みサイズが 1 MB に拡張されたわけですが、CloudWatch Logs のコストに注意しながら、ログの流量を調整しましょう。
ログ破産しないようなアーキテクチャには引き続き気をつけたいですね。
まとめ
以上、「CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました。」でした。
このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!