Невозможно добавить 2 подсети для ElasticSearch с Terraform

Я пытаюсь построить кластер ElasticSearch, используя Terraform, но я не могу назначить более 1 подсети! Это действительно странно, потому что в документации есть это:

https://www.terraform.io/docs/providers/aws/r/elasticsearch_domain.html

subnet_ids - (обязательный) список идентификаторов подсети VPC для конечных точек домена Elasticsearch, которые будут созданы.

Но когда я пытаюсь сделать это, я получаю эту ошибку:

Ошибка: ValidationException: необходимо указать ровно одну подсеть

Это мой код:

resource "aws_elasticsearch_domain" "es" {
  domain_name           = "${var.es_domain}-${var.environment}"
  elasticsearch_version = "${var.es_version}"

  cluster_config {
    instance_type  = "${var.es_instance_type}"
    instance_count = "${var.es_instance_count}"
  }
  vpc_options {

    subnet_ids = ["${data.aws_subnet.private_1.id}", "${data.aws_subnet.private_2.id}"]

    security_group_ids = ["${aws_security_group.es.id}"]
  }

  snapshot_options { automated_snapshot_start_hour = "${var.es_automated_spanshot_start_hour}" }

  ebs_options {
    ebs_enabled = true
    volume_type = "standard"
    volume_size = "20"
  }


  access_policies = <<CONFIG
    {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "es:*",
        "Principal": "*",
        "Effect": "Allow",
        "Resource": "arn:aws:es:${var.aws_region}:${data.aws_caller_identity.current.account_id}:domain/${var.es_domain}/*"
      }
    ]
}
CONFIG


}

Я использую Terraform v0.12.2

Спасибо за вашу помощь.

1 ответ

Решение

Ты пропускаешь zone_awareness_enabled параметр в cluster_config что требуется при использовании нескольких кластеров Elasticsearch AZ.

Спасибо @ydaetskcoR за указание пути.

Я расскажу о своих трудностях с настройкой availability_zone_count а также subnet_ids - надеюсь, это поможет сэкономить время другим.

Некоторый контекст проблемы:

А) Я попытался создать многозонный ES-кластер.

Б) У меня было 4 подсети для уровня данных (содержит также другие типы БД), и я хотел, чтобы кластер был разделен между доступными зонами доступности в текущем регионе (3 зоны доступности), поэтому одна из зон доступности будет иметь 2 подсети и 2 Экземпляры ES.

Быть в курсе, что:

1: The availability_zone_count поле под zone_awareness_config блок должен иметь точную сумму, как и доступные AZ.

2: The subnet_ids поле под vpc_options блок должен содержать то же количество зон доступности, которое вы указали в availability_zone_count.

Итак, одним предложением: availability_zone_count == (available AZs) == length( subnet_ids)

Ниже приведен фрагмент кода с соответствующими частями (следите также за комментариями - это также может сэкономить вам время):

resource "aws_elasticsearch_domain" "staging" {
    domain_name  = ...
    vpc_options{
       subnet_ids = "${local.subnet_ids}"  # Instead of: [for s in aws_subnet.data_tier : s.id] which will lead to: Error creating ElasticSearch domain: ValidationException: You must specify exactly three subnets because you’ve set zone count to three.

    }
    cluster_config {
       zone_awareness_enabled = true #If you ignore it you'll get: Error creating ElasticSearch domain: ValidationException: You must specify exactly one subnet
       #Notice that there is no "=" Below - or you'll visit this thread: https://github.com/terraform-providers/terraform-provider-aws/issues/12365
       zone_awareness_config {
         availability_zone_count = "${length(var.region_azs)}"
       }
    }
    .
    . 
}

#Take only X number of subnets where X is the number of available AZs)
locals {
  subnet_ids = "${slice(aws_subnet.data_tier.*.id, 0, length(var.region_azs))}"
}  


# Added this also due to: Error creating ElasticSearch domain: ValidationException: Before you can proceed, you must enable a service-linked role to give Amazon ES permissions to access your VPC.
# Solved with: https://stackru.com/questions/47229247/validationexception-before-you-can-proceed-you-must-enable-a-service-linked-ro (Terraform related Answer)
resource "aws_iam_service_linked_role" "es" {
  aws_service_name = "es.amazonaws.com"
  description      = "Allows Amazon ES to manage AWS resources for a domain on your behalf."
}
Другие вопросы по тегам