Jason Strimpel
Jason Strimpel

Reputation: 15466

Terraform Variable Composition

I have a variable that defines the query parameters in my API Gateway resource. Every resource has a base set of default query parameters. Some resources have the base set plus an additional parameter.

# base set of query parameters that apply to all resources
variable "parameters_default" {
  default = {
    "method.request.querystring.brokerage"      = false
    "method.request.querystring.account_alias"  = false
    "method.request.querystring.start_date"     = false
    "method.request.querystring.end_date"       = false
    "method.request.querystring.valuation_date" = false
  }
}

# additional query parameter that applies to only one resource
variable "parameters_special_resource" {
  default = {
    "method.request.querystring.brokerage"      = false
    "method.request.querystring.account_alias"  = false
    "method.request.querystring.start_date"     = false
    "method.request.querystring.end_date"       = false
    "method.request.querystring.valuation_date" = false
    "method.request.querystring.top"            = false
  }
}

Instead of having to redefine all the baseline query parameters, I want to use the baseline to compose the second one. Something like this

# compose the parameters_special_resource variable using parameters_special_resource
variable "parameters_special_resource" {
  # baseline parameters_special_resource
  default = {
    "method.request.querystring.top"            = false
  }
}

How is this done?

Upvotes: 1

Views: 212

Answers (1)

Marcin
Marcin

Reputation: 238081

Its not possible to create dynamic variables. Instead you should use locals and merge:

# base set of query parameters that apply to all resources
variable "parameters_default" {
  default = {
    "method.request.querystring.brokerage"      = false
    "method.request.querystring.account_alias"  = false
    "method.request.querystring.start_date"     = false
    "method.request.querystring.end_date"       = false
    "method.request.querystring.valuation_date" = false
  }
}

# additional query parameter that applies to only one resource
variable "parameters_special_resource" {
  default = {
    "method.request.querystring.top"            = false
  }
}

locals {
  # marge base and special paramters
  parameters_special_resource = merge(var.parameters_default, var.parameters_special_resource)
}

Then you use local.parameters_special_resource in your code.

Upvotes: 2

Related Questions