terraform-provider-cue allows Terraform to evaluate CUE configs and render JSON for use in Terraform.
Author's Note
CUE has potential to be a better Jsonnet (if it gets a proper module manager). But like Jsonnet, its usage should be limited to preparing JSON-only configs where there are no viable alternatives (e.g. Grafana dashboards). Prefer native Terraform where possible, its ecosystem and design is simpler, more powerful, more mature, and ubiquitous.Configure the cue provider (e.g. providers.tf).
provider "cue" {}
terraform {
required_providers {
ct = {
source = "poseidon/cue"
version = "0.4.1"
}
}
}Run terraform init to ensure version requirements are met.
$ terraform init -upgrade
Define a cue_config data source to validate CUE content.
data "cue_config" "example" {
pretty_print = true
content = <<-EOT
a: 1
b: 2
sum: a + b
_hidden: 3
l: [a, b]
map: [string]:int
map: {a: 1 * 5}
map: {"b": b * 5}
EOT
}Optionally provide paths to CUE files (supports imports).
data "cue_config" "example" {
paths = [
"core.cue",
"box.cue",
]
}Or unify content and path based expressions together.
data "cue_config" "example" {
paths = [
"partial.cue",
]
content = <<-EOT
package example
_config: {
name: "ACME"
amount: "$20.00"
}
EOT
}Customize the root directory CUE uses during loading (defaults to current directory).
data "cue_config" "example" {
paths = [
"foo.cue",
]
dir = "internal/testmod"
pretty_print = false
}
Render the CUE config as JSON for use in Terraform expressions.
output "out" {
description = "Show Cue rendered as JSON"
value = data.cue_config.example.rendered
}The rendered content example looks like:
{
"a": 1,
"b": 2,
"sum": 3,
"l": [
1,
2
],
"map": {
"a": 5,
"b": 10
}
}- Terraform v1.0+ installed
To develop the provider plugin locally, build an executable with Go v1.18+.
make