Home > OS >  Change eventbridge cron rule name in terraform
Change eventbridge cron rule name in terraform

Time:05-13

I have a lambda that I trigger with an EventBridge.

I have allowed_triggers in my lambda_function:

  allowed_triggers = {
    "RunDaily" = {
      principal  = "events.amazonaws.com"
      source_arn = module.eventbridge.eventbridge_rule_arns["crons"]
    }
  }

And I have an eventbridge module:

module "eventbridge" {
  source = "terraform-aws-modules/eventbridge/aws"
  version = "1.14.0"

  create_bus   = false
  create_role  = false
  create_rules = true

  rules = {
    crons = {
      description         = "deafault"
      schedule_expression = "rate(1 day)"
    }
  }

  targets = {
    crons = [
      {
        arn   = module.lambda_function.lambda_function_arn
        input = jsonencode({ "job" : "crons" })
      }
    ]
  }
}

Now, this works great, as the rule is created and attached properly.

enter image description here

But when I want to change the name of the rule along with its description, terraform pickups only the description change:

module "eventbridge" {
  ...
  rules = {
    crons = {
      description         = "My custom cron rule"
      schedule_expression = "rate(1 day)"
    }
  }

  targets = {
    crons = [
      {
        name  = "my-custom-cron-rule-name"
        arn   = module.lambda_function.lambda_function_arn
        input = jsonencode({ "job" : "crons" })
      }
    ]
  }
}

Plan:

Terraform will perform the following actions:

  # module.eventbridge.aws_cloudwatch_event_rule.this["crons"] will be updated in-place
  ~ resource "aws_cloudwatch_event_rule" "this" {
      ~ description         = "deafault" -> "My custom cron rule"
        id                  = "crons-rule"
        name                = "crons-rule"
        tags                = {
            "Name" = "crons-rule"
        }
        # (5 unchanged attributes hidden)
    }

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

Question: How do I change the name attribute for an eventbridge rule?

CodePudding user response:

As per the module definition [1], the aws_cloudwatch_event_rule name is derived from value of the key of the rules block, i.e.:

  rules = {
    crons = {
      description         = "My custom cron rule"
      schedule_expression = "rate(1 day)"
    }
  }

Based on the lines from the GitHub repo, the name is formed with:

locals {
  eventbridge_rules = flatten([
    for index, rule in var.rules :
    merge(rule, {
      "name" = index
      "Name" = "${replace(index, "_", "-")}-rule"
    })
  ])
... # rest of locals goes here
}

If you take a look at your definition and this part of code, you can see that the name will be crons-rule, which is visible in both the name and tags.Name arguments:

        name                = "crons-rule"
        tags                = {
            "Name" = "crons-rule"
        }

So in order to change the name of the rule, you would have to change the key of the rules block, i.e.:

  rules = {
    very-nice-new-crons = { # <----- here is where the change should be made
      description         = "My custom cron rule"
      schedule_expression = "rate(1 day)"
    }
  }

You can verify this by looking at [2]:

resource "aws_cloudwatch_event_rule" "this" {
  for_each = { for k, v in local.eventbridge_rules : v.name => v if var.create && var.create_rules }

  name        = each.value.Name
  ...

  tags = merge(var.tags, {
    Name = each.value.Name
  })
}

EDIT: As pointed out, there are two more changes that need to be made after the name is changed:

  1. The allowed_triggers of the Lambda function should now use the new key to reference the event rule that is allowed to trigger it. It has to be changed from
source_arn = module.eventbridge.eventbridge_rule_arns["crons"]

to

source_arn = module.eventbridge.eventbridge_rule_arns["very-nice-new-crons"]
  1. The same name change has to be used in the targets block as well, i.e., the crons key in the targets has to be replaced with the same key name as in the rules block:
  targets = {
    very-nice-new-crons = [
      {
        name  = "my-custom-cron-rule-name"
        arn   = module.lambda_function.lambda_function_arn
        input = jsonencode({ "job" : "crons" })
      }
    ]
  }

[1] https://github.com/terraform-aws-modules/terraform-aws-eventbridge/blob/master/main.tf#L2-L6

[2] https://github.com/terraform-aws-modules/terraform-aws-eventbridge/blob/master/main.tf#L44

  • Related