Hi all,
I’m currently building a custom Terraform plugin to provision ES clusters. I had originally posted this in the general Terraform section but realized posting here was more appropriate. I want to read in an input that contains a series of maps and lists nested inside an outer list like so:
tf file:
resource "cluster" "my-cluster" {
api_key = <api_key>
cluster_name = "my cluster"
elasticsearch {
region = "us-east-1"
ref_id = "main-elasticsearch"
plan = {
cluster_topology {
node_type = {
data = true
master = true
ingest = true
}
instance_configuration_id = "aws.data.highio.i3"
zone_count = 2
size = {
resource = "memory"
value = 4096
}
}
}
}
In this example, the outer elasticsearch
attribute is a block of TypeList
, the inner plan
attribute is of TypeMap
, cluster_topology
inside of it is of TypeList
, and both node_type
and size
are of TypeMap
.
When I run terraform init
, I get the following error message:
Error: Missing key/value separator
on cluster.tf line 8, in resource "cluster" "my-cluster":
7:
8: cluster_topology {
Expected an equals sign ("=") to mark the beginning of the attribute value.
Given that I can use tf syntax to describe a TypeList
object as a block and a TypeMap
object with an =
to indicate that it’s an attribute, I’m curious to know why I’m seeing this error. Would love some input on how to fix it as well.
When I include the =
as part of cluster_topology
's declaration, I see the following error message:
Inappropriate value for attribute "plan": element "cluster_topology": string
required.
Here’s a snippet of the schema definitions in my resource
file:
"elasticsearch": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"ref_id": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"plan": &schema.Schema{
Type: schema.TypeMap,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"cluster_topology": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"node_type": &schema.Schema{
Type: schema.TypeMap,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"data": &schema.Schema{
Type: schema.TypeBool,
Required: true,
},
"master": &schema.Schema{
Type: schema.TypeBool,
Required: true,
},
"ingest": &schema.Schema{
Type: schema.TypeBool,
Required: true,
},
},
},
Required: true,
},