📚🔄☁️

OSログローテーション × CloudWatch Logs エージェント
適合確認ガイド

〜 図書館の本の整理係とメモ係の連携を理解しよう 〜

🎯 結論ファースト:これだけ覚えよう!

✅ 推奨設定

copytruncate 方式を使う!
CloudWatch Logsエージェントと最も相性が良い

⚠️ 要注意設定

create 方式はファイルが変わるため、エージェントの追跡が切れる可能性あり

🔧 対処法

create方式を使う場合はfile_fingerprint_lines設定で対応可能

📍 確認ポイント

logrotate.conf と CloudWatch エージェント設定の両方をチェック!

📖 たとえ話で理解しよう

🏛️ 図書館の「日誌管理」でイメージしよう!

あなたは図書館の館長です。図書館では毎日の出来事を日誌に記録しています。
この日誌の管理方法と、それを常に読んでメモを取る秘書さんの連携を考えてみましょう。

📔

ログローテーション = 日誌の整理係

図書館の日誌は毎日どんどん増えていきます。
整理係は定期的に古い日誌を片付けて、
新しい日誌を用意する仕事をしています。

🖥️ 実際のシステムでは:
logrotate がこの役割。ログファイルが大きくなりすぎないように、古いログを圧縮・削除して新しいログファイルを用意します。
📝

CloudWatch Logs エージェント = メモ係の秘書

秘書さんは日誌を常に監視して、
新しい内容が書かれるたびに
すぐにクラウド上の本部にメモを送信します。

🖥️ 実際のシステムでは:
CloudWatch Logs エージェントがこの役割。ログファイルを監視して、新しいログエントリをリアルタイムでAWSのCloudWatch Logsに送信します。

🔄 ログローテーション方式の比較

✅ CloudWatchと相性◎

📋 copytruncate 方式

📖 たとえ話:「同じ日誌を使い続ける」

整理係は日誌の内容をコピーして別の場所に保管した後、
元の日誌の中身を空にするけど、同じ日誌帳を使い続ける
秘書さんは同じ日誌を見続ければOK!

1 ログファイルの内容をコピーして保存
2 元のログファイルの中身を空にする(truncate)
3 同じファイル(同じinode)を継続使用

📊 CloudWatch Logsとの相性

ファイルのinode番号が変わらない
エージェントの追跡が途切れない
設定変更なしで使える
⚠️ 設定に注意

📄 create 方式(デフォルト)

📖 たとえ話:「新しい日誌帳に切り替え」

整理係は古い日誌を別の棚に移動して、
新しい日誌帳を用意する。
秘書さんは「あれ?どの日誌を見ればいいの?」と迷う!

1 現在のログファイルをリネーム(.1 をつける)
2 新しい空のログファイルを作成
3 新しいファイル=新しいinode番号

📊 CloudWatch Logsとの相性

⚠️ ファイルのinode番号が変わる
⚠️ エージェントが古いファイルを追跡し続ける可能性
🔧 file_fingerprint_lines設定で対応可能

🔍 相性診断チャート

確認項目 copytruncate create(デフォルト)
📁 ファイルのinode保持 ✅ 保持される ❌ 変更される
👀 エージェントの追跡継続 ✅ 自動継続 ⚠️ 設定が必要
📊 ログの欠損リスク ⚠️ コピー中の書込みは欠損 ✅ 欠損なし
⚙️ 追加設定の必要性 ✅ 不要 ⚠️ fingerprint設定推奨
🔄 ローテーション後の動作 ✅ シームレスに継続 ⚠️ 再検出が必要
💡 推奨シナリオ CloudWatch連携時に推奨 高精度ログが必要な時

📐 動作の違いを図解

✅ copytruncate 方式の動作

📄 app.log
inode: 12345
🔍 エージェント
監視中
⬇️
📋 コピー&空にする
⬇️
📄 app.log
inode: 12345 ✨同じ
🔍 エージェント
継続監視OK!
✅ エージェントは同じファイルを追跡し続けられる!

⚠️ create 方式の動作

📄 app.log
inode: 12345
🔍 エージェント
監視中
⬇️
📦 リネーム&新規作成
⬇️
📄 app.log.1
inode: 12345
📄 app.log
inode: 67890 🆕
🤔 エージェント
どっちを見る?
⚠️ 追加設定なしだと古いファイルを追い続ける可能性

⚙️ 具体的な設定例

📄 /etc/logrotate.d/myapp(推奨設定)

