コンテンツにスキップ

datadog_integration pattern

概要

datadog_integration patternモジュールでは、監視およびモニタリングに関するSaaSであるDatadogとAWSのインテグレーションを実現します。

このpatternを使用すると、DatadogとAWSのインテグレーションが行われ、Amazon CloudWatchのメトリクスの取得やプリセットされたダッシュボードを利用できます。

この後、Datadogを利用してのサービス固有のダッシュボードの作成、監視設定の基礎となるpatternです。

想定する適用対象環境

datadog_integration patternは、Runtime環境で使用することを想定しています。

依存するpattern

datadog_integration patternは、他のpatternの実行結果に依存しません。独立して実行できます。

⚠️ Datadog自体の利用手続きは、利用者自身で行っていることが前提となります。
⚠️ datadog_integration patternは、Datadog利用手続きに関する機能は提供しません。

構築されるリソース

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

リソース名 説明
AWS IAM Datadogへ必要なアクセス許可を与えるための、IAMロールを構築します
AWS Integration DatadogとAWSのインテグレーションを行います

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

TerraformでのDatadogの利用

Datadogは、Terraformから操作可能です。Datadog自身が、TerraformのProviderを提供しています。

Datadog Provider

以下のようなTerraformの定義を記述することで、Datadog Providerを利用可能です。

terraform {
  ...

  required_providers {
    ...
    aws = {
      source  = "hashicorp/aws"
      version = "[AWS Providerのバージョン]"
    }

    datadog = {
      source  = "DataDog/datadog"
      version = "[Datadog Providerのバージョン]"
    }
    ...
  }

  ...
}

provider "datadog" {
}

Datadog ProviderはDatadogのAPIを使用するため、APIキーおよびアプリケーションキーが必要です。

以下のドキュメントを参照して、APIキーおよびアプリケーションキーを取得してください。

API キーとアプリケーションキー

取得したAPIキーおよびアプリケーションキーは、Terraformを実行する際に、環境変数として設定してください。Datadogのクレデンシャル情報となりますので、Terraformの定義ファイル等へのハードコードは避けてください。

Linuxの場合

$ export DD_API_KEY=[DatadogのAPIキー]
$ export DD_APP_KEY=[Datadogのアプリケーションキー]

Windowsの場合

> set DD_API_KEY=[DatadogのAPIキー]
> set DD_APP_KEY=[Datadogのアプリケーションキー]

AWSインテグレーション時のモニタリング対象の制御

Datadogでは本patternの適用で実行されるAWSインテグレーションにより、デフォルトではすべてのEC2インスタンスがモニタリング対象となり、 課金が発生します。

AWS インテグレーションの課金

一方で、コストを抑制するためにモニタリングする対象を限定したい1という要望が発生し得ます。 この目的のため、Datadogではモニタリングの対象を除外する仕組みがあります。

AWS リソースの除外

EC2に特定のタグを付与することで、モニタリング対象にする・しないを制御できます。

どのようなタグで制御するかについては、本patternの引数filter_tagsで定義できます。 記述方法については、以下のDatadogのマニュアルをご参照ください。

タグの使用方法

例えば、本ページ下部のサンプルコードにあるように以下の設定をすると、datadog:monitoredというタグを付与されたEC2のみがモニタリング対象となります。

filter_tags = ["datadog:monitored"]

filter_tagsで指定した内容は、DatadogのAWS Integrationページ内で反映されたことを確認できます。

AWS Integration2

上記ページの、Optionally limit resource collectionto hosts with tagを参照してください。

IAMロールとDatadogのAWS Integration

datadog_integration patternでは、Terraformを使用したAWS Integrationのドキュメントに従い、IAMロールを作成します。

The AWS Integration with Terraform

これは、以下のページ内の「手動」セットアップの手順に相当します。

AWS Integration

このIAMリソースを作成する際に、Datadogと連携するためのExternal IDが必要となります。これは、Datadogのページから取得できます。

datadog_integration patternではExternal IDはdatadog_integration_awsリソースにて作成するため、通常、意識することはありません。

datadog_integration_aws

ただし、AWS IntegrationにおけるDatadogとの連携条件のひとつとなるため、存在については押さえておいてください。

また、本patternを使用したAWS Integrationがうまくいかない場合にも、使用することになります。

AWS用にプリセットされたダッシュボード

DatadogによるAWS Integrationが成功すると、ダッシュボードリスト2にプリセットされているダッシュボードが表示されます。

プリセットされたダッシュボードには、Amazon ECSやAmazon RDSなどAWSのリソースに対するメトリクスが表示されるように設定されています。
これらのダッシュボードは、モニタリングの第一歩としては非常に有用です。

ただ、実際のダッシュボードを見ていると、タイムラグがあるように感じられるでしょう。

DatadogはAmazon CloudWatchよりメトリクスを取得しますが、これには実行間隔があります。詳細は、以下のドキュメントを参照してください。

AWS Integrationの解除

DatadogとAWSとのIntegrationを解除する場合、本patternのインスタンスに対して、terraform destroyを行います。

Datadog上では、本patternで関連付けられたAWSアカウントとの紐付けが削除されます。

ℹ️ create_iam_role_onlytrueにしている場合は、Datadog上でAWSアカウントの削除が必要です。

AWS Integrationに失敗する場合

datadog_integration patternを実行しても、AWS Integrationに失敗することがあります。

AWS Integratoinに失敗している場合、Datadog上のAWS Integrationのページ2を開くと次のように権限不足でBROKENと表示されます。

AWS Integration失敗

うまくいかない場合、datadog_integration patternの実行後にUpdate Configurationボタンを押して設定を更新してください。

AWS Integration Update Configuration

Update Configurationボタンは、Datadog上のAWS Integrationのページの下部にあります

やや時間がかかりますが、プリセットされたダッシュボードにメトリクスが表示されるようになります。

それでもうまく行かない場合は、create_iam_role_onlytrueとすることで、作成するリソースをIAMロールのみにとどめ、インテグレーション自体はDatadog側で行います。

datadog_integration patternモジュールには、以下のように設定します。

  create_iam_role_only = true
  aws_integration_external_id = "[External ID]"

External IDは、Datadog上のAWS Integrationのページにて取得できます。

AWS Integration External ID

サンプルコード

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

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

  integrate_aws_account_id = "232105380006"

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

  filter_tags = ["datadog:monitored"]
}

関連するpattern

datadog_integration patternの結果を利用するpatternはありません。

AWSとのインテグレーション後、Datadogに送信されてくるメトリクスを元にダッシュボードやアラートを設定してください。

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
datadog >= 2.25.0, < 3.0.0

Inputs

Name Description Type Default Required
integrate_aws_account_id Datadogと紐付けるAWSアカウントID string n/a yes
account_specific_namespace_rules このアカウント内の特定の名前空間に対して、メトリクス収集の有効、無効を設定する map(bool) null no
allow_actions Datadogに実行許可するアクションを、リストで指定する。
どのようなアクションが指定可能かは、DatadogのAWSインテグレーションを参照すること。

デフォルトでは、[DatadogのAWSインテグレーション]に記載されているすべてのアクセスを権限を許可している。
list(string)
[
"apigateway:GET",
"autoscaling:Describe",
"budgets:ViewBudget",
"cloudfront:GetDistributionConfig",
"cloudfront:ListDistributions",
"cloudtrail:DescribeTrails",
"cloudtrail:GetTrailStatus",
"cloudtrail:LookupEvents",
"cloudwatch:Describe
",
"cloudwatch:Get",
"cloudwatch:List
",
"codedeploy:List",
"codedeploy:BatchGet
",
"directconnect:Describe",
"dynamodb:List
",
"dynamodb:Describe",
"ec2:Describe
",
"ecs:Describe",
"ecs:List
",
"elasticache:Describe",
"elasticache:List
",
"elasticfilesystem:DescribeFileSystems",
"elasticfilesystem:DescribeTags",
"elasticfilesystem:DescribeAccessPoints",
"elasticloadbalancing:Describe",
"elasticmapreduce:List
",
"elasticmapreduce:Describe",
"es:ListTags",
"es:ListDomainNames",
"es:DescribeElasticsearchDomains",
"health:DescribeEvents",
"health:DescribeEventDetails",
"health:DescribeAffectedEntities",
"kinesis:List
",
"kinesis:Describe",
"lambda:AddPermission",
"lambda:GetPolicy",
"lambda:List
",
"lambda:RemovePermission",
"logs:DeleteSubscriptionFilter",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:DescribeSubscriptionFilters",
"logs:FilterLogEvents",
"logs:PutSubscriptionFilter",
"logs:TestMetricFilter",
"rds:Describe",
"rds:List
",
"redshift:DescribeClusters",
"redshift:DescribeLoggingStatus",
"route53:List",
"s3:GetBucketLogging",
"s3:GetBucketLocation",
"s3:GetBucketNotification",
"s3:GetBucketTagging",
"s3:ListAllMyBuckets",
"s3:PutBucketNotification",
"ses:Get
",
"sns:List",
"sns:Publish",
"sqs:ListQueues",
"states:ListStateMachines",
"states:DescribeStateMachine",
"support:
",
"tag:GetResources",
"tag:GetTagKeys",
"tag:GetTagValues",
"xray:BatchGetTraces",
"xray:GetTraceSummaries"
]
no
aws_integration_external_id create_iam_role_onlyfalseとした場合、必須。DatadogのAWS Integrationページより、External IDを取得して設定する string null no
create_iam_role_only IAMロールの作成までにとどめ、DatadogとAWSのインテグレーションまでは行わない場合、trueを指定する bool false no
excluded_regions メトリクス収集から除外するリージョンを指定する list(string) null no
filter_tags メトリクスの収集対象とのあるEC2を制御するためのタグを指定する。指定しない場合は、integrate_aws_account_idで指定するAWSアカウント配下の全EC2が収集対象となる。指定方法についてはタグの使用方法を参照 list(string) null no
host_tags このインテグレーションによりレポートされる、すべてのホストとメトリクスに追加するタグを指定する list(string) null no
integration_policy_name Datadog連携のために作成するポリシーの名前 string "DatadogAWSIntegrationPolicy" no
integration_role_name Datadog連携のために作成するIAMロール名 string "DatadogAWSIntegrationRole" no
tags Datadogと連携するIAMロール関連のリソースに、共通的に付与するタグ map(string) {} no

Outputs

Name Description
datadog_aws_integration_external_id AWS Integrationを行ったExternal ID

  1. 例えば、特定のVPC内のEC2のみモニタリングを行いたいといったケースがあります。 

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


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

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

© 2021 TIS Inc.