Terraform Cycle error with aws_connect_queue resource

Hello,

I’m getting a terraform cycle error for aws_connect_queue resources, but the error only happens when uncommenting a quick connect id.

I have the following aws_connect_queue resources:

queues.tf

resource "aws_connect_queue" "cancel-policy-transfers" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "Cancel Policy Transfers"
  description           = "Cancel Policy Transfers"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id

  quick_connect_ids = [
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper_2.contact_flow_id
  }
}

resource "aws_connect_queue" "check-policy-transfers" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "Check Policy Transfers"
  description           = "Check Policy Transfers"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id

  quick_connect_ids = [
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper_2.contact_flow_id
  }
}

resource "aws_connect_queue" "general-transfers" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "General Transfers"
  description           = "General Transfers"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id

  quick_connect_ids = [
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper_2.contact_flow_id
  }
}

resource "aws_connect_queue" "update-policy-transfers" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "Update Policy Transfers"
  description           = "Update Policy Transfers"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id


  quick_connect_ids = [
    aws_connect_quick_connect.check-policy-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.cancel-policy-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.general-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper.contact_flow_id
  }
}

resource "aws_connect_queue" "motor-uw" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "Motor UW"
  description           = "Esure Motor UW Queue"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id

  quick_connect_ids = [
    aws_connect_quick_connect.check-policy-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.update-policy-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.cancel-policy-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.general-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper.contact_flow_id
  }
}


resource "aws_connect_queue" "motor-uw-transfers" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "Motor UW Transfers"
  description           = "Internal transfers for Motor UW"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id

  quick_connect_ids = [
    #aws_connect_quick_connect.check-policy-transfer-queue.quick_connect_id,
    #aws_connect_quick_connect.update-policy-transfer-queue.quick_connect_id,
    #aws_connect_quick_connect.cancel-policy-transfer-queue.quick_connect_id,
    #aws_connect_quick_connect.general-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    #aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper.contact_flow_id
  }
}

with the above, TF runs fine without any issues

quick-connect.tf

resource "aws_connect_quick_connect" "check-policy-transfer-queue" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Check Policy TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = aws_connect_queue.check-policy-transfers.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}


resource "aws_connect_quick_connect" "update-policy-transfer-queue" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Update Policy TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = aws_connect_queue.update-policy-transfers.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}


resource "aws_connect_quick_connect" "general-transfer-queue" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "General TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = aws_connect_queue.general-transfers.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}

resource "aws_connect_quick_connect" "claims-transfer-queue" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Claims Transfer Queue"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = aws_connect_queue.claims-transfers.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}



resource "aws_connect_quick_connect" "cancel-policy-transfer-queue" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Cancel Policy TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = aws_connect_queue.cancel-policy-transfers.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}

resource "aws_connect_quick_connect" "motor-uw-transfer-queue" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Motor UW TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = aws_connect_queue.motor-uw-transfers.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}

The minute I un-comment one of the quick connect ids in the motor-uw-transfers resource like below:

resource "aws_connect_queue" "motor-uw-transfers" {
  instance_id           = aws_connect_instance.claims_ccp.id
  name                  = "Motor UW Transfers"
  description           = "Internal transfers for Motor UW"
  hours_of_operation_id = data.aws_connect_hours_of_operation.open_hours.hours_of_operation_id

  quick_connect_ids = [
    aws_connect_quick_connect.check-policy-transfer-queue.quick_connect_id,
    #aws_connect_quick_connect.update-policy-transfer-queue.quick_connect_id,
    #aws_connect_quick_connect.cancel-policy-transfer-queue.quick_connect_id,
    #aws_connect_quick_connect.general-transfer-queue.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-rep.quick_connect_id,
    aws_connect_quick_connect.mclaims-3rd-party-credithire.quick_connect_id,
    aws_connect_quick_connect.mclaims-clt-complaints.quick_connect_id,
    aws_connect_quick_connect.mclaims-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-direct-3rd-party.quick_connect_id,
    aws_connect_quick_connect.mclaims-engineering.quick_connect_id,
    aws_connect_quick_connect.mclaims-non-complex.quick_connect_id,
    aws_connect_quick_connect.mclaims-supplier.quick_connect_id,
    #aws_connect_quick_connect.motor-uw-transfer-queue.quick_connect_id
  ]

  outbound_caller_config {
    outbound_caller_id_number_id = "b6566c8e-ad51-4358-9eb1-51df4f825d3e"
    outbound_flow_id             = data.aws_connect_contact_flow.outbound_whisper.contact_flow_id
  }
}

I receive the following error:

Error: Cycle: aws_connect_quick_connect.check-policy-transfer-queue,
aws_connect_queue.motor-uw-transfers,
aws_connect_quick_connect.motor-uw-transfer-queue,
aws_connect_queue.check-policy-transfers

Any help or guidance will be greatly appreciated, i’m aware that the cycle error is around dependencies between the resource, but I can’t see/understand why it is happening, as earlier resources have the same quick connect ids and terraform runs fine.

Hi @liamkelly-esure,

I’m not familiar with the AWS resources being used here, so I can’t offer much advice on how to structure the config, but maybe an explanation of the cycle might help you solve the problem.

The cycle error presented is showing you which resources are participating in the cycle, and in which order. If you start from any of the listed resources, you will see in your config that there is a reference to the previous resource in the cycle.

Basically check-policy-transfer-queue references check-policy-transfers, which references motor-uw-transfer-queue, and that finally references motor-uw-transfers. When you uncomment the check-policy-transfer-queue line in motor-uw-transfers you create a cycle and Terraform cannot determine in which order the resources must be evaluated.

Many thanks for your reply, comparing with our dev environment (where this was done manually by the devs) they don’t quite match up, so will adjust them and see how the response is.

I can’t see a way around this, i understand why the error is happening as you’ve explained, but can’t see what I can change to get around this.

Managed to resolve the issue with the following for quick connects

data "aws_connect_queue" "motor-uw-transfer" {
  instance_id = aws_connect_instance.claims_ccp.id
  queue_id    = "3bda4379-6505-43a5-8bb4-c4f0441f2083"
}

resource "aws_connect_quick_connect" "motor-uw-transfer-quick-connect" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Motor UW TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = data.aws_connect_queue.motor-uw-transfer.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}


data "aws_connect_queue" "check-policy-transfer" {
  instance_id = aws_connect_instance.claims_ccp.id
  queue_id    = "dfd9f14c-2ca1-46c7-94f3-cb9da3862f69"
}

resource "aws_connect_quick_connect" "check-policy-transfer-quick-connect" {
  instance_id = aws_connect_instance.claims_ccp.id
  name        = "Check Policy TX Q"

  quick_connect_config {
    quick_connect_type = "QUEUE"

    queue_config {
      queue_id        = data.aws_connect_queue.check-policy-transfer.queue_id
      contact_flow_id = "01a6a3ae-e091-4459-bd83-1a2e89c7fc92"
    }
  }
}

Which is a shame, because the queue id’s have to be hardcoded, though terraform can’t delete queues, potentially if the id changes then that could be a pain.