Amazon Web Services ブログ
Amazon CloudWatch からテレメトリデータを取得する:ログ編
Amazon CloudWatch Logs は AWS 環境におけるログ管理の中心的なサービスとして、様々なソースからのログデータを収集、監視、分析する機能を提供しています。一方で、長期保存のコスト最適化やサードパーティのログ分析ツールとの連携など、様々な理由からログデータを CloudWatch Logs から他の場所に転送する必要が生じることがあります。
本記事では、CloudWatch Logs からログを転送する必要が生じるユースケースと、AWS が提供する3つの転送方法について詳細に説明します。それぞれの方法の特徴、制限事項、そして適用シナリオについて解説していきます。
本記事ではログの取得方法について解説します。メトリクスの取得については Amazon CloudWatch からテレメトリデータを取得する:メトリクス編をご参照ください。
はじめに
ログの取り出し方法を説明する前に、まず AWS 上で稼働するサービスのログ発行の特徴について解説します。
AWS 環境では、図1に示すようにログの収集経路が大きく2つあります。
- AWS マネージドサービスが発行するログ
ALB、Amazon Route 53、Amazon S3、Amazon RDS、AWS Lambda など、多くのマネージドサービスは標準で Amazon CloudWatch にログを送信します。この方法ではログ収集のためのコードや特別な処理を組む必要がないため、実装工数が少なくて済むというメリットがあります。
ただし、一部のサービスは CloudWatch ではなく Amazon S3 や Amazon Data Firehose に直接ログを送信する場合があります。利用するサービスのログ出力先は、こちらのドキュメントにまとめられています。 - OS レイヤーや独自アプリケーションのログ
EC2 の OS ログや、開発したアプリケーション内部のログなどは、デフォルトでは自動収集されません。
収集するには設定が必要であり、最も簡単な方法は Amazon CloudWatch エージェント(統合エージェント)を導入し、CloudWatch に送信する構成です。
では、次に Amazon CloudWatch に収集されたログを取り出す手段について解説していきます。
図1. AWS におけるログの種類
CloudWatch Logs からログを転送する方法
ここから本ブログの主題であるログを転送するため3つの方法をご紹介します。
1 : サブスクリプションフィルターを用いる方法
サブスクリプションフィルターとは、CloudWatch Logs に記録されたログをリアルタイムに他のサービスに配信をする仕組みです。名前の通りフィルターなので、特定のパターンにマッチするものだけを配信や、すべてのログの配信が可能です。配信先は「Amazon Kinesis Data Streams」「Amazon Data Firehose」「AWS Lambda」「Amazon OpenSearch Service」が選択可能で、ロググループレベルで設定する方法と、アカウントレベルで設定する方法があります。アカウントレベルで設定すれば、ロググループ一つずつにサブスクリプションフィルターを設定する必要がないという利点があります。
フィルターの種類に悩まれる方も多いかと思いますが、まずは、Amazon Data Firehose の検討から進めることをおすすめします。Amazon Data Firehose の配信先には Amazon S3 をはじめとする AWS サービスや、サードパーティの監視ソリューションに直接配信も可能です。詳細については、ドキュメントをご覧ください。
2 : CloudWatch のエクスポート機能
エクスポートとは、CloudWatch Logs のログデータを Amazon S3にエクスポートする機能です。「単一のロググループ」「開始日時(ミリ秒単位)」「終了日時(ミリ秒単位)」を指定し、エクスポートタスクを CLI や AWS Systems Manager 経由で作成し、非同期で実行します。ログデータのエクスポートが開始されるまで最大 12 時間かかる場合があり、またエクスポートタスクは 24 時間でタイムアウトするため、タスクが失敗する場合はエクスポート指定区間を短くする必要があります。また、アカウントごとにアクティブなエクスポートタスクは 1 つだけというクォータがあり、複数のロググループを並列でエクスポートできない点に注意が必要です。
3 : API を用いる方法
API を経由の取得を正確に理解するために、CloudWatch Logs のログデータの格納方法とその名称を整理しましょう。
ロググループ
├── ログストリーム1
│ ├── ログイベント1
│ ├── ログイベント2
│ └── ログイベント3
├── ログストリーム2
│ ├── ログイベント1
│ └── ログイベント2
└── ログストリーム3
└── ログイベント1
CloudWatch Logs は、ロググループ、ログストリーム、ログイベントの3層構造でログデータを管理します。
ログイベントは、モニタリングされているアプリケーションまたはリソースによって記録されたアクティビティのレコードで、タイムスタンプと生のイベントメッセージの 2 つのプロパティを持ちます。
ログストリームは、同じソースを共有する一連のログイベントで、モニタリングされているアプリケーションインスタンスやリソースから送信された順序でイベントを表します。ストリームの分割単位は送信元のサービスによって異なります(例:EC2 ではインスタンスごと、Lambda では関数の実行ごと)。
ロググループは、保持、監視、アクセス制御について同じ設定を共有するログストリームのグループを定義し、各ログストリームは必ず 1 つのロググループに属する必要があります。
AWS マネージドサービスがログを自動生成する場合は、この構造を深く意識する必要はありません。しかし、API 経由でログデータを取得する際には、この 3 層構造を意識する必要があります。
では、改めてCloudWatch Logs が提供している、ログを取り出す API を紹介いたします。
GetLogEvents- 指定したログストリームからログイベントを一覧表示する API です。すべてのログイベントを一覧表示したり、時間範囲を使用してフィルタリングが可能です。
- この API の主な用途は、特定のログストリームからのログイベント取得です。そのため、ロググループ全体を指定したログの取得はできません。
FilterLogEvents- 複数のロググループやログストリームにわたってログを検索・フィルタリングできます。より高度な検索機能を提供する API です。
- この API の主な用途は、複数のロググループを対象にしたログイベントの取得です。
StartLiveTail- リアルタイムにログを取得できる API です。マネジメントコンソール経由で利用できる Live Tail を API 経由で利用できます。
tail -fコマンドのようにリアルタイムでログをストリーミング取得することが可能です。 - この API の主な用途は、リアルタイムに CloudWatch Logs へ取り込まれたログの確認です。
- リアルタイムにログを取得できる API です。マネジメントコンソール経由で利用できる Live Tail を API 経由で利用できます。
これらの API には多くの制限があるため、使用する際にはそれらを意識する必要があります。
まず、GetLogEvents と FilterLogEvents には共通して「最大 1 MB のログイベント、または最大 10,000 件のログイベント」のみが含まれるという制限が存在しています。いずれかの制限を超えるような場合は、nextToken が返却されます。
大量のログデータを取得する際は、このページング機能を使用する必要があります。具体的には、API レスポンスに含まれる nextToken を次のリクエストのパラメータとして指定し、nextToken の出力が空になるまで繰り返し API を呼び出します。これにより、制限を超えるログデータを段階的に取得できます。以下の表は、この制限がどのように適用されるかを示した例です。パターン 1 のように両方の制限内に収まる場合は 1 回で取得が完了しますが、パターン 2〜4 のようにいずれかの制限を超える場合は、nextToken が返却され、ページングが必要になります。
| パターン | ログイベントサイズ | ログイベント件数 | 結果 |
|---|---|---|---|
| 1 | 0.8 MB | 7,000 | 1回で取得完了 |
| 2 | 1.2 MB | 15,000 | ログデータの一部とnextToken の返却 (サイズ超過) |
| 3 | 0.5 MB | 20,000 | ログデータの一部とnextToken の返却 (件数超過) |
| 4 | 1.5 MB | 5,000 | ログデータの一部とnextToken の返却 (両方超過) |
ただし、nextToken が空であるからといって、すべてのログを取り出したことを保証していません。たとえば、直近のログは API での取得が終了した後に CloudWatch Logs に登録される可能性があるからです。そのため、リアルタイムに近いログを継続的に取得したい場合は、定期的に API を呼び出すか、StartLiveTail API の使用を検討してください。
また、これらの API には呼び出し数に関してもクォータが存在します。2026 年 1 月現在、バージニア北部リージョンであっても、GetLogEvents/FilterLogEvents は 1 秒あたり 25 リクエストの制限があるため、同時に呼び出しが想定される場合は注意が必要です。
ログの取り出しが必要となるユースケース
CloudWatch Logs からログを取り出す手段について理解できたところで、次に実際の活用場面を見ていきましょう。以下では、ログの取り出しが必要となる代表的なユースケースを 3 つご紹介します。
ユースケース① 長期保存要件のあるログのコスト最適化
【活用する方法:サブスクリプションフィルター、エクスポート機能】
多くの組織では、コンプライアンスやガバナンス要件に基づいて、ログデータを 5 年や 7 年といった長期間保存する必要があります。このような場合、保存コストの最適化が重要な課題となります。
CloudWatch Logs では、アクセス頻度に応じて 2 つのストレージクラスを選択できます。標準ストレージクラスの保存料金は、東京リージョンで USD 0.033/GB(月額)です。一方、アクセス頻度の低いログには Infrequent Access (IA) ストレージクラスを利用でき、保存料金は USD 0.011/GB(月額)と、標準ストレージクラスの約 3 分の 1 のコストで保存できます。ただし、IA ストレージクラスではデータスキャン料金(USD 0.0055/GB)が発生するため、頻繁にクエリを実行するログには適していません。また、IA ストレージクラスのログは S3 へのエクスポート機能を利用できない点にも注意が必要です。
さらにコストを削減したい場合は、Amazon S3 へのエクスポートも検討できます。Amazon S3 スタンダードストレージの料金は USD 0.025/GB です。この差額は一見小さいものの、ログデータの量が増加し保存期間が長くなるにつれ、コスト差は拡大していきます。加えて Amazon S3 の場合はストレージクラスの変更が可能であり、Glacier Deep Archive を利用すると USD 0.002/GB まで料金を削減できます。
以下の表は、1 TB のログデータを 5 年間保存した場合のコスト比較例です。
| ストレージ | 月額料金(USD/GB) | 5年間の総コスト(1TB) |
|---|---|---|
| CloudWatch Logs 標準 | 0.033 | USD 1,980 |
| CloudWatch Logs IA | 0.011 | USD 660 |
| Amazon S3 スタンダード | 0.025 | USD 1,500 |
| Amazon S3 Glacier Deep Archive | 0.002 | USD 120 |
この表からわかるように、アクセス頻度の低いログであれば CloudWatch Logs IA を利用することで、CloudWatch Logs 内でクエリ機能を維持しながらコストを削減できます。さらに長期保存でほとんどアクセスしないログの場合は、S3 Glacier Deep Archive を利用することで大幅なコスト削減が可能です。
また、「最初から S3 に配信する」という手段も考えられますが、その場合はログのクエリに Amazon Athena などの別の仕組みを用いる必要があります。一般的にログの検索においては、CloudWatch Logs Insights の方が高機能であるという利点があります。そのため、直近のログは CloudWatch Logs で保持してクエリを実行し、一定期間経過後に S3 にエクスポートするといったハイブリッドなアプローチも有効です。
ユースケース② サードパーティソリューションとの連携
【活用する方法:サブスクリプションフィルター】
今日の IT 業界には CloudWatch 以外にも様々な特徴を持つ監視ソリューションが多くのベンダーから提供されています。組織で既に監視ソリューションが指定されていたり、CloudWatch にはない機能が必要になった場合は、それらのサービスにログを転送する必要があります。
多くのサードパーティソリューションでは、テレメトリを収集し、直接サードパーティサービスに送信するエージェントを提供しています。ただし、AWS には CloudWatch や S3 経由でしか取得できないログが存在しています。これらは CloudWatch からの転送操作が必要です。
ユースケース③ カスタムアプリケーションからの参照
【活用する方法:API(GetLogEvents、FilterLogEvents、StartLiveTail)】
ローカルのコマンドラインで一時的にログを参照したり、LLM アプリケーションでのログ検索や独自の運用ツールでログデータを活用したいケースが考えられます。例えば、「過去 1 週間のエラーログを要約して」といった自然言語でのログ分析や、チーム独自のダッシュボードでリアルタイムログ監視を行いたい場合です。
また、障害調査時に開発者がローカル環境で柔軟にログを検索・分析したり、特定のビジネスロジックに基づいた独自のアラート機能を構築したいといったニーズもあります。さらに、既存の社内ツールやワークフローにログデータを組み込んで、より効率的な運用を実現したい場合もあるでしょう。
このユースケースでは、CloudWatch Logs API を使用してプログラムからログデータを取得します。特定のログストリームから取得する場合は GetLogEvents、複数のロググループを横断して検索する場合は FilterLogEvents、リアルタイムでログを監視する場合は StartLiveTail を使用します。これらの API を活用することで、柔軟なログ活用が可能になります。
まとめ
記事では、Amazon CloudWatch Logs からログデータを転送する 3 つの主要な方法について解説しました。
- サブスクリプションフィルター:リアルタイムでのログ転送に適しており、サードパーティソリューションとの連携や S3 への継続的な転送に活用できます
- エクスポート機能:過去の特定期間のログを S3 にまとめて転送する際に適しており、長期保存のためのコスト最適化に有効です
- API(GetLogEvents、FilterLogEvents、StartLiveTail):カスタムアプリケーションからの柔軟なログ取得に適しており、独自の運用ツールやダッシュボードの構築に活用できます
手段を選択する際は、以下の観点から総合的に判断することが重要です。
- リアルタイム性の要否
- 転送するログの量と頻度
- コストとパフォーマンスのトレードオフ
- 既存システムとの連携要件
適切な手法を選択することで、運用コストの削減と機能性の向上を両立した、効率的なログ管理戦略を実現できます。各手段の詳細については、AWS ドキュメントも併せてご参照ください。
著者
伊藤 威
アマゾン ウェブ サービス ジャパン合同会社 ソリューションアーキテクト
