Terraform's disappointing object type
In go, the following code does not compile
package main
import "fmt"
type cloudResource struct {
name string
sku string
}
func main() {
config := cloudResource{name: "myresource", sku: "prod", location: "us"}
fmt.Println(config)
}
This is the error I get
unknown field location in struct literal of type cloudResource
Essentially, I can’t just add a field to a struct at calling time. If I need a field called location, the struct needs to have it as part of its definition.
Unfortunately, terraform does not work like this and the object type can only be used to specify the fields that the object must have rather than a requirement to match the object definition field by field. In other words, there is nothing to prevent you from adding extra fields at calling time, e.g. in your tfvars file.
This, incidentally, is by design. From Hashicorp’s documentation for terraform Type Constraints:
Values that match the object type must contain all of the specified keys, and the value for each key must match its specified type. (Values with additional keys can still match an object type, but the extra attributes are discarded during type conversion.) |
Take this code:
variable "mytype" {
description = "An object"
type = object({
name = string
sku = optional(string, "dev")
})
default = {
name = "value"
sku = "othervalue"
location = "a location"
}
}
output "myoutput" {
value =var.mytype
}
The code above returns this after terraform apply:
Outputs:
myoutput = {
"name" = "value"
"sku" = "othervalue"
}
¯\_(ツ)_/¯