😸

Kinesis Data FirehoseでDatadogへお手軽データ転送

2021/04/02に公開

ログの集約先をDatadogにしたいため、AWSから出てくるログをDatadogへ送る事になった際に調べたことをまとめました。

結論

Kinesis Data Firehosから特定の外部サービスにデータを転送できるようになり、この方法でDatadogへデータを転送できます。
Analyze logs with Datadog using Amazon Kinesis Data Firehose HTTP endpoint delivery

具体的な方法

基本的にはHTTP Endpoint (e.g. New Relic) Destinationを参考にすれば対応できます。
*Datadog側でAPI Keyを作成しておく必要があります。

resource "aws_cloudwatch_log_group" "log_group" {
  name = "sample-app"
}

resource "aws_cloudwatch_log_subscription_filter" "test_lambdafunction_logfilter" {
  name            = "test_lambdafunction_logfilter"
  role_arn        = aws_iam_role.iam_for_lambda.arn
  log_group_name  = aws_cloudwatch_log_group.log_group.name
  filter_pattern  = "" // 全データを対象とする
  destination_arn = aws_kinesis_firehose_delivery_stream.send_to_datadog.arn
  distribution    = "Random"
}

// パラメータストアにDatadog APIを格納している前提
data "aws_kms_key" "datadog_api" {
  key_id = "alias/datadog/api_key"
}

resource "aws_kinesis_firehose_delivery_stream" "send_to_datadog" {
  name        = "terraform-kinesis-firehose-test-stream"
  destination = "http_endpoint"

  // firehoseからDatadogへ投げたデータのバックアップのために必須
  s3_configuration {
    role_arn           = aws_iam_role.firehose.arn
    bucket_arn         = aws_s3_bucket.bucket.arn
    buffer_size        = 10
    buffer_interval    = 400
    compression_format = "GZIP"
  }

  http_endpoint_configuration {
    // ref: https://docs.aws.amazon.com/firehose/latest/dev/http_troubleshooting.html
    url                = "https://aws-kinesis-http-intake.logs.datadoghq.com/v1/input"
    name               = "Datadog Log"
    access_key         = data.aws_kms_key.datadog_api.value
    buffering_size     = 15
    buffering_interval = 600
    role_arn           = aws_iam_role.firehose.arn
    s3_backup_mode     = "FailedDataOnly"

    request_configuration {
      content_encoding = "GZIP"

      // Datadogでのタグとして設定できる
      common_attributes {
        name  = "env"
        value = "test"
      }
      common_attributes {
        name  = "app-name"
        value = "my-app"
      }
    }
  }
}

余談

Fargateタイプのリソースを扱っている場合には、side carでdd-agentを動かすのが一番楽ではないかと思います。
*秘密情報はSystems Manager パラメータストアを使用した機密データの指定を参考に、パラメータストア経由でデータを取得するようにするのが良いと思います。

雑感

今まではLambdaを書くことがほぼ必須だったので非常に楽で助かった

Discussion