Amazon CloudWatch Logsの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAmazon CloudWatch Logsに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- Amazon CloudWatch Logsとは
- Amazon CloudWatch Logsの活用
- Amazon CloudWatch Logs for Advance
- Amazon CloudWatch Logsのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- Amazon CloudWatch Logsがどういうサービスか説明できるようになりたい人
- Amazon CloudWatch Logsを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人


# Amazon CloudWatch Logsとは
Amazon CloudWatch Logsは、AWSクラウド上の様々なリソースやアプリケーションから生成されるログデータを収集、保存、モニタリングするためのマネージドサービスです。

EC2インスタンス、Lambda関数、Route 53、API GatewayなどのAWSサービスやカスタムアプリケーションから生成されるログデータを収集し、セキュアに保存できるので、ログデータが分散していても一元的に管理できます。

また、CloudWatch Logsは検索クエリ言語を提供しているので、ログデータから必要な情報を簡単に見つけることができます。
検索クエリ言語を利用することで特定の期間やイベントを含むログエントリを抽出することが可能です。

# Amazon CloudWatch Logsの活用
## ロググループとログストリーム
CloudWatch Logsはログを論理的にグループ化する「ロググループ」を提供し、各グループ内のログを更に区別する「ログストリーム」でデータを管理します。

ロググループは、Amazon CloudWatch Logs内でログデータを論理的にまとめた単位です。
これは、アプリケーションやサービスごとにログを整理するためのグループであり、同じロググループ内に関連するログエントリが格納されます。

ログストリームは、ロググループ内で生成される実際のログエントリのストリームです。
各ログストリームは一意な識別子を持ち、それぞれが特定のイベントやタイムスタンプに関連するログデータを含んでいます。
例えば、EC2インスタンスごとに異なるログストリームが作成され、その中にはそのインスタンスが生成したログデータが格納されます。

## メトリクスフィルター
Amazon CloudWatch Logsのメトリクスフィルタは、ログデータから特定の情報を抽出し、それをCloudWatch Metricsに変換する機能です。
これにより、ログデータから必要なメトリクスを効率的に取得し、時系列で変化する指標として活用できます。

メトリクスフィルタは自動的にロググループ内で適用され、定期的にログデータを評価して条件に一致すれば即座にメトリクスに変換されます。

エラーログのカウントやリクエスト処理時間の計測、カスタムイベントの検知など、さまざまな使用例があり、CloudWatch Logsをより効果的にモニタリングし、アラート設定や異常検知に活用できます。

なお、メトリクスフィルタは過去のログに対してはメトリクス変換を行わないことに注意が必要です。
あくまで、メトリクスフィルタを作成後に生成されたCloudWatch Logsのログのみを対象とします。

# Amazon CloudWatch Logs for Advance
# ログのエクスポート
Amazon CloudWatch Logsでは、ログデータのエクスポートを行うために複数のオプションが提供されています。

![](https://storage.googleapis.com/zenn-user-upload/12ebf18dbc7c-20231204.png)

主な手段としては、Amazon S3へのエクスポート、Amazon Kinesis Data Firehoseを活用したリアルタイムなエクスポート、AWS Lambdaを使用したカスタムなエクスポート、そしてCloudWatch Logs Insightsを使用したクエリ結果のエクスポートが挙げられます。

ログエクスポートを活用することで、長期的なデータの保持や外部ツールへの連携など、柔軟で効果的なログデータの活用が可能となります。

注意点としてはログ連携が必ずしもリアルタイムではないという点です。
特にCloudWatch Logsから直接S3に出力する場合には準リアルタイムですらありません。

リアルタイム性に関する要件を精査して、リアルタイム性が重要であればサブスクリプションフィルタを用いてKinesisシリーズに連携することが必要です。

# クロスアカウントでのログ収集
CloudWatch Logsにおけるクロスアカウントでのログ収集は、異なるAWSアカウントからログデータを中央のCloudWatch Logsに集約する仕組みです。

![](https://storage.googleapis.com/zenn-user-upload/7e54c6f21fcb-20231204.png)

クロスアカウントでのログ収集により、異なるアカウントからのログデータを一元的に管理し、セキュアで効率的なモニタリング環境を構築できます。
これは特に複数のAWSアカウントを利用する組織において、統合的なログ管理の重要な手段となります。

# CloudWatch Logs Insights
Amazon CloudWatch Logs Insightsは、CloudWatch Logs内の膨大なログデータを高度なクエリツールを使用して検索し、分析するためのサービスです。

SQLライクなクエリ言語を提供し、複雑な検索条件や集計操作が可能です。
リアルタイムでログデータを分析し、自動的にフィールドを認識して柔軟なクエリが行えます。
以下にクエリの基本構文を記載します。
```sql
fields @timestamp, @message  # フィールドの選択
| filter someField = 'someValue'  # フィルタリング条件
| sort @timestamp desc  # ソート条件
| limit 20  # 結果の表示数
```

クエリ結果はグラフやテーブルで視覚化でき、トラブルシューティングやパフォーマンスモニタリング、異常検知などさまざまな目的に利用されます。

# Amazon CloudWatch Logsのベストプラクティス
以下にAmazon CloudWatch Logsを利用するときのベストプラクティスをまとめました。

|ベストプラクティス | 説明|
|--- | ---|
|ロググループの適切な構造 | ロググループはアプリケーションやサービスごとに適切に構造化し、ログデータを整理します。|
|適切なログストリームの設定 | ログストリームは一意で分かりやすい識別子を使用して設定し、ログの出所や種類を区別できるようにします。|
|ログデータの適切なレベル | ログの冗長さや詳細度を適切に設定し、必要な情報を取得できるようにします。|
|CloudWatch Logs Insightsの活用 | 大容量のログデータに対して複雑なクエリを実行する際には、CloudWatch Logs Insightsを活用して効率的に検索します。|
|ログデータのエクスポートとアーカイブ | 長期間のログデータを保持する必要がある場合は、定期的なエクスポートとアーカイブを設定してデータを保管します。|

とりあえずログは出しておけ、というのはある種正しい時もありますが見たいものを見たいときに低コストで見れるほうが好ましいのもまた事実です。

また、ベストプラクティスからは外しましたがマルチアカウントを運用している組織の場合はクロスアカウントでのログ収集を活用しログを1つのアカウントに集約することがおすすめです。

これは監査対応やインシデント時の対応を考慮すると、1つのアカウントだけを見ればよいという状態にメリットがあるからです。

# まとめ
この記事ではAmazon CloudWatch Logsに関連する内容を超詳細にまとめました。

- Amazon CloudWatch Logsとは
- Amazon CloudWatch Logsの活用
- Amazon CloudWatch Logs for Advance
- Amazon CloudWatch Logsのベストプラクティス

次回はCloudWatch Agent、CloudWatch Alarm、CloudSyntheticsをまとめて超詳細解説します。