Terraform-provider-aws: contaminar un servicio ecs y ejecutar terraform apply recibe La creación del servicio no fue idempotente

Creado en 13 jun. 2017  ·  3Comentarios  ·  Fuente: hashicorp/terraform-provider-aws

_Esta edición fue originalmente abierta por @gustavosoares como hashicorp / terraform # 12665. Se migró aquí como parte de la división del proveedor . El cuerpo original del problema se encuentra a continuación.


Hola,

Manchar un servicio ecs y ejecutar terraform apply nuevamente no funciona. Recibo un Creation of service was not idempotent

Tuve que actualizar mi arn de grupo objetivo de servicio ecs y pensé en manchar el ecs para que pudiera ser destruido y recreado nuevamente con la referencia correcta.

Así es como lo corrompí:

terraform taint -module=ecs_bla_service aws_ecs_service.main

Versión Terraform

Ejecute terraform -v para mostrar la versión. Si no está ejecutando la última versión de Terraform, actualice porque es posible que su problema ya se haya solucionado.

Terraform v0.8.8

Recursos afectados

Enumere los recursos como una lista, por ejemplo:

  • aws_ecs_service

Archivos de configuración de Terraform

resource "aws_ecs_service" "main" {
  name                               = "${var.name}"
  cluster                            = "${var.cluster}"
  task_definition                    = "${var.task_definition}"
  desired_count                      = "${var.desired_count}"
  deployment_minimum_healthy_percent = "${var.deployment_minimum_healthy_percent}"
  deployment_maximum_percent         = "${var.deployment_maximum_percent}"

  iam_role   = "${aws_iam_role.ecs-service-role.arn}"
  depends_on = ["aws_iam_policy_attachment.ecs-service-iam-policy"]

  load_balancer {
    target_group_arn = "${var.target_group_arn}"
    container_name   = "${var.container_name}"
    container_port   = "${var.container_port}"
  }

  lifecycle {
    ignore_changes        = ["task_definition", "desired_count"]
    create_before_destroy = true
  }

  # http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html
  placement_strategy {
    type  = "${var.placement_strategy_type}"
    field = "${var.placement_strategy_field}"
  }

  placement_constraints {
    type       = "${var.placement_constraints_type}"
    expression = "${var.placement_constraints_expression}"
  }
}

Salida de depuración

module.ecs_corporate_service.aws_ecs_service.main: Still creating... (1m50s elapsed)
Error applying plan:

1 error(s) occurred:

* aws_ecs_service.main: InvalidParameterException: Creation of service was not idempotent.
    status code: 400, request id: 6b9e0243-0851-11e7-99d9-4b4a6bde7f7d "corporate-production"

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.
exit status 1

Comportamiento esperado

El servicio ECS debería haber sido destruido y recreado.

Comportamiento real

Tengo Creation of service was not idempotent.

Pasos para reproducir

Enumere los pasos necesarios para reproducir el problema, por ejemplo:

  1. Crear un servicio ecs
  2. terraform apply
  3. mancharlo
  4. run terraform apply again

Factoides importantes

¿Hay algo atípico en sus cuentas que debamos saber? Por ejemplo: ¿Se ejecuta en EC2 Classic? ¿Versión personalizada de OpenStack? ¿ACL estrechas?

No sé

bug servicecs

Comentario más útil

Estoy experimentando el mismo problema cuando intento actualizar location_constraints en un servicio ya creado.

Todos 3 comentarios

Estoy experimentando el mismo problema cuando intento actualizar location_constraints en un servicio ya creado.

tl; dr aws_ecs_service necesita admitir name_prefix para que se pueda usar create_before_destroy .

Esto parece ser el resultado del parámetro create_before_destroy del bloque de ciclo de vida y el requisito de ECS de que serviceName sea único .

Nombre del Servicio

El nombre de su servicio. Se permiten hasta 255 letras (mayúsculas y minúsculas), números, guiones y guiones bajos. Los nombres de los servicios deben ser únicos dentro de un clúster, pero puede tener servicios con nombres similares en varios clústeres dentro de una región o en varias regiones.

Requerido: si

Dado que aws_ecs_service Terraform no admite name_prefix. Estos errores.

Eliminar el siguiente bloque de su servicio ecs debería solucionar el problema:

lifecycle {
   create_before_destroy = true
}

Prefiero ver soporte para crear un nuevo servicio (y hacer que se inicie con éxito) antes de destruir uno antiguo. En este momento, agregar o cambiar las entradas del equilibrador de carga, por ejemplo, es una interrupción.

De acuerdo con @dekimsey, le gustaría ver name_prefix soportado por aws_ecs_service para evitar interrupciones. ¿Es posible utilizar random_id para duplicar el comportamiento de name_prefix ? Si es así, ¿hay ejemplos específicos para usar esto con aws_ecs_service ?

¿Fue útil esta página
0 / 5 - 0 calificaciones