/var/log/myapp/*.log {
    daily                    # 毎日ローテーション
    rotate 7                 # 7世代保持
    compress                 # 古いログを圧縮
    delaycompress            # 1世代前から圧縮
    missingok                # ファイルがなくてもエラーにしない
    notifempty               # 空のファイルはローテーションしない
    copytruncate             # ⭐ CloudWatch連携に重要!
}

💡 ポイント

copytruncate を指定することで、CloudWatch Logsエージェントが 同じファイルを追跡し続けられます。アプリケーションの再起動も不要です。

☁️ /etc/awslogs/awslogs.conf(旧エージェント)

# CloudWatch Logs Agent 設定
[/var/log/myapp/application.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /var/log/myapp/application.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /myapp/application

# ⭐ create方式を使う場合は以下を追加
file_fingerprint_lines = 1-3    # ファイルの先頭1-3行で識別

💡 file_fingerprint_lines の役割

ファイルの先頭数行をフィンガープリント(指紋)として使用し、 ローテーション後も正しいファイルを追跡できるようにします。 create方式を使う場合は必ず設定しましょう。

🔧 /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/myapp/application.log",
            "log_group_name": "/myapp/application",
            "log_stream_name": "{instance_id}",
            "timestamp_format": "%Y-%m-%d %H:%M:%S",
            // ⭐ create方式対策
            "auto_removal": true,
            "retention_in_days": 14
          }
        ]
      }
    },
    "force_flush_interval": 5
  }
}

💡 統合エージェントの利点

統合CloudWatch Agentはファイルパスベースの追跡を行うため、 create方式でも比較的安定して動作します。ただし、 copytruncate方式を使う方がより確実です。

✅ 適合確認チェックリスト

📋 logrotate側の確認

対象ログの logrotate 設定ファイルを特定した
copytruncate または create のどちらか確認した
ローテーション間隔(daily/weekly等)を確認した
保持世代数を確認した

☁️ CloudWatch Agent側の確認

監視対象のファイルパスが正しい
create方式の場合、fingerprint設定を追加した
datetime_format がログ形式と一致している
ログストリーム名の命名規則を確認した

🧪 動作テストの確認

手動でログローテーションを実行してテストした
ローテーション後もCloudWatchにログが届いている
ログの欠損がないことを確認した
エージェントのエラーログを確認した

🔧 トラブルシューティング

😱 ローテーション後にログが届かなくなった

🔍 原因

create方式でinodeが変わり、エージェントが古いファイルを追跡している

✅ 解決策

1. logrotateをcopytruncate方式に変更する
2. または、file_fingerprint_lines設定を追加
3. エージェントを再起動:
sudo systemctl restart amazon-cloudwatch-agent

😱 ログが重複して送信される

🔍 原因

エージェントの状態ファイルが破損、または複数のエージェントが同じファイルを監視

✅ 解決策

1. 状態ファイルを削除して再起動:
sudo rm /var/lib/awslogs/agent-state
2. 設定を見直して重複監視を排除
3. initial_positionをend_of_fileに変更

😱 copytruncate でログが欠損する

🔍 原因

コピー中にログが書き込まれると、その分が失われる可能性がある

✅ 解決策

1. ログ出力が少ない時間帯にローテーションを実行
2. 高精度が必要な場合はcreate方式 + fingerprint設定
3. buffer_durationを短くしてリアルタイム性を向上

😱 Permission denied エラー

🔍 原因

エージェントがログファイルにアクセスする権限がない

✅ 解決策

1. ログファイルの権限を確認:
ls -la /var/log/myapp/
2. エージェントユーザーを適切なグループに追加
3. logrotateでcreate設定に権限を指定

🌟 ベストプラクティス

1

copytruncateを基本に

特別な理由がなければcopytruncate方式を選択。CloudWatch Logsとの連携が最もスムーズ。

2

ローテーション前にテスト

logrotate -d でドライランを実行し、設定の動作を事前確認。

3

監視アラートを設定

CloudWatch メトリクスで IncomingLogEvents を監視し、ログ停止を早期検知。

4

ドキュメント化

logrotateとCloudWatch Agent両方の設定をドキュメント化し、チームで共有。

5

定期的な動作確認

月1回はログ収集が正常に動作しているか確認。特にローテーション前後。

6

適切な保持期間

OS側とCloudWatch側の両方で適切なログ保持期間を設定し、コスト最適化。

🎓 まとめ

📔

ログローテーション

日誌の整理係
古いログを片付けて
ディスク容量を管理

📝

CloudWatch Agent

メモ係の秘書
ログを監視して
クラウドに送信

🤝

相性のカギ

ファイルの識別方法
inode vs ファイルパス
copytruncateが安心

🎯 最重要ポイント:

OSのログローテーション設定を変更する前に、
必ずCloudWatch Logsエージェントとの互換性を確認しよう!

迷ったら copytruncate方式 を選択すれば、
エージェントが同じファイルを追跡し続けられるので安心です 🎉

Created by SSuzuki1063

AWS SAP Learning Resources