コンテンツにスキップ

datadog_forwarder pattern

概要

datadog_forwarder patternモジュールでは、AWS上に出力されるログやメトリクス等を、監視およびモニタリングに関するSaaSであるDatadogへ転送する機能を実現します。

このpatternを使用すると、Datadogにより提供されるDatadog Forwarderと呼ばれるAWS Lambda関数を、指定のAWS環境にデプロイします。

Datadog Forwarder

このAWS Lambda関数は、AWS環境内にログが保存されるリソースに紐付ける必要があります。 対象のリソースには、Amazon CloudWatch Logs、Amazon S3があります。
これは、datadog_log_trigger patternを使用して実現します。

想定する適用対象環境

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

依存するpattern

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

pattern名 利用する情報
parameter_store pattern AWS Systems Manager パラメータストアに格納された、DatadogのAPIキー

datadog_forwarder patternでは、事前にDatadoogのAPIキーが格納されていることを前提にしており、これを実行時に利用します。

また、datadog_integration patternと合わせて適用し、モニタリングも合わせて実施することを強く推奨します。

構築されるリソース

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

リソース名 説明
AWS CloudFormation Datadog Forwarderを使用するための、リソース一式をデプロイします
AWS Lambda Datadog Forwarderによりデプロイされる、Datadogへの転送処理本体です
AWS Secrets Manager AWS Lambda関数から参照される、DatadogのAPIキーが格納されます
AWS KMS AWS Secrets Managerの暗号化に使用される、AWS KMS CMKを作成します

ℹ️ AWS CloudFormationスタックに含まれる、すべてのリソースの説明は行いません。

ℹ️ 内容に興味のある方はAWS CloudFormationスタックの定義、もしくはデプロイされた内容を直接ご確認ください。

Datadog ForwarderのAWS CloudFormationスタック定義

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

patternのコンセプト

datadog_forwarder patternは、Datadogが提供するDatadog ForwarderをEponaへ適用しやすい形にまとめたpatternモジュールです。

Datadogが提供するリソースを活用しつつ、Eponaが想定する環境やpatternへの適用が容易になるように設計しています。

AWS上のログ収集

AWS上では、マネージドサービスやコンテナ上のアプリケーション等より様々なログが出力され、Amazon CloudWatch LogsやAmazon S3へと格納されます。

DatadogではAWSとのインテグレーションの一環として、ログ収集の方法が紹介されています。

AWS / ログの収集

Datadogのドキュメントで紹介されているのはAmazon Kinesis Data Firehoseを使用する方法、AWS CloudFormationを使用する方法の2つです。

Eponaでは、AWS CloudFormationを使用する方法を採用します。
※その理由は後述します。

Send AWS services logs with the Datadog Lambda function

Datadogの提供するAWS CloudFormationテンプレートを使用すると、AWS Lambda関数がデプロイされます。
Datadogの提供するAWS Lambda関数により、Amazon CloudWatch LogsやAmazon S3へ出力されたログをDatadogに転送することが可能になります。

datadog_forwarder patternにより構築されるリソースと、ログ収集に関するリソースの全体図を以下に記載します。

datadog_forwarder patternの全体像

AWS CloudFormationの利用とログの保存

Eponaでは、IaCの要素としてTerraformを採用しています。
この一方で、datadog_forwarder patternではAWS CloudFormationを内部的に使用します。
これは、Datadog自身が提供するリソースであり、またTerraformを介して実行する方法もDatadogにより紹介されています。

Datadog Forwarder / Terraform

内部的にとはいえ複数のIaC要素を利用することにはなりますが、以下の理由によりEpona自身が該当箇所を作り込んで提供するよりは理にかなった方法だと考えます。

  • Datadogの機能をDatadog自身が提供するリソースで構築する方法であること
  • Datadogのドキュメントに記載のある方法であること

また、Datadogのドキュメントではログを複数ヶ所に転送する場合はAmazon Kinesis Data Firehoseを推奨しています。

AWS / ログの収集

この利点を得るにはAmazon Kinesis Data Firehoseに加えて、Amazon Kinesis Data Streamsが必要となります。
現時点のEponaではログを複数の出力先に転送することを想定しないため、これはオーバースペックな仕組みとなります。

Datadog Kinesis Firehose Destination を使用して AWS サービスログを送信する

AWS上の各種ログは、Amazon CloudWatch LogsおよびAmazon S3からDatadogに送信します。

Datadogに送信されたログは、一定期間のみ保持されます(期間はDatadogとの契約で決定します)。

Log Management

このため、Datadogへのログ送信元となったAmazon CloudWatch LogsおよびAmazon S3ではより長期にログを保持し続ける必要があります。

ℹ️ CloudWatch LogsからAmazon S3へログを転送するような機能は、現時点のEponaでは提供しません。

ℹ️ Datadogでは、インデックス化されたログイベントをもとに課金額が計算されます。必要に応じてログフィルターの使用を検討してください。詳細はログフィルターについてを参照してください。

AWS Systems Manager パラメータストアとAWS Secrets Managerの併用

Eponaでは、秘匿情報の管理はparameter_store patternで構築する、AWS Systems Manager パラメータストアを利用する方針としています。

Datadog Forwarderで必要となるDatadogのAPIキーは、秘匿情報にあたります。
しかしDatadog Forwarderの仕様上、DatadogのAPIキーはAWS Secrets Managerに格納する必要があります。
開発対象のサービスがAWS Secrets Managerを使うのであればよいのですが、Datadog Forwarderを使うためだけに導入を強いるのはEpona利用者に不便です。

このためdatadog_forwarder pattern内では、AWS Systems Manager パラメータストアとAWS Secrets Managerの両方を使用します。

  • DatadogのAPIキーをAWS Systems Manager パラメータストアより取得する
  • AWS Secrets Managerにコピーする

ℹ️ この時AWS KMSを使用し、CMKも内部的に作成します。

datadog_forwarder patternでのAPIキー管理

AWS Systems Managerに格納されたDatadogのAPIキーは、datadog_forwarder patternの引数として設定します。

  dd_api_key_ssm_parameter_name = data.terraform_remote_state.production_parameter_store.outputs.parameter_store.parameters["[Datadog APIキーを格納した、AWS Systems Managerパラメータストアのパラメータ名]"].name

ℹ️ 見かけ上やや冗長に見えますが、parameter_store patternへの依存関係を明示した方が後々にわかりやすいでしょう。

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

AWS環境内で保存されるログをDatadog Forwarderで転送する場合、AWS Lambda関数がログの保存場所と同じリージョンにデプロイされている必要があります。

Eponaでは、Amazon CloudFrontやAWS WAF等をpatternとして提供しています。
cacheable_frontend patternwebacl patternなどが該当します。
Amazon CloudFrontにAWS Certificate ManagerやAWS WAF等を適用すると、これらのリソースはバージニア北部リージョンに構築しなくてはなりません。

例えば主として東京リージョンを使用している場合でも、これらのサービスのログは必然的にバージニア北部リージョンに保存されます。

⚠️ Amazon CloudFrontやAmazon S3をAWS Lambdaでサブスクライブする場合、これらを同じリージョンに構築する必要があります。

このため、EponaでDatadog Forwarderをデプロイしようとすると、バージニア北部リージョンへのリソース構築も必要になります。
DatadogのAPIキーを格納するためだけにencryption_key patternおよびparameter_store patternが必要となり、準備が大掛かりになります。

datadog_forwarder patternでは、この負担を軽減します。

AWS Systems Manager パラメータストアを利用するAWS Providerと、Datadog Forwarderに関するAWS Providerを分離、別々に指定する方針としています。

複数リージョンへの対応

具体的には、以下の2つのProviderを定義しています。

  • ssm_provider … AWS Systems Manager パラメータストア用
  • datadog_deployment … Datadogに関するAWS CloudFormationを始めとする一式用

parameter_store patternとDatadog Forwarderを同じリージョンにデプロイする場合は、両方に同じProviderを指定します。

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

module "datadog_forwarder" {
  source = "..."

  providers = {
    aws.ssm_provider       = aws
    aws.datadog_deployment = aws
  }

  dd_api_key_ssm_parameter_name = data.terraform_remote_state.production_parameter_store.outputs.parameter_store.parameters["[Datadog APIキーを格納した、AWS Systems Managerパラメータストアのパラメータ名]"].name

  ...
}

parameter_store patternの適用先と異なるリージョンにDatadog Forwarderをデプロイする場合、AWS Providerを使い分けます。

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

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

  alias  = "us_east_region"
  region = "us-east-1"
}

module "datadog_forwarder_us_east_region" {
  source = "..."

  providers = {
    aws.ssm_provider       = aws
    aws.datadog_deployment = aws.us_east_region
  }

  dd_api_key_ssm_parameter_name = data.terraform_remote_state.production_parameter_store.outputs.parameter_store.parameters["[Datadog APIキーを格納した、AWS Systems Managerパラメータストアのパラメータ名]"].name

  ...
}

このようにすることで、Datadog APIキーは主として使うリージョンから参照つつ、Datadog Forwarderは米国北部バージニアにデプロイできます。

ログ転送設定の自動セットアップと手動セットアップ

Datadog Forwarderをデプロイしただけでは、Datadogへのログ転送はできません。
ログが保存されるリソースと、デプロイしたAWS Lambda関数の紐付けが必要です。

Send AWS services logs with the Datadog Lambda function

この方法には、Datadogのコンソールを使用した自動セットアップと、AWSコンソールを使用した手動セットアップの2つがあります。

Automatically set up triggers

Manually set up triggers

Eponaでは、手動セットアップをTerraformで実現する方法を採用します。patternとしては、datadog_log_trigger patternを用います。

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

理由は、以下となります。

  • 自動セットアップで、すべてのログ保存リソースとAWS Lambda関数を紐付けられるわけではない
    • 手動セットアップとの併用が必要になる
  • 手動セットアップが必要になるのであれば、Terraformで紐付けるようにした方がログリソースとの関連が明確になる

また、Datadog Forwarderのデプロイと紐づけを異なるpatternに分離したのは、以下の2つの変更頻度の差を考慮して実行単位を分離しています。

  • AWS CloudFormationによりデプロイされるリソースと、AWS Secrets Manager
  • patternインスタンスの増減、変更により発生する、Datadog Forwarderとログリソースの紐付け

ℹ️ AWS Secrets Managerはすぐには削除されないことに注意してください。

シークレットの削除とリストア

Datadog ForwarderのAWS CloudFormationパラメーター

Datadog Forwarderが提供するAWS CloudFormationテンプレートには、いくつかのパラメーターがあり、利用者によるカスタマイズができます。

Datadog Forwarder CloudFormation パラメーター

この指定には、引数datadog_forwarder_parametersを指定します。

  datadog_forwarder_parameters = {
    "MemorySize" = 2048
  }

この中でも、特に利用するパラメーターについては、datadog_forwarder patternで引数として切り出しているので、こちらを使用します。

特に、Datadogでのメトリクス、ログ収集に確認するにはタグ付けは非常に重要なので、必ず設定するようにしてください。

タグの付け方

Datadog Forwarderにより提供されるAWS Lambda関数で転送するログにタグを付与するには、datadog_forwarder_tagsを使用します。

  datadog_forwarder_tags        = "environment:runtime,runtime_environment:production,collected_by:epona"

なお、利用するAWS CloudFormationテンプレートは、デフォルトでは以下を利用します。

新しいバージョンへのアップグレードや、他のバージョンを選択する際にはdatadog_forwarder_cloudformation_template_urlでテンプレートを変更できます。

たとえば、以下の例ではバージョン3.0.2のテンプレートを使用します。

  datadog_forwarder_cloudformation_template_url = "https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/3.0.2.yaml"

この詳細については、Datadogのドキュメントを参照してください。

Datadog Forwarder / 新しいバージョンにアップグレードする

サンプルコード

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

parameter_store patterndatadog_forwarder patternを同じリージョンにデプロイする場合。

provider "aws" {
  assume_role {
    role_arn = "[TerraformExecutionRoleのARN]"
  }
}

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

  providers = {
    aws.ssm_provider       = aws
    aws.datadog_deployment = aws
  }

  dd_api_key_ssm_parameter_name = data.terraform_remote_state.production_parameter_store.outputs.parameter_store.parameters["[Datadog APIキーを格納した、AWS Systems Managerパラメータストアのパラメータ名]"].name

  datadog_forwarder_tags        = "environment:runtime,runtime_environment:production,collected_by:epona"

  tags = {
    # 任意のタグ
    Environment        = "runtime"
    RuntimeEnvironment = "production"
    ManagedBy          = "epona"
  }
}

parameter_store patterndatadog_forwarder patternを異なるリージョンにデプロイする場合。

provider "aws" {
  # デフォルトのリージョン
  assume_role {
    role_arn = "[TerraformExecutionRoleのARN]"
  }
}

provider "aws" {
  assume_role {
    role_arn = "[TerraformExecutionRoleのARN]"
  }

  alias  = "us_east_region"
  region = "us-east-1"
}

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

  providers = {
    aws.ssm_provider       = aws
    aws.datadog_deployment = aws.us_east_region
  }

  dd_api_key_ssm_parameter_name = data.terraform_remote_state.production_parameter_store.outputs.parameter_store.parameters["[Datadog APIキーを格納した、AWS Systems Managerパラメータストアのパラメータ名]"].name

  datadog_forwarder_tags        = "environment:runtime,runtime_environment:production,collected_by:epona"

  tags = {
    # 任意のタグ
    Environment        = "runtime"
    RuntimeEnvironment = "production"
    ManagedBy          = "epona"
  }
}

関連するpattern

datadog_forwarder patternに関連するpatternを、以下に記載します。

pattern名 説明
datadog_log_trigger pattern このパターンでデプロイされたAWS Lambda関数と、ログが蓄積されるリソースの紐づけを行います

入出力リファレンス

Requirements

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

Inputs

Name Description Type Default Required
dd_api_key_ssm_parameter_name AWS Systems Manager パラメーターストアに格納した、DatadogのAPIキーのパラメーター名。Datadog Forwarderが提供するLambda関数に必要なため、このモジュールでリソース設定を行う。

最終的には、AWS Secrets Managerに格納され、DdApiKeySecretArnとして使用される。

Datadogにより提供されるLambda関数が参照するAPIキーは、本来はAWS Secrets Managerで登録する必要があるが、
Eponaでは秘匿情報はAWS Systems Manager パラメーターストアを使用するため、本モジュールでAWS Systems Manager パラメーターストアに
AWS Secrets Managerに登録し直している

詳細は、こちらを参照。
string n/a yes
datadog_forwarder_cloudformation_stack_name このモジュールでデプロイするCloudFormationのスタック名を指定する string "datadog-forwarder" no
datadog_forwarder_cloudformation_template_url このモジュールがデプロイする、CloudFormationのテンプレートURLを指定する string "https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml" no
datadog_forwarder_lambda_function_name このモジュールでデプロイされる、Lambdaの関数名を指定する(DatadogのCloudFormationパラメーターFunctionNameに相当する)

詳細は、こちらを参照。
string "datadog-forwarder" no
datadog_forwarder_parameters このモジュールでデプロイする、CloudFormationスタックに引き渡すパラメーターをmap形式で指定する。

ただし、DdApiKeySecretArn、FunctionName、DdTagsについては他の変数を使用すればよく、DdApiKeyについては指定する必要がない。

詳細は、こちらを参照。
map(any) {} no
datadog_forwarder_tags このモジュールでデプロイされるLambda関数が付与する、タグを指定する(DatadogのCloudFormationパラメーターDdTagsに相当する)

詳細は、こちらを参照。
string "" no
dd_api_key_secretsmanager_secret_name DatadogのAPIキーをAWS Secrets Managerに格納する際の名前 string "datadog_api_key" no
secretsmanager_kms_key_deletion_window_in_days このモジュールが、SecretsManager用に内部で作成するKMS CMKの削除猶予期間を指定する number 30 no
secretsmanager_recovery_window_in_days SecretsManager上に作成する、Datadog転送用パラメータの削除猶予期間。削除猶予期間を7〜30(単位:日)の間で設定する number null no
tags このモジュールで構築されるリソースに、共通的に付与するタグ map(string) {} no

Outputs

Name Description
datadog_forwarder_lambda_function_arn CloudFormationによりデプロイされた、Datadogのログ転送用のLambda関数のARN
dd_api_key_secret_arn Datadog APIキーを格納した、Secrets ManagerのARN
kms_keys このモジュールが作成したKMS CMK

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

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

© 2021 TIS Inc.