Избегайте воссоздания кластера EMR с Terraform - PullRequest
1 голос
/ 13 июля 2020

Эта проблема связана с 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 устарели .

...