[アップデート] CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました

[アップデート] CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました

Clock Icon2025.04.07

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

先日、CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/04/amazon-cloudwatch-logs-increases-log-event-size-1-mb/

アップデート前まで

アップデート前までログイベントあたりの最大サイズは 256 KB でした。この値は、ハードリミットのため、拡張できませんでした。

https://dev.classmethod.jp/articles/tsnote-cloudwatchlogs-lambda-limits-256kb/

cloudwatch logs 256 KB で調べてみると、いくつかのサービスではログのサイズが 256 KB を超えると、ログの送信をスキップしたり、欠損する処理が発生することがわかりました。

https://zenn.dev/nh8939/articles/7983ea7bb80e5c

https://repost.aws/knowledge-center/cloudtrail-track-api

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html#create-additional-configuration-files

私は体験したことが(おそらく)ないのですが、この事象が発生すると、いざとなったときに辛いですね。ログの流量を制御する必要があります。

アップデート後

今回のアップデートで最大ログサイズが 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-groupmy-log-stream-test は作成しておきます。

send_large_log.sh
#!/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"
}
✅ ログイベントの送信に成功しました!

マネジメントコンソールからも確認してみます。内容はあまり良いログではないですが、送信できていることがわかります。

2025-04-07 at 23.31.05-CloudWatch  ap-northeast-1.png

続いてスレスレの 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 のコストに注意しながら、ログの流量を調整しましょう。

ログ破産しないようなアーキテクチャには引き続き気をつけたいですね。

https://dev.classmethod.jp/articles/comparison-of-fees-for-cloudwatch-logs-and-s3/

まとめ

以上、「CloudWatch Logs でログイベントあたりの最大ログサイズが 256 KB から 1 MB に拡張されました。」でした。

このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.