RabbitMQ - Create Update or Delete a dynamic Shovel using Terraform

A shovel is used to move a message from a queue or exchange to a different queue or exchage. The queues or exchanges can reside on the same RabbitMQ node or on different RabbitMQ nodes.

 

AVOID TROUBLE

Before you can create a shovel, the rabbitmq_shovel plugin will need to be enabled, and you may want to also enable the rabbitmq_shovel_management plugin so that you can use Shovel Status and Shovel Management in the RabbitMQ web browser console and the RabbitMQ REST API to list/create/delete dynamic shovels. The rabbitmq-plugins list command can be used to determine if the plugins are enabled. If not, the rabbitmq-plugins enable command can be used to enable the plugins.

If the RabbitMQ node is not using SSL, the src-uri or dest-uri should start with amqp://. If SSL is being used, the src-uri or dest-uri should start with amqps://.

 

There are two types of shovels.

 

This assumes you have setup Terraform as described in RabbitMQ - Getting Started with Terraform. Let's say you have the following files on your Terraform server.

/usr/local/terraform/rabbitmq/main.tf
/usr/local/terraform/rabbitmq/foo/required_provider.tf
/usr/local/terraform/rabbitmq/foo/bindings.tf
/usr/local/terraform/rabbitmq/foo/exchanges.tf
/usr/local/terraform/rabbitmq/foo/policies.tf
/usr/local/terraform/rabbitmq/foo/queues.tf
/usr/local/terraform/rabbitmq/foo/shovels.tf
/usr/local/terraform/rabbitmq/foo/vhosts.tf

 

Add the following to your shovels.tf file. In this example, a dynamic shovel named shovel001 is created that will move messages from foo.queue to bar.queue.

resource "rabbitmq_shovel" "shovel1" {
  name = "shovel001"
  vhost = "foo"
  info {
    ack_mode = "on-confirm"
    source_protocol = "amqp091"
    source_uri = "amqp://john.doe:itsasecret@rabbit001.example.com:5672/foo"
    source_queue = "foo.queue"
    destination_protocol = "amqp091"
    destination_uri = "amqps://john.doe:itsasecret@rabbit002.example.com:5672/bar"
    destination_queue = "bar.queue"
    reconnect_delay = 1
  }
}

 

The terraform init command can be used so that Terraform can communicate with RabbitMQ.

terraform init

 

The terraform plan command can be used to see what Terraform will try to do.

terraform plan

 

By default, the terraform.tfstate file should be found in your root module directory (/usr/local/terraform/rabbitmq in this example).

  • If the shovel does not exist and the terraform.tfstate file does not contain the shovel , Terraform will create the shovel.
  • If the shovel exists and the terraform.tfstate file contains the shovel and a difference is found between the shovel.tf file and the terraform.tfstate file, Terraform will update the shovel.
  • If the shovel exists and the terraform.tfstate file contains the shovel and the shovel is removed from the shovel.tf file, Terraform will destroy (delete) the shovel.

The terraform apply command from your root module directory (/usr/local/terraform/rabbitmq in this example) can be used to create, update or destory the shovel.

terraform apply

 

Something like this should be displayed, and you will be prompted to enter yes.

Terraform will perform the following actions:

  # rabbitmq_shovel.shovel1 will be created
  + resource "rabbitmq_shovel" "shovel1" {
      + id    = (known after apply)
      + name  = "shovel001"
      + vhost = "foo"

      +   info {
        + ack_mode = "on-confirm"
        + source_protocol = "amqp091"
        + source_uri = "amqp://john.doe:itsasecret@rabbit001.example.com:5672/foo"
        + source_queue = "foo.queue"
        + destination_protocol = "amqp091"
        + destination_uri = "amqps://john.doe:itsasecret@rabbit002.example.com:5672/bar"
        + destination_queue = "bar.queue"
        + reconnect_delay = 1
      }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

 

After entering yes, the following should be displayed.

rabbitmq_shovel.shovel1: Creating...
rabbitmq_shovel.shovel1: Creation complete after 0s [id=shovel001@foo]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

 




Did you find this article helpful?

If so, consider buying me a coffee over at Buy Me A Coffee

Add a Comment




We will never share your name or email with anyone. Enter your email if you would like to be notified when we respond to your comment.





Please enter ce034 in the box below so that we can be sure you are a human.




Comments

Web design by yours truely - me, myself, and I   |   jeremy.canfield@freekb.net   |