DEA / ドメイン3 データ運用とサポート
Amazon CloudWatch Logs
Logs は、アプリケーションや AWS のサービスが出すログを集めて保存し、検索、化、ほかのサービスへの転送を行うサービスです。データパイプラインでは、、、、 などの実行ログを1か所に集め、障害の調査、監査、トレーサビリティ (後から処理の経緯をたどれること) に使います。
DEA では、CloudWatch Logs でアプリケーションのデータをログに記録するための設定と、その自動化 (保持期間、エージェント、メトリクスフィルター、、エクスポート) に重点が置かれます。
Point
- Log group (ロググループ) は同じ種類のログのまとまり、Log stream (ログストリーム) はその中の発生元ごとの流れです。
- Retention = 保持 で、ログを何日間残すかの設定です。
- Subscription filter (サブスクリプションフィルター) は、条件に合うログをリアルタイムでほかのサービスへ送り続ける設定です。
- 和訳
- Retention: 保持
- Weblio英和辞書「retention」
概要
ログは、集める、保存する、活用する、の3段階で扱います。
| 段階 | 機能 |
|---|---|
| 集める | AWS のサービスからの自動の送信、 エージェント、 の PutLogEvents |
| 保存する | ロググループごとの保持期間、ログクラス、 による暗号化、機密データのマスキング |
| 活用する | フィルター、、、 へのエクスポート、Live Tail |
主要技術
①ロググループ、保持期間、ログクラス ⚠️ 頻出
ロググループの保持期間は、既定では「期限なし (失効しない)」です。1日から10年までの期間を選べるため、要件に合わせて設定しないと、ログが無期限にたまり続けて保存の料金が増えます。
| 設定 | 内容 |
|---|---|
| 保持期間 | 期限を過ぎたログは自動で削除されます。監査で長く残す必要があるログは、 へ移して安いで保管します。 |
| による暗号化 | ロググループに KMS キーを関連付け、ログを自分のキーで暗号化します。 |
| ログクラス | Standard (すべての機能) と Infrequent Access (取り込みの料金が安く、機能が限られる) から選びます。作成後は変更できません。 |
| データ保護 | ログの中のメールアドレスやクレジットカード番号などの機密データを検出してマスクします。 |
| ログクラス | 使える主な機能 | 向くログ |
|---|---|---|
| Standard | フィルター、、Live Tail、、 など、すべて | リアルタイムの監視や通知に使うログ |
| Infrequent Access | Logs Insights のクエリ、S3 へのエクスポート、暗号化など一部。メトリクスフィルターとサブスクリプションフィルターは使えません | 事後の調査や監査のためにまとめて保管するログ |
⚠️ 頻出: 「ログが無期限に残ってコストが増えている」は保持期間の設定、「ほとんど見ないログを安く集めたい」は Infrequent Access のログクラスです。ただし、メトリクスフィルターやサブスクリプションフィルターが必要なログには使えません。
②ログを集める設定
| 発生元 | 集め方 |
|---|---|
標準出力とログ出力が自動で /aws/lambda/<関数名> のロググループに送られます。ログの形式 (テキスト / ) とログレベルを関数の設定で変えられます。ログレベルは JSON の形式で使え、アプリケーションのログレベルを INFO にすると DEBUG のログは送られず、取り込みの料金を抑えられます。実行ロールにログを書く権限が必要です。 | |
ドライバーとのログが /aws-glue/jobs/ 以下のロググループに送られます。連続ログ記録 (continuous logging) を有効にすると、実行中のログも確認できます。 | |
| 環境の設定で、 の解析、スケジューラー、タスク、ワーカー、Web サーバーのログをそれぞれ有効にします (#25)。 | |
| Express ワークフローの実行履歴や、Standard の詳細なログを、ログのレベル (ALL、ERROR、FATAL) を指定して送ります。 | |
| ステップのログは のログの場所 (ログ URI) に保存されます。 エージェントを使って CloudWatch Logs に送ることもできます。 | |
| / | CloudWatch エージェントを入れ、送るログファイルを設定ファイルで指定します。設定ファイルは Parameter Store に置いて、多数のサーバーへ配れます。 |
| 自前のアプリケーション | の PutLogEvents でログを書きます。 |
ログは JSON などの構造化した形で出すと、 で項目ごとに検索・集計しやすくなります。ジョブ名、実行 ID、処理件数、エラーの種類を項目として含めると、後から処理の経緯をたどれます。
③メトリクスフィルター
フィルターは、ログの中のパターン (例: ERROR という文字、 の status が FAILED) に合う行を数えたり、ログの中の数値を取り出したりして、 のメトリクスに変換します。メトリクスになれば、で に通知できます。
| 例 | 内容 |
|---|---|
| エラーの件数 | ERROR を含む行を数え、5 分間に 10 件を超えたら通知します。 |
| 処理件数 | JSON のログの records_processed の値をメトリクスにし、急減を検知します。 |
メトリクスフィルターは、フィルターを作った後に届いたログにだけ適用されます。過去のログを集計したい場合は を使います。
④サブスクリプションフィルター ⚠️ 頻出
は、条件に合うログをリアルタイムでほかのサービスへ送り続けます。送り先は次の4つです。
| 送り先 | 向く場面 |
|---|---|
| ログを に集めて長期保管し、 で分析する。 や へも届けられます。 | |
| 複数のコンシューマーで独自のリアルタイム処理をする | |
| 条件に合うログを受けて、通知や加工をすぐに行う | |
| Amazon OpenSearch Service | ログを全文検索とダッシュボードで分析する |
送られるデータは gzip で圧縮され、base64 で符号化されています。複数のアカウントのログを1つのアカウントに集めるには、送り先のアカウントに「宛先 (destination)」を作り、送り元のアカウントからサブスクリプションフィルターを設定します。アカウント単位のサブスクリプションフィルターで、アカウントのすべてのロググループにまとめて設定することもできます。
を使っている場合は、 Logs の集約ルール (centralization rule) で、メンバーアカウントと複数ののロググループを、1つの集約先のアカウント・リージョンへ自動で複製することもできます。ルールは管理アカウント (または委任管理者) で作り、ルールを作った後に届いたログだけが対象です (過去のログは複製されません)。集約先では で全アカウントのログをまとめてクエリできます。
⚠️ 頻出: 「CloudWatch Logs のログを、ほぼリアルタイムに S3 へ集めて Athena で分析したい」は、サブスクリプションフィルター → Firehose → S3 です。
⑤S3 へのエクスポートと Logs Insights
| 方法 | 動き | 向く場面 |
|---|---|---|
| へのエクスポート (CreateExportTask) | 指定した期間のログを、まとめて S3 にコピーします。リアルタイムではなく、完了まで時間がかかることがあります | 過去のログを一度だけ、または定期的にまとめて長期保管する |
| + | 届いたログを継続的に S3 へ送ります | ほぼリアルタイムに S3 へ集めたい |
| ログに対してクエリを実行します (#65) | Logs にあるログをその場で調べる |
⑥ログ記録の設定の自動化
ログの設定を手作業で行うと、新しく作られたロググループに保持期間や暗号化が付かないまま放置されがちです。
| 自動化の方法 | 内容 |
|---|---|
| でロググループを作る | 、、 でロググループを明示的に定義し、保持期間と キーを指定します (#28)。 が自動で作るロググループは保持期間が「期限なし」になるため、先に IaC で作っておきます。 |
| + Lambda | ロググループの作成イベント (CreateLogGroup の 呼び出し) を受けて、Lambda で保持期間を設定します。 |
| のルール | 保持期間を検査し、自動修復で設定します (#76)。ただし、マネージドルールの cw-loggroup-retention-period-check は「期限なし」のロググループを準拠と判定するため、期限なしを見つけるにはカスタムルールが要ります。 |
| アカウント単位のポリシー | データ保護 (マスキング) やを、アカウントのロググループにまとめて適用します。 |
| エージェントの設定の配布 | で、エージェントの設定を多数のサーバーへ配ります。 |
試験対策
①判断マトリクス
| 問題文のキーワード | 選ぶもの | 理由 |
|---|---|---|
| ログの保存コストが増え続けている | ロググループの保持期間を設定 | 既定は期限なしです。 |
| 監査用にログを長期保管、安く | へ送り、ライフサイクルで安いクラスへ | Logs より安く長期保管できます。 |
| ログの中の ERROR の件数で通知 | フィルター + + | ログをメトリクスに変えて監視します。 |
| ログをほぼリアルタイムに S3 / へ | ( / OpenSearch) | 継続的に転送します。 |
| 複数アカウントのログを1つのアカウントに集約 | 送り先アカウントの宛先 + サブスクリプションフィルター | アカウントをまたいで転送できます。 |
| 過去の期間のログを一度にまとめて S3 へ | S3 へのエクスポート | 指定期間をコピーします。 |
| のアプリケーションのログを集めたい | CloudWatch エージェント | 指定したログファイルを送ります。 |
| ログの中のを隠したい | データ保護ポリシー (マスキング) | 機密データを検出してマスクします。 |
| 新しいロググループに必ず保持期間を付けたい | で作成 / のルールと自動修復 | 手作業の漏れを防ぎます。 |
| ほとんど見ないログを安く集めたい | Infrequent Access のログクラス | 取り込みの料金が安くなります。 |
②よくある誤答
- フィルターで過去のログも集計できると考えること。作成後に届いたログだけが対象です。
- へのエクスポートでリアルタイムに転送できると考えること。継続的な転送はです。
- Infrequent Access のログクラスで、メトリクスフィルターやサブスクリプションフィルターを使おうとすること。使えません。