Datadog Forwarder(AWS) についてのメモ
Datadog Logs へ AWS のログを送る仕組みについて、古い知識のままだったので調べ直したメモ。
AWS から Datadog Logs への送信
AWS の各種ログを送信する方法として2パターン用意されています。 ここで言うログは EC2やECS 内のログではなく、 CloudWatch Log または S3 バケットに保存しているログを指しています。
現在公式ページに記載されているのは、Kinesis Firehose destination)、Forwarder Lambda function となり、 いずれも CloudFormation が用意されています。
Kinesis Firehose destination
CloudWatch logs -> Firehose -> Datadog の流れです。 大量送信する場合はこちらが推奨とのこと。
CloudFormation のテンプレートは公式ドキュメントから参照できます。 少し古いのかそのまま利用すると IAM Role のポリシーが一部エラーとなります。
- https://docs.datadoghq.com/resources/json/kinesis-logs-cloudformation-template.json
- Datadog UI からのリンクは提供されていない模様
- 公式Doc にリンクが記載
CloudWatchLogsPolicy
の Action に kinesis:〜 が指定されていますが、 kinesis:PutRecordBatch は存在しません。
また、iam:PassRole も不要です。
{ "Statement":[ { "Effect":"Allow", "Action":["firehose:*"], "Resource":["arn:aws:firehose:region:123456789012:*"] } ] }
source タグ
定義箇所を見つけられませんでしたが、ある程度自動振り分けしてくれるようです。
Lambda Function の LogGroup (/aws/lambda/...
) を対象とすると source:lambda となりました。
Forwarder Lambda function
S3 から Datadog Logs へ送信するパターンです。
CloudFormation のテンプレートは公式ドキュメントから参照できます。 また、AWS Integration 設定の CloudFormation にも含まれています。(Setup : Automatic - CloudFormation で作成される ForwarderStack)
- Forwarder Lambda function
- https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml
- Datadog UI からのリンクは提供されていない模様
- 公式Doc に CloudFormation 画面へのリンク有り
- AWS Integration
- https://datadog-cloudformation-template.s3.amazonaws.com/aws/main.yaml
- "Integrations" -> "Amazon Web Services Integration" -> "Configuration"
- 新規作成 ("Add Another Account") 時に CloudFormation 画面へのリンク有り
トリガー
トリガーは自動設定も可能です。 AWS Integration 用の IAM Role に必要権限を追加し、Datadog 側 "Amazon Web Services Integration" -> "Collect Logs" で Forwarder の Lambda Function を登録、チェックボックスを設定することで自動的に収集が走ります。 (非常に便利な機能ではありますが、意図せず大量にログが送信される事が懸念です。)
手動の場合は、転送したい対象に各々設定します。
- CloudWatch Log
- Log Group に Forwarder Lambda へ向けた Subscription Filter を設定
- S3
- S3 バケットに Forwarder Lambda へ向けた Event notification を設定
転送の除外
特定のログを Datadog 側に送信したくない場合の除外設定を行う箇所は以下になります。 Forwarder Lambda 側に条件指定する場合、必要に応じて追加の Forwarder Lambda を作成するなど考慮が必要になるかもしれません。
- CloudWatch Log
- Subscription Filter で条件指定
- S3
- 特定のファイル・パス
- Event notification で Prefix/Suffix 指定
- ログ本文
- Forwarder Lambda 側で除外条件指定
- 特定のファイル・パス
source タグ
Lambda Function 内処理で振り分けされます。 前はLambdaコンソールから直接参照できましたが、最新版では主処理がLayerに移動したようでした。 Layerは CloudFormation 実行時に GitHub から取得しています。
datadog-serverless-functions/parsing.py at master · DataDog/datadog-serverless-functions
CloudWatch Log
- LogGroup名での判定
find_cloudwatch_source
- LogGroup名での判定
- S3
- Object Key での判定
find_s3_source
- Object Key での判定
source タグについて
Datadog Logs へログを送信すると事前定義されたPipelineにより自動的にパースしてくれます。 この際の判定に source タグが利用されます。
- Getting Started with Tags
- source: Span filtering and automated pipeline creation for log management
source タグとパースに利用される事前定義されたPiplelineは以下から参照できます。
source タグ付与条件に合致しなかった場合(S3 バケットに出力している CloudFront アクセスログが、 source:s3 となってしまった場合など)、Pipelineを複製(Clone)して任意のログにPipelineを適用する事も可能です。