コンテンツにスキップ

datadog_log_trigger pattern

概要

datadog_log_trigger patternモジュールでは、datadog_fowarder patternでデプロイしたAWS Lambda関数を、AWS内のログリソースに紐付けます。

この紐付けを行うことで、AWS環境内のログをDatadogへ転送することが実現できます。

想定する適用対象環境

datadog_log_trigger patternは、Delivery環境およびRuntime環境のいずれでも使用できますが、主としてRuntime環境で利用することになるでしょう。

依存するpattern

datadog_log_trigger patternは、事前に以下のpatternが適用されていることを前提としています。

pattern名 利用する情報
datadog_forwarder pattern Datadogが提供するAWS Lambda関数のARN

また、収集対象となるログを出力するpatternも適用されている必要があります。

datadog_log_trigger patternでは、Datadog Forwarderと呼ばれるDatadogが提供するAWS Lambda関数を使用してログ転送を行います。

AWS上にログを出力するpattern

Eponaが提供するpatternでAWS上にログを保存しうるものは、以下があります。

pattern名 ログの内容 ログの保存先
network VPCフローログ Amazon CloudWatch LogsまたはAmazon S3
cacheable_frontend アクセスログ(Amazon CloudFront) Amazon S3
cacheable_frontend サーバーアクセスログ(Amazon S3) Amazon S3
public_traffic_container_service コンテナログ Amazon CloudWatch Logs
public_traffic_container_service アクセスログ(ALB) Amazon S3
database ログ(エンジンごとに異なる) Amazon CloudWatch Logs
database 拡張モニタリング Amazon CloudWatch Logs
webacl WebACLトラフィックログ Amazon S3
audit 証跡ログ Amazon S3
rule_violation AWS Lambda関数の実行ログ Amazon CloudWatch Logs
threat_detection AWS Lambda関数の実行ログ Amazon CloudWatch Logs
cd_pipeline_frontend CodeBuildの実行ログ Amazon CloudWatch Logs

⚠️ datadog_forwarder patternによりデプロイされるAWS Lambda関数のログは紐付けの対象外とします(転送がループするため)。

各patternのドキュメントのOutputに、ログの出力先の情報が記録されます。
datadog_log_trigger patternでは、これをRemote Stateで参照します。

構築されるリソース

このpatternでは、以下のリソースが構築されます。

リソース名 説明
Amazon CloudWatch Logs サブスクリプションフィルタ Datadog Forwarderを呼び出すための、サブスクリプションフィルタが設定されます
Amazon S3 通知 バケットにイベントが発生した際に、Datadog Forwarderを呼び出すように通知設定を行います

いずれも、Datadog ForwarderによるAWS Lambda関数を呼び出すためのイベントトリガーが設定されます。

モジュールの理解に向けて

patternのコンセプト

datadog_log_trigger patternは、ログをDatadogに転送するAWS Lambda関数とログ保存リソースを紐付けるだけの、シンプルなモジュールです。

各patternにおいて、利用するマネージドサービスやコンテナ等、ログを出力することが自明なものにはあらかじめOutputに出力先が設定されています。
datadog_log_trigger patternでは、datadog_forwarder patternがデプロイしたAWS Lambad関数のARNと、ログ出力先の情報を紐付けます。

datadog_log_trigger patternの全体像

ログが保存されるリソースは、利用するpatternやシステムの構成内容により、変化します。
datadog_forwarder patternの実行時にすべて揃っているとは限らず、その後に増減することもあるでしょう。
このため、datadog_forwarder patternで紐付けの設定までは行わず、2つのpatternはライフサイクルとして分離しています。

紐付けには、ログ出力先がAmazon CloudWatch Logsの場合はロググループ名、Amazon S3バケットの場合はバケット名を使用します。

各patternのログ有無、またログの保存先リソースについては、AWS上にログを出力するpatternおよび各patternの入出力リファレンスを参照してください。

Datadog Forwarderとログリソースの紐付け

実際の紐付けイメージを記載します。

datadog_forwarder patternによってデプロイされたAWS Lambda関数のARNは、Remote Stateで参照できます。
これをdatadog_log_trigger patternの引数として設定します。

  datadog_forwarder_lambda_arn = data.terraform_remote_state.production_datadog_forwarder.outputs.datadog_forwarder.datadog_forwarder_lambda_function_arn

紐付け先のリソースに関しては、Amazon CloudWatch Logsに対してはcloudwatch_log_subscription_filtersで指定します。

  cloudwatch_log_subscription_filters = concat(
    [
      {
        log_group_name = data.terraform_remote_state.production_network.outputs.network.flow_log_cloudwatch_log_group_name
      }
    ],

    ## ログリソースの分だけ記載
  )

ℹ️ concat関数を使用しているのは、database patternのようにロググループ数が可変(list)になるものがあるためです。

Amazon S3の場合はlogging_s3_bucket_notificationsで指定します。

  logging_s3_bucket_notifications = [
    {
      bucket = data.terraform_remote_state.production_public_traffic_container_service.outputs.public_traffic_container_service.load_balancer_access_logs_bucket
    },

    ## ログが保存されるS3バケット分だけ記載
  ]

いずれの変数とも、mapを要素としたlistを設定します。
このmapの要素としては、少なくともAmazon CloudWatch Logsではロググループ名、Amazon S3ではバケット名を指定します。
AWS Lambda関数とのARNの紐付けは、datadog_log_trigger pattern内で行います。

ℹ️ 転送するログを絞りたい場合は、ログフィルターを定義できます。

ログフィルターについて

Datadogでは、サービスに関連するすべてのログをDatadogに収集したうえで、必要に応じて検索・可視化することが想定されています (参照)。
よって、Eponaでもdatadog_log_trigger patternを使って可能な限りDatadogにログを送信することを推奨します。
とはいえ、Datadogのログ収集についての課金額は インデックス化されたログイベントの量によって決まる ことから、ログの課金額を抑えたいケースもあるでしょう。
その場合、Datadog側で除外フィルターを設定することで、Datadogにログを送信しつつ課金額を抑えるという方法があります。

Datadogに送信されたログイベントで、除外フィルターの条件に合致するものはインデックス化されません。
インデックス化されないログイベントは、検索、パターン、分析、ログ監視に 利用できなくなります。
しかし、ログ情報自体はDatadogに送られているためメトリクスの収集や、 メトリクスを使った可視化は可能です。

ℹ️ 除外したログを対象に パイプラインを使った非構造ログの可視化ダッシュボード作成をする場合、 特殊な対応が必要となります。詳細は各how toのログフィルターが設定されている場合の注意点を参照してください。

ログの出力量が多い一方、ログ本文を参照する可能性が低いもの、傾向だけわかればよいものは除外フィルターの候補になるでしょう。
たとえば、VPCフローログなどがこれにあたると考えられます。

設定方法

除外フィルターは インデックスの設定画面1 で設定します。
たとえば、epona-staging-network-flow-logというVPCフローログを除外する場合は、Datadog側で以下のように設定します。

1. [INDEXES]のmain>をクリックします 1. + Add an Exclusion Filterをクリックし、以下の条件を入力します
log_filterの設定内容

除外フィルターが不要になった場合も、インデックスの設定画面1でオン・オフの切り替えが可能です。

複数のリージョンへの対応

AWS環境内でログが複数のリージョンに保存される場合、使用しているリージョンの数だけdatadog_forwarder patternを適用します。
これに伴い、ログの転送設定を行うdatadog_log_trigger patternについても各リージョンに対して行う必要があります。

複数リージョンへの対応

cacheable_frontend等、使用するリージョンが決められているpatternを使っている場合は注意してください。

サンプルコード

datadog_log_trigger patternを使用したサンプルコードを、以下に記載します。

module "datadog_log_trigger" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/datadog_log_trigger?ref=v0.2.6"

  datadog_forwarder_lambda_arn = data.terraform_remote_state.production_datadog_forwarder.outputs.datadog_forwarder.datadog_forwarder_lambda_function_arn

  cloudwatch_log_subscription_filters = concat(
    [
      {
        log_group_name = data.terraform_remote_state.production_network.outputs.network.flow_log_cloudwatch_log_group_name
      }
    ],
    [for name in data.terraform_remote_state.production_database.outputs.database.instance_log_group_names : {
      log_group_name = name
    }],
    [
      {
        log_group_name = data.terraform_remote_state.production_database.outputs.database.monitoring_log_group_name
      }
    ],

    ## ログが保存されるCloudWatch Logsロググループ分、リストアップする
  )

  logging_s3_bucket_notifications = [
    {
      bucket = data.terraform_remote_state.production_public_traffic_container_service.outputs.public_traffic_container_service.load_balancer_access_logs_bucket
    },

    ## ログが保存されるS3バケット分、リストアップする
  ]
}

cacheable_frontend patternを使用する等、異なるリージョンのログも収集する場合は、デフォルトのリージョン以外をProviderに指定してください。

provider "aws" {
  assume_role {
    role_arn = "..."
  }

  region = "us-east-1"
}

module "datadog_log_trigger" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/datadog_log_trigger?ref=v0.2.6"

  ...
}

この場合、複数のdatadog_log_trigger patternインスタンスを使用します。

関連するpattern

datadog_log_trigger patternは、AWS環境からログ転送を行う終端のpatternとなります。

Datadogに転送されたログからのメトリクス抽出等については、ドキュメントを参照してください。

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
aws >= 3.37.0, < 4.0.0

Inputs

Name Description Type Default Required
datadog_forwarder_lambda_arn datadog_forwarder patternでデプロイした、Lambda関数のARN string n/a yes
cloudwatch_log_subscription_filters CloudWatch Logsに紐付けるサブスクリプションフィルター定義のリスト。

フィルター定義はmapで表現する。最小定義は、以下のようになる。
{
log_group_name = "サブスクライブするロググループ名"
}

任意項目を含めたmapの完全な定義は、以下のようになる。
{
name = "サブスクリプションフィルター名。未指定の場合、モジュール内で自動設定する"
log_group_name = "サブスクライブするロググループ名"
filter_pattern = "ログイベントをサブスクライブするパターン。未指定の場合、すべてのイベントを対象とする"
destination_arn = "ログイベントの送信先ARN。未指定の場合は、datadog_forwarder_lambda_arnに指定した値が使用される"
role_arn = "CloudWatch Logsがイベントを送信先に送るために必要な権限を含んだIAMロールARN"
}

これらの定義を含んだリストを設定する。
[
{
log_group_name = "log_group1"
},
{
log_group_name = "log_group2"
}
]
list(map(string)) [] no
logging_s3_bucket_notifications ログ用のS3バケットに紐付ける通知定義のリスト。

通知定義は、mapで表現する。最小定義は、以下のようになる。
{
bucket = "通知を紐付けるS3バケット名"
}

任意項目を含めたのmapの完全な定義は、以下のようになる。
{
bucket = "通知を紐付けるS3バケット名"
id = "通知設定のユニークなID"
lambda_function_arn = "通知を受け取るLambdaのARN。未指定の場合は、datadog_forwarder_lambda_arnに指定した値が使用される"
events = "どのイベントに対して通知を行うか。未指定の場合は、\"s3:ObjectCreated:*\"が指定される。複数のイベントを指定する場合は、,区切りの文字列で指定すること"
filter_prefix = "通知をオブジェクトのキー名のprefixで絞り込む場合に使用"
filter_suffix = "通知をオブジェクトのキー名のsuffixで絞り込む場合に使用"
}

これらの定義を含んだリストを設定する。
[
{
bucket = "bucket1"
},
{
bucket = "bucket2"
}
]
list(map(string)) [] no

Outputs

No output.


  1. Datadogへのログインが必要です。 


※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.