The gcp:parametermanager/parameterVersion:ParameterVersion resource, part of the Pulumi GCP provider, stores the actual value of a Parameter Manager parameter as a versioned, immutable snapshot. This guide focuses on three capabilities: plain text and structured data storage, KMS encryption for sensitive values, and file-based configuration loading.
Parameter versions belong to Parameter resources and may reference Cloud KMS keys for encryption. The examples are intentionally small. Combine them with your own Parameter resources, KMS keys, and access policies.
Store a plain text parameter value
Most deployments start by creating a version that stores a simple string value for application configuration.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const parameter_basic = new gcp.parametermanager.Parameter("parameter-basic", {parameterId: "parameter"});
const parameter_version_basic = new gcp.parametermanager.ParameterVersion("parameter-version-basic", {
parameter: parameter_basic.id,
parameterVersionId: "parameter_version",
parameterData: "app-parameter-version-data",
});
import pulumi
import pulumi_gcp as gcp
parameter_basic = gcp.parametermanager.Parameter("parameter-basic", parameter_id="parameter")
parameter_version_basic = gcp.parametermanager.ParameterVersion("parameter-version-basic",
parameter=parameter_basic.id,
parameter_version_id="parameter_version",
parameter_data="app-parameter-version-data")
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/parametermanager"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
parameter_basic, err := parametermanager.NewParameter(ctx, "parameter-basic", ¶metermanager.ParameterArgs{
ParameterId: pulumi.String("parameter"),
})
if err != nil {
return err
}
_, err = parametermanager.NewParameterVersion(ctx, "parameter-version-basic", ¶metermanager.ParameterVersionArgs{
Parameter: parameter_basic.ID(),
ParameterVersionId: pulumi.String("parameter_version"),
ParameterData: pulumi.String("app-parameter-version-data"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var parameter_basic = new Gcp.ParameterManager.Parameter("parameter-basic", new()
{
ParameterId = "parameter",
});
var parameter_version_basic = new Gcp.ParameterManager.ParameterVersion("parameter-version-basic", new()
{
Parameter = parameter_basic.Id,
ParameterVersionId = "parameter_version",
ParameterData = "app-parameter-version-data",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.parametermanager.Parameter;
import com.pulumi.gcp.parametermanager.ParameterArgs;
import com.pulumi.gcp.parametermanager.ParameterVersion;
import com.pulumi.gcp.parametermanager.ParameterVersionArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var parameter_basic = new Parameter("parameter-basic", ParameterArgs.builder()
.parameterId("parameter")
.build());
var parameter_version_basic = new ParameterVersion("parameter-version-basic", ParameterVersionArgs.builder()
.parameter(parameter_basic.id())
.parameterVersionId("parameter_version")
.parameterData("app-parameter-version-data")
.build());
}
}
resources:
parameter-basic:
type: gcp:parametermanager:Parameter
properties:
parameterId: parameter
parameter-version-basic:
type: gcp:parametermanager:ParameterVersion
properties:
parameter: ${["parameter-basic"].id}
parameterVersionId: parameter_version
parameterData: app-parameter-version-data
The parameter property references the parent Parameter resource. The parameterVersionId provides a unique identifier within that parameter. The parameterData holds the actual configuration value. Once created, versions are immutable; updates require creating new versions.
Store structured JSON configuration data
Applications often store multi-field configuration like database settings or feature flags as JSON objects.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const parameter_basic = new gcp.parametermanager.Parameter("parameter-basic", {
parameterId: "parameter",
format: "JSON",
});
const parameter_version_with_json_format = new gcp.parametermanager.ParameterVersion("parameter-version-with-json-format", {
parameter: parameter_basic.id,
parameterVersionId: "parameter_version",
parameterData: JSON.stringify({
key1: "val1",
key2: "val2",
}),
});
import pulumi
import json
import pulumi_gcp as gcp
parameter_basic = gcp.parametermanager.Parameter("parameter-basic",
parameter_id="parameter",
format="JSON")
parameter_version_with_json_format = gcp.parametermanager.ParameterVersion("parameter-version-with-json-format",
parameter=parameter_basic.id,
parameter_version_id="parameter_version",
parameter_data=json.dumps({
"key1": "val1",
"key2": "val2",
}))
package main
import (
"encoding/json"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/parametermanager"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
parameter_basic, err := parametermanager.NewParameter(ctx, "parameter-basic", ¶metermanager.ParameterArgs{
ParameterId: pulumi.String("parameter"),
Format: pulumi.String("JSON"),
})
if err != nil {
return err
}
tmpJSON0, err := json.Marshal(map[string]interface{}{
"key1": "val1",
"key2": "val2",
})
if err != nil {
return err
}
json0 := string(tmpJSON0)
_, err = parametermanager.NewParameterVersion(ctx, "parameter-version-with-json-format", ¶metermanager.ParameterVersionArgs{
Parameter: parameter_basic.ID(),
ParameterVersionId: pulumi.String("parameter_version"),
ParameterData: pulumi.String(json0),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var parameter_basic = new Gcp.ParameterManager.Parameter("parameter-basic", new()
{
ParameterId = "parameter",
Format = "JSON",
});
var parameter_version_with_json_format = new Gcp.ParameterManager.ParameterVersion("parameter-version-with-json-format", new()
{
Parameter = parameter_basic.Id,
ParameterVersionId = "parameter_version",
ParameterData = JsonSerializer.Serialize(new Dictionary<string, object?>
{
["key1"] = "val1",
["key2"] = "val2",
}),
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.parametermanager.Parameter;
import com.pulumi.gcp.parametermanager.ParameterArgs;
import com.pulumi.gcp.parametermanager.ParameterVersion;
import com.pulumi.gcp.parametermanager.ParameterVersionArgs;
import static com.pulumi.codegen.internal.Serialization.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var parameter_basic = new Parameter("parameter-basic", ParameterArgs.builder()
.parameterId("parameter")
.format("JSON")
.build());
var parameter_version_with_json_format = new ParameterVersion("parameter-version-with-json-format", ParameterVersionArgs.builder()
.parameter(parameter_basic.id())
.parameterVersionId("parameter_version")
.parameterData(serializeJson(
jsonObject(
jsonProperty("key1", "val1"),
jsonProperty("key2", "val2")
)))
.build());
}
}
resources:
parameter-basic:
type: gcp:parametermanager:Parameter
properties:
parameterId: parameter
format: JSON
parameter-version-with-json-format:
type: gcp:parametermanager:ParameterVersion
properties:
parameter: ${["parameter-basic"].id}
parameterVersionId: parameter_version
parameterData:
fn::toJSON:
key1: val1
key2: val2
When the parent Parameter has format set to JSON, you can pass structured data using JSON.stringify. Parameter Manager validates the JSON structure and makes it queryable. The parameterData property accepts the serialized JSON string.
Encrypt parameter data with Cloud KMS
Sensitive configuration like API keys requires encryption at rest using customer-managed keys.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const project = gcp.organizations.getProject({});
const parameter_basic = new gcp.parametermanager.Parameter("parameter-basic", {
parameterId: "parameter",
kmsKey: "kms-key",
});
const parameter_version_with_kms_key = new gcp.parametermanager.ParameterVersion("parameter-version-with-kms-key", {
parameter: parameter_basic.id,
parameterVersionId: "parameter_version",
parameterData: "app-parameter-version-data",
});
import pulumi
import pulumi_gcp as gcp
project = gcp.organizations.get_project()
parameter_basic = gcp.parametermanager.Parameter("parameter-basic",
parameter_id="parameter",
kms_key="kms-key")
parameter_version_with_kms_key = gcp.parametermanager.ParameterVersion("parameter-version-with-kms-key",
parameter=parameter_basic.id,
parameter_version_id="parameter_version",
parameter_data="app-parameter-version-data")
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/organizations"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/parametermanager"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := organizations.LookupProject(ctx, &organizations.LookupProjectArgs{}, nil)
if err != nil {
return err
}
parameter_basic, err := parametermanager.NewParameter(ctx, "parameter-basic", ¶metermanager.ParameterArgs{
ParameterId: pulumi.String("parameter"),
KmsKey: pulumi.String("kms-key"),
})
if err != nil {
return err
}
_, err = parametermanager.NewParameterVersion(ctx, "parameter-version-with-kms-key", ¶metermanager.ParameterVersionArgs{
Parameter: parameter_basic.ID(),
ParameterVersionId: pulumi.String("parameter_version"),
ParameterData: pulumi.String("app-parameter-version-data"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var project = Gcp.Organizations.GetProject.Invoke();
var parameter_basic = new Gcp.ParameterManager.Parameter("parameter-basic", new()
{
ParameterId = "parameter",
KmsKey = "kms-key",
});
var parameter_version_with_kms_key = new Gcp.ParameterManager.ParameterVersion("parameter-version-with-kms-key", new()
{
Parameter = parameter_basic.Id,
ParameterVersionId = "parameter_version",
ParameterData = "app-parameter-version-data",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.organizations.OrganizationsFunctions;
import com.pulumi.gcp.organizations.inputs.GetProjectArgs;
import com.pulumi.gcp.parametermanager.Parameter;
import com.pulumi.gcp.parametermanager.ParameterArgs;
import com.pulumi.gcp.parametermanager.ParameterVersion;
import com.pulumi.gcp.parametermanager.ParameterVersionArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
final var project = OrganizationsFunctions.getProject(GetProjectArgs.builder()
.build());
var parameter_basic = new Parameter("parameter-basic", ParameterArgs.builder()
.parameterId("parameter")
.kmsKey("kms-key")
.build());
var parameter_version_with_kms_key = new ParameterVersion("parameter-version-with-kms-key", ParameterVersionArgs.builder()
.parameter(parameter_basic.id())
.parameterVersionId("parameter_version")
.parameterData("app-parameter-version-data")
.build());
}
}
resources:
parameter-basic:
type: gcp:parametermanager:Parameter
properties:
parameterId: parameter
kmsKey: kms-key
parameter-version-with-kms-key:
type: gcp:parametermanager:ParameterVersion
properties:
parameter: ${["parameter-basic"].id}
parameterVersionId: parameter_version
parameterData: app-parameter-version-data
variables:
project:
fn::invoke:
function: gcp:organizations:getProject
arguments: {}
When the parent Parameter specifies a kmsKey, Parameter Manager encrypts the parameterData using that Cloud KMS key. The kmsKeyVersion output property shows which key version was used for encryption. You need encrypt and decrypt permissions on the KMS key.
Load JSON configuration from a file
Teams managing complex configuration often maintain JSON files in source control and load them at deployment time.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as std from "@pulumi/std";
const parameter_basic = new gcp.parametermanager.Parameter("parameter-basic", {
parameterId: "parameter",
format: "JSON",
});
const parameter_version_with_json_format_with_file = new gcp.parametermanager.ParameterVersion("parameter-version-with-json-format-with-file", {
parameter: parameter_basic.id,
parameterVersionId: "parameter_version",
parameterData: std.file({
input: "parameter-json-data.json",
}).then(invoke => invoke.result),
});
import pulumi
import pulumi_gcp as gcp
import pulumi_std as std
parameter_basic = gcp.parametermanager.Parameter("parameter-basic",
parameter_id="parameter",
format="JSON")
parameter_version_with_json_format_with_file = gcp.parametermanager.ParameterVersion("parameter-version-with-json-format-with-file",
parameter=parameter_basic.id,
parameter_version_id="parameter_version",
parameter_data=std.file(input="parameter-json-data.json").result)
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/parametermanager"
"github.com/pulumi/pulumi-std/sdk/go/std"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
parameter_basic, err := parametermanager.NewParameter(ctx, "parameter-basic", ¶metermanager.ParameterArgs{
ParameterId: pulumi.String("parameter"),
Format: pulumi.String("JSON"),
})
if err != nil {
return err
}
invokeFile, err := std.File(ctx, &std.FileArgs{
Input: "parameter-json-data.json",
}, nil)
if err != nil {
return err
}
_, err = parametermanager.NewParameterVersion(ctx, "parameter-version-with-json-format-with-file", ¶metermanager.ParameterVersionArgs{
Parameter: parameter_basic.ID(),
ParameterVersionId: pulumi.String("parameter_version"),
ParameterData: pulumi.String(invokeFile.Result),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Std = Pulumi.Std;
return await Deployment.RunAsync(() =>
{
var parameter_basic = new Gcp.ParameterManager.Parameter("parameter-basic", new()
{
ParameterId = "parameter",
Format = "JSON",
});
var parameter_version_with_json_format_with_file = new Gcp.ParameterManager.ParameterVersion("parameter-version-with-json-format-with-file", new()
{
Parameter = parameter_basic.Id,
ParameterVersionId = "parameter_version",
ParameterData = Std.File.Invoke(new()
{
Input = "parameter-json-data.json",
}).Apply(invoke => invoke.Result),
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.parametermanager.Parameter;
import com.pulumi.gcp.parametermanager.ParameterArgs;
import com.pulumi.gcp.parametermanager.ParameterVersion;
import com.pulumi.gcp.parametermanager.ParameterVersionArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.FileArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var parameter_basic = new Parameter("parameter-basic", ParameterArgs.builder()
.parameterId("parameter")
.format("JSON")
.build());
var parameter_version_with_json_format_with_file = new ParameterVersion("parameter-version-with-json-format-with-file", ParameterVersionArgs.builder()
.parameter(parameter_basic.id())
.parameterVersionId("parameter_version")
.parameterData(StdFunctions.file(FileArgs.builder()
.input("parameter-json-data.json")
.build()).result())
.build());
}
}
resources:
parameter-basic:
type: gcp:parametermanager:Parameter
properties:
parameterId: parameter
format: JSON
parameter-version-with-json-format-with-file:
type: gcp:parametermanager:ParameterVersion
properties:
parameter: ${["parameter-basic"].id}
parameterVersionId: parameter_version
parameterData:
fn::invoke:
function: std:file
arguments:
input: parameter-json-data.json
return: result
The std.file function reads the file contents and passes them to parameterData. This pattern keeps configuration in version control while deploying it to Parameter Manager. The parent Parameter must have format set to JSON for validation.
Load YAML configuration from a file
YAML files provide a more readable format for complex configuration hierarchies.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
import * as std from "@pulumi/std";
const parameter_basic = new gcp.parametermanager.Parameter("parameter-basic", {
parameterId: "parameter",
format: "YAML",
});
const parameter_version_with_yaml_format_with_file = new gcp.parametermanager.ParameterVersion("parameter-version-with-yaml-format-with-file", {
parameter: parameter_basic.id,
parameterVersionId: "parameter_version",
parameterData: std.file({
input: "parameter-yaml-data.yaml",
}).then(invoke => invoke.result),
});
import pulumi
import pulumi_gcp as gcp
import pulumi_std as std
parameter_basic = gcp.parametermanager.Parameter("parameter-basic",
parameter_id="parameter",
format="YAML")
parameter_version_with_yaml_format_with_file = gcp.parametermanager.ParameterVersion("parameter-version-with-yaml-format-with-file",
parameter=parameter_basic.id,
parameter_version_id="parameter_version",
parameter_data=std.file(input="parameter-yaml-data.yaml").result)
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/parametermanager"
"github.com/pulumi/pulumi-std/sdk/go/std"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
parameter_basic, err := parametermanager.NewParameter(ctx, "parameter-basic", ¶metermanager.ParameterArgs{
ParameterId: pulumi.String("parameter"),
Format: pulumi.String("YAML"),
})
if err != nil {
return err
}
invokeFile, err := std.File(ctx, &std.FileArgs{
Input: "parameter-yaml-data.yaml",
}, nil)
if err != nil {
return err
}
_, err = parametermanager.NewParameterVersion(ctx, "parameter-version-with-yaml-format-with-file", ¶metermanager.ParameterVersionArgs{
Parameter: parameter_basic.ID(),
ParameterVersionId: pulumi.String("parameter_version"),
ParameterData: pulumi.String(invokeFile.Result),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
using Std = Pulumi.Std;
return await Deployment.RunAsync(() =>
{
var parameter_basic = new Gcp.ParameterManager.Parameter("parameter-basic", new()
{
ParameterId = "parameter",
Format = "YAML",
});
var parameter_version_with_yaml_format_with_file = new Gcp.ParameterManager.ParameterVersion("parameter-version-with-yaml-format-with-file", new()
{
Parameter = parameter_basic.Id,
ParameterVersionId = "parameter_version",
ParameterData = Std.File.Invoke(new()
{
Input = "parameter-yaml-data.yaml",
}).Apply(invoke => invoke.Result),
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.parametermanager.Parameter;
import com.pulumi.gcp.parametermanager.ParameterArgs;
import com.pulumi.gcp.parametermanager.ParameterVersion;
import com.pulumi.gcp.parametermanager.ParameterVersionArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.FileArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var parameter_basic = new Parameter("parameter-basic", ParameterArgs.builder()
.parameterId("parameter")
.format("YAML")
.build());
var parameter_version_with_yaml_format_with_file = new ParameterVersion("parameter-version-with-yaml-format-with-file", ParameterVersionArgs.builder()
.parameter(parameter_basic.id())
.parameterVersionId("parameter_version")
.parameterData(StdFunctions.file(FileArgs.builder()
.input("parameter-yaml-data.yaml")
.build()).result())
.build());
}
}
resources:
parameter-basic:
type: gcp:parametermanager:Parameter
properties:
parameterId: parameter
format: YAML
parameter-version-with-yaml-format-with-file:
type: gcp:parametermanager:ParameterVersion
properties:
parameter: ${["parameter-basic"].id}
parameterVersionId: parameter_version
parameterData:
fn::invoke:
function: std:file
arguments:
input: parameter-yaml-data.yaml
return: result
Similar to JSON file loading, std.file reads the YAML content. The parent Parameter must have format set to YAML. This pattern works well for Kubernetes manifests or multi-environment settings stored in source control.
Beyond these examples
These snippets focus on specific parameter version features: plain text and structured data storage, KMS encryption, and file-based configuration loading. They’re intentionally minimal rather than full configuration management solutions.
The examples reference pre-existing infrastructure such as Parameter Manager Parameter resources and Cloud KMS keys for encryption examples. They focus on storing parameter values rather than provisioning the surrounding infrastructure.
To keep things focused, common parameter version patterns are omitted, including:
- Version disabling (disabled property)
- Version lifecycle management and rollback
- IAM permissions for parameter access
- Integration with application runtimes
These omissions are intentional: the goal is to illustrate how each parameter version feature is wired, not provide drop-in configuration modules. See the Parameter Version resource reference for all available configuration options.
Let's manage GCP Parameter Manager Versions
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Immutability & Updates
parameter, parameterData, and parameterVersionId properties cannot be changed after creation. Only the disabled field can be updated to enable or disable an existing version.parameterData after creation since it’s immutable. Create a new parameter version with the updated data instead.disabled field is the only mutable property, allowing you to enable or disable a parameter version after creation.Data Formats & Storage
format to "JSON", then use JSON.stringify() on your data object when setting parameterData.std.file() to read file contents into parameterData. The parent Parameter’s format should match the file type (JSON or YAML).format property. Plain text is also supported (default format).Security & Encryption
parameterData property is marked as sensitive and won’t be displayed in plan output for security reasons. This is expected behavior.kmsKey property on the parent Parameter resource. All versions created under that parameter will automatically use the specified KMS key for encryption.