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と、ログ出力先の情報を紐付けます。
ログが保存されるリソースは、利用する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
をクリックし、以下の条件を入力します
除外フィルターが不要になった場合も、インデックスの設定画面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.
※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。
※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。
© 2021 TIS Inc.