Эта проблема связана с Terraform 0,12 версия
Привет! В настоящее время я использую Terraform для развертывания кластера AWS EMR в моей команде, и каждый раз, когда мы добавляем новые ресурсы, Terraform воссоздает кластер. Объявление нашего кластера выглядит следующим образом:
resource "aws_emr_cluster" "emr_spark_cluster" {
name = "whatever_name_to_emr_spark_cluster"
release_label = "emr-5.29.0"
applications = ["Spark"]
log_uri = "whatever_log_uri"
ec2_attributes {
subnet_id = var.vpc_public_subnets[0]
emr_managed_master_security_group = aws_security_group.emr_sg.id
emr_managed_slave_security_group = aws_security_group.emr_sg.id
instance_profile = aws_iam_instance_profile.instance_profile.arn
key_name = "whatever_name_to_ec2_attributes"
}
master_instance_group {
instance_type = var.emr_master_instance_type
}
core_instance_group {
instance_type = var.emr_core_instance_type
instance_count = var.emr_core_instance_count
ebs_config {
size = var.emr_core_ebs_size
type = whatever_type
volumes_per_instance = whatever_volumes_per_instance
}
}
tags = var.tags
service_role = aws_iam_role.emr_service.arn
}
В основном мы используем master_instance_group
и core_instance_group
как Terraform 0.12 документы предлагают ( 1 )
Когда кластер уже развернут и пытается добавить новые ресурсы, команда terraform apply
говорит, что кластер необходимо воссоздать (удалены все неинтересные вещи):
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
~ update in-place
-/+ destroy and then create replacement
Terraform will perform the following actions:
# module.emr.aws_emr_cluster.emr_spark_cluster must be replaced
-/+ resource "aws_emr_cluster" "emr_spark_cluster" {
applications = [whatever_applications]]
- ebs_root_volume_size = 0 -> null
- instance_group {
- id = whatever_id -> null
- instance_count = 2 -> null
- instance_role = "CORE" -> null
- instance_type = whatever_the_instance_type -> null
- ebs_config {
- iops = 0 -> null
- size = whatever_size -> null
- type = whatever_type -> null
- volumes_per_instance = whatever_volumes_per_instance -> null
}
}
- instance_group {
- id = whatever_id -> null
- instance_count = whatever_instance_count -> null
- instance_role = "MASTER" -> null
- instance_type = whatever_the_instance_type -> null
- ebs_config {
- iops = 0 -> null
- size = whatever_size -> null
- type = whatever_type -> null
- volumes_per_instance = whatever_volumes_per_instance -> null
}
}
+ instance_group {
+ autoscaling_policy = (known after apply)
+ bid_price = (known after apply)
+ id = (known after apply)
+ instance_count = (known after apply)
+ instance_role = (known after apply)
+ instance_type = (known after apply)
+ name = (known after apply)
+ ebs_config {
+ iops = (known after apply)
+ size = (known after apply)
+ type = (known after apply)
+ volumes_per_instance = (known after apply)
}
}
~ master_instance_group {
~ id = whatever_id -> (known after apply)
instance_count = 1
instance_type = whatever_the_instance_type
- ebs_config {
- iops = 0 -> null
- size = whatever_size -> null
- type = whatever_type -> null
- volumes_per_instance = whatever_volumes_per_instance -> null
}
+ ebs_config {
+ iops = (known after apply)
+ size = (known after apply)
+ type = (known after apply)
+ volumes_per_instance = (known after apply)
}
}
}
В основном, меня действительно интересует instance_group
. Я полагаю, что это причина, по которой кластер необходимо воссоздать, потому что текущие свойства master_instance_group
и core_instance_group
не «резервируют» определенные c группы экземпляров, а только их тип и размер, верно?
По этой причине в качестве обходного пути я попытался использовать ресурс aws_emr_instance_group
, пытаясь заменить свойства master_instance_group
и core_instance_group
и связать их напрямую с кластером свойством cluster_id
. Например, aws_emr_instance_group
из master_instances
:
resource "aws_emr_instance_group" "master_instances" {
name = "emr_cluster_master_instances"
cluster_id = aws_emr_cluster.emr_spark_cluster.id
instance_type = var.emr_master_instance_type
instance_count = var.emr_master_instance_count
ebs_config {
iops = 0
size = var.emr_core_ebs_size
type = whatever_type
volumes_per_instance = whatever_volumes_per_instance
}
}
Но в момент выполнения terraform plan
происходит сбой со следующей ошибкой:
module.emr.aws_emr_cluster.emr_spark_cluster: Creating...
Error: error running EMR Job Flow: ValidationException: Instance count must be greater than 0
I не понимаю ошибку, потому что я связываю группу экземпляров с кластером.
Итак, мои вопросы:
- Как я могу установить определенные c экземпляры в свой кластер чтобы избежать его воссоздания каждый раз, когда мне нужно добавлять новые ресурсы (развертывание новых ресурсов в другом конвейере отбрасывается). Должен ли я использовать
master_instance_type
, core_instance_type
и core_instance_count
, даже если это устаревшие параметры? Может быть, я неправильно использую ресурс aws_emr_instance_group
? - Возможно ли, что это ожидаемое поведение со свойствами
master_instance_group
и core_instance_group
? Я имею в виду, чтобы избежать создания конкретных c экземпляров, которые будут активными даже при уничтожении кластера?
Заранее спасибо
( 1 ) Я говорю "предложить", потому что другие свойства, такие как core_instance_type
, core_instance_count
и master_instance_type
, в Terraform 0.12 устарели .