🔎

Amazon Elasticsearch Serviceのsearch slow logをTerraform経由で有効にする

2021/05/11に公開

Amazon Elasticsearch Service(以後Amazon ES)のドメインをTerraformで管理していて、search slow logやindex slow logのCloudwatchへの送信もTerraformで有効化する時にいい感じのサンプルコードが見当たらなかったので自分のコードを残そうと思います。

Terraform の aws_elasticsearch_domain リソースのドキュメントにサンプルコードを参考にしましたが、このコードだと全てのCloudwatch Logsのグループへの書き込みが実行できるようになっているので下記のようにしてみました。

elasticseach.tf

resource "aws_elasticsearch_domain" "example" {
  # .. other configuration ...

  log_publishing_options {
    cloudwatch_log_group_arn = aws_cloudwatch_log_group.example_search_slow_log.arn
    log_type                 = "SEARCH_SLOW_LOGS"
  }
  
  log_publishing_options {
    cloudwatch_log_group_arn = aws_cloudwatch_log_group.example_index_slow_log.arn
    log_type                 = "INDEX_SLOW_LOGS"
  }
}

cloudwatch_log_group.tf

resource "aws_cloudwatch_log_group" "example_search_slow_log" {
  name = "/aws/es/example_search_slow_log"
}

resource "aws_cloudwatch_log_group" "example_index_slow_log" {
  name = "/aws/es/example_index_slow_log"
}

resource "aws_cloudwatch_log_resource_policy" "example_es_cloudwatch_log_group_policy" {
  policy_name = "example-es-cloudwatch-log-group-policy"
  policy_document = data.aws_iam_policy_document.example_es_log_publishing_policy.json
}

data "aws_iam_policy_document" "example_es_log_publishing_policy" {
  statement {
    actions = [
      "logs:CreateLogStream",
      "logs:PutLogEvents",
      "logs:PutLogEventsBatch",
    ]

    resources = [
      "${aws_cloudwatch_log_group.example_search_slow_log.arn}:*",
      "${aws_cloudwatch_log_group.example_index_slow_log.arn}:*",
    ]

    principals {
      identifiers = ["es.amazonaws.com"]
      type        = "Service"
    }
  }
}

Discussion