Невозможно добавить 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."
}