The aws:evidently/launch:Launch resource, part of the Pulumi AWS provider, defines a CloudWatch Evidently launch that controls how feature variations are rolled out to users over time. This resource is deprecated; AWS recommends using AppConfig feature flags instead. This guide focuses on four capabilities: scheduled traffic allocation, multiple variation groups for A/B testing, metric monitoring, and segment-based traffic overrides.
Launches belong to Evidently projects and reference features and segments that must exist separately. The examples are intentionally small. Combine them with your own projects, features, and monitoring infrastructure.
Create a launch with scheduled traffic allocation
Feature launches typically start with a single variation group and a scheduled rollout that controls when traffic begins flowing.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Launch("example", {
name: "example",
project: exampleAwsEvidentlyProject.name,
groups: [{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation1",
variation: "Variation1",
}],
scheduledSplitsConfig: {
steps: [{
groupWeights: {
Variation1: 0,
},
startTime: "2024-01-07 01:43:59+00:00",
}],
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Launch("example",
name="example",
project=example_aws_evidently_project["name"],
groups=[{
"feature": example_aws_evidently_feature["name"],
"name": "Variation1",
"variation": "Variation1",
}],
scheduled_splits_config={
"steps": [{
"group_weights": {
"Variation1": 0,
},
"start_time": "2024-01-07 01:43:59+00:00",
}],
})
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/evidently"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := evidently.NewLaunch(ctx, "example", &evidently.LaunchArgs{
Name: pulumi.String("example"),
Project: pulumi.Any(exampleAwsEvidentlyProject.Name),
Groups: evidently.LaunchGroupArray{
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation1"),
Variation: pulumi.String("Variation1"),
},
},
ScheduledSplitsConfig: &evidently.LaunchScheduledSplitsConfigArgs{
Steps: evidently.LaunchScheduledSplitsConfigStepArray{
&evidently.LaunchScheduledSplitsConfigStepArgs{
GroupWeights: pulumi.IntMap{
"Variation1": pulumi.Int(0),
},
StartTime: pulumi.String("2024-01-07 01:43:59+00:00"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Evidently.Launch("example", new()
{
Name = "example",
Project = exampleAwsEvidentlyProject.Name,
Groups = new[]
{
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation1",
Variation = "Variation1",
},
},
ScheduledSplitsConfig = new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigArgs
{
Steps = new[]
{
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepArgs
{
GroupWeights =
{
{ "Variation1", 0 },
},
StartTime = "2024-01-07 01:43:59+00:00",
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Launch;
import com.pulumi.aws.evidently.LaunchArgs;
import com.pulumi.aws.evidently.inputs.LaunchGroupArgs;
import com.pulumi.aws.evidently.inputs.LaunchScheduledSplitsConfigArgs;
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 example = new Launch("example", LaunchArgs.builder()
.name("example")
.project(exampleAwsEvidentlyProject.name())
.groups(LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation1")
.variation("Variation1")
.build())
.scheduledSplitsConfig(LaunchScheduledSplitsConfigArgs.builder()
.steps(LaunchScheduledSplitsConfigStepArgs.builder()
.groupWeights(Map.of("Variation1", 0))
.startTime("2024-01-07 01:43:59+00:00")
.build())
.build())
.build());
}
}
resources:
example:
type: aws:evidently:Launch
properties:
name: example
project: ${exampleAwsEvidentlyProject.name}
groups:
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation1
variation: Variation1
scheduledSplitsConfig:
steps:
- groupWeights:
Variation1: 0
startTime: 2024-01-07 01:43:59+00:00
The groups property defines which feature variations participate in the launch. The scheduledSplitsConfig controls traffic allocation over time: each step specifies groupWeights (percentage of traffic to each variation) and a startTime. Here, Variation1 receives 0% traffic starting at the specified time, effectively keeping the feature off until weights are adjusted.
Split traffic across multiple feature variations
A/B tests and multivariate experiments require multiple variation groups to compare different implementations.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Launch("example", {
name: "example",
project: exampleAwsEvidentlyProject.name,
groups: [
{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation1",
variation: "Variation1",
description: "first-group",
},
{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation2",
variation: "Variation2",
description: "second-group",
},
],
scheduledSplitsConfig: {
steps: [{
groupWeights: {
Variation1: 0,
Variation2: 0,
},
startTime: "2024-01-07 01:43:59+00:00",
}],
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Launch("example",
name="example",
project=example_aws_evidently_project["name"],
groups=[
{
"feature": example_aws_evidently_feature["name"],
"name": "Variation1",
"variation": "Variation1",
"description": "first-group",
},
{
"feature": example_aws_evidently_feature["name"],
"name": "Variation2",
"variation": "Variation2",
"description": "second-group",
},
],
scheduled_splits_config={
"steps": [{
"group_weights": {
"Variation1": 0,
"Variation2": 0,
},
"start_time": "2024-01-07 01:43:59+00:00",
}],
})
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/evidently"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := evidently.NewLaunch(ctx, "example", &evidently.LaunchArgs{
Name: pulumi.String("example"),
Project: pulumi.Any(exampleAwsEvidentlyProject.Name),
Groups: evidently.LaunchGroupArray{
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation1"),
Variation: pulumi.String("Variation1"),
Description: pulumi.String("first-group"),
},
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation2"),
Variation: pulumi.String("Variation2"),
Description: pulumi.String("second-group"),
},
},
ScheduledSplitsConfig: &evidently.LaunchScheduledSplitsConfigArgs{
Steps: evidently.LaunchScheduledSplitsConfigStepArray{
&evidently.LaunchScheduledSplitsConfigStepArgs{
GroupWeights: pulumi.IntMap{
"Variation1": pulumi.Int(0),
"Variation2": pulumi.Int(0),
},
StartTime: pulumi.String("2024-01-07 01:43:59+00:00"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Evidently.Launch("example", new()
{
Name = "example",
Project = exampleAwsEvidentlyProject.Name,
Groups = new[]
{
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation1",
Variation = "Variation1",
Description = "first-group",
},
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation2",
Variation = "Variation2",
Description = "second-group",
},
},
ScheduledSplitsConfig = new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigArgs
{
Steps = new[]
{
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepArgs
{
GroupWeights =
{
{ "Variation1", 0 },
{ "Variation2", 0 },
},
StartTime = "2024-01-07 01:43:59+00:00",
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Launch;
import com.pulumi.aws.evidently.LaunchArgs;
import com.pulumi.aws.evidently.inputs.LaunchGroupArgs;
import com.pulumi.aws.evidently.inputs.LaunchScheduledSplitsConfigArgs;
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 example = new Launch("example", LaunchArgs.builder()
.name("example")
.project(exampleAwsEvidentlyProject.name())
.groups(
LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation1")
.variation("Variation1")
.description("first-group")
.build(),
LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation2")
.variation("Variation2")
.description("second-group")
.build())
.scheduledSplitsConfig(LaunchScheduledSplitsConfigArgs.builder()
.steps(LaunchScheduledSplitsConfigStepArgs.builder()
.groupWeights(Map.ofEntries(
Map.entry("Variation1", 0),
Map.entry("Variation2", 0)
))
.startTime("2024-01-07 01:43:59+00:00")
.build())
.build())
.build());
}
}
resources:
example:
type: aws:evidently:Launch
properties:
name: example
project: ${exampleAwsEvidentlyProject.name}
groups:
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation1
variation: Variation1
description: first-group
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation2
variation: Variation2
description: second-group
scheduledSplitsConfig:
steps:
- groupWeights:
Variation1: 0
Variation2: 0
startTime: 2024-01-07 01:43:59+00:00
Each group references the same feature but specifies a different variation name. The groupWeights in scheduledSplitsConfig must include an entry for each group. Both variations start at 0% traffic, allowing you to control when each becomes active.
Monitor launch performance with custom metrics
Teams running experiments need to track business metrics to determine which variation performs better.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Launch("example", {
name: "example",
project: exampleAwsEvidentlyProject.name,
groups: [{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation1",
variation: "Variation1",
}],
metricMonitors: [
{
metricDefinition: {
entityIdKey: "entity_id_key1",
eventPattern: "{\"Price\":[{\"numeric\":[\">\",11,\"<=\",22]}]}",
name: "name1",
unitLabel: "unit_label1",
valueKey: "value_key1",
},
},
{
metricDefinition: {
entityIdKey: "entity_id_key2",
eventPattern: "{\"Price\":[{\"numeric\":[\">\",9,\"<=\",19]}]}",
name: "name2",
unitLabel: "unit_label2",
valueKey: "value_key2",
},
},
],
scheduledSplitsConfig: {
steps: [{
groupWeights: {
Variation1: 0,
},
startTime: "2024-01-07 01:43:59+00:00",
}],
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Launch("example",
name="example",
project=example_aws_evidently_project["name"],
groups=[{
"feature": example_aws_evidently_feature["name"],
"name": "Variation1",
"variation": "Variation1",
}],
metric_monitors=[
{
"metric_definition": {
"entity_id_key": "entity_id_key1",
"event_pattern": "{\"Price\":[{\"numeric\":[\">\",11,\"<=\",22]}]}",
"name": "name1",
"unit_label": "unit_label1",
"value_key": "value_key1",
},
},
{
"metric_definition": {
"entity_id_key": "entity_id_key2",
"event_pattern": "{\"Price\":[{\"numeric\":[\">\",9,\"<=\",19]}]}",
"name": "name2",
"unit_label": "unit_label2",
"value_key": "value_key2",
},
},
],
scheduled_splits_config={
"steps": [{
"group_weights": {
"Variation1": 0,
},
"start_time": "2024-01-07 01:43:59+00:00",
}],
})
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/evidently"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := evidently.NewLaunch(ctx, "example", &evidently.LaunchArgs{
Name: pulumi.String("example"),
Project: pulumi.Any(exampleAwsEvidentlyProject.Name),
Groups: evidently.LaunchGroupArray{
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation1"),
Variation: pulumi.String("Variation1"),
},
},
MetricMonitors: evidently.LaunchMetricMonitorArray{
&evidently.LaunchMetricMonitorArgs{
MetricDefinition: &evidently.LaunchMetricMonitorMetricDefinitionArgs{
EntityIdKey: pulumi.String("entity_id_key1"),
EventPattern: pulumi.String("{\"Price\":[{\"numeric\":[\">\",11,\"<=\",22]}]}"),
Name: pulumi.String("name1"),
UnitLabel: pulumi.String("unit_label1"),
ValueKey: pulumi.String("value_key1"),
},
},
&evidently.LaunchMetricMonitorArgs{
MetricDefinition: &evidently.LaunchMetricMonitorMetricDefinitionArgs{
EntityIdKey: pulumi.String("entity_id_key2"),
EventPattern: pulumi.String("{\"Price\":[{\"numeric\":[\">\",9,\"<=\",19]}]}"),
Name: pulumi.String("name2"),
UnitLabel: pulumi.String("unit_label2"),
ValueKey: pulumi.String("value_key2"),
},
},
},
ScheduledSplitsConfig: &evidently.LaunchScheduledSplitsConfigArgs{
Steps: evidently.LaunchScheduledSplitsConfigStepArray{
&evidently.LaunchScheduledSplitsConfigStepArgs{
GroupWeights: pulumi.IntMap{
"Variation1": pulumi.Int(0),
},
StartTime: pulumi.String("2024-01-07 01:43:59+00:00"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Evidently.Launch("example", new()
{
Name = "example",
Project = exampleAwsEvidentlyProject.Name,
Groups = new[]
{
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation1",
Variation = "Variation1",
},
},
MetricMonitors = new[]
{
new Aws.Evidently.Inputs.LaunchMetricMonitorArgs
{
MetricDefinition = new Aws.Evidently.Inputs.LaunchMetricMonitorMetricDefinitionArgs
{
EntityIdKey = "entity_id_key1",
EventPattern = "{\"Price\":[{\"numeric\":[\">\",11,\"<=\",22]}]}",
Name = "name1",
UnitLabel = "unit_label1",
ValueKey = "value_key1",
},
},
new Aws.Evidently.Inputs.LaunchMetricMonitorArgs
{
MetricDefinition = new Aws.Evidently.Inputs.LaunchMetricMonitorMetricDefinitionArgs
{
EntityIdKey = "entity_id_key2",
EventPattern = "{\"Price\":[{\"numeric\":[\">\",9,\"<=\",19]}]}",
Name = "name2",
UnitLabel = "unit_label2",
ValueKey = "value_key2",
},
},
},
ScheduledSplitsConfig = new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigArgs
{
Steps = new[]
{
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepArgs
{
GroupWeights =
{
{ "Variation1", 0 },
},
StartTime = "2024-01-07 01:43:59+00:00",
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Launch;
import com.pulumi.aws.evidently.LaunchArgs;
import com.pulumi.aws.evidently.inputs.LaunchGroupArgs;
import com.pulumi.aws.evidently.inputs.LaunchMetricMonitorArgs;
import com.pulumi.aws.evidently.inputs.LaunchMetricMonitorMetricDefinitionArgs;
import com.pulumi.aws.evidently.inputs.LaunchScheduledSplitsConfigArgs;
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 example = new Launch("example", LaunchArgs.builder()
.name("example")
.project(exampleAwsEvidentlyProject.name())
.groups(LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation1")
.variation("Variation1")
.build())
.metricMonitors(
LaunchMetricMonitorArgs.builder()
.metricDefinition(LaunchMetricMonitorMetricDefinitionArgs.builder()
.entityIdKey("entity_id_key1")
.eventPattern("{\"Price\":[{\"numeric\":[\">\",11,\"<=\",22]}]}")
.name("name1")
.unitLabel("unit_label1")
.valueKey("value_key1")
.build())
.build(),
LaunchMetricMonitorArgs.builder()
.metricDefinition(LaunchMetricMonitorMetricDefinitionArgs.builder()
.entityIdKey("entity_id_key2")
.eventPattern("{\"Price\":[{\"numeric\":[\">\",9,\"<=\",19]}]}")
.name("name2")
.unitLabel("unit_label2")
.valueKey("value_key2")
.build())
.build())
.scheduledSplitsConfig(LaunchScheduledSplitsConfigArgs.builder()
.steps(LaunchScheduledSplitsConfigStepArgs.builder()
.groupWeights(Map.of("Variation1", 0))
.startTime("2024-01-07 01:43:59+00:00")
.build())
.build())
.build());
}
}
resources:
example:
type: aws:evidently:Launch
properties:
name: example
project: ${exampleAwsEvidentlyProject.name}
groups:
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation1
variation: Variation1
metricMonitors:
- metricDefinition:
entityIdKey: entity_id_key1
eventPattern: '{"Price":[{"numeric":[">",11,"<=",22]}]}'
name: name1
unitLabel: unit_label1
valueKey: value_key1
- metricDefinition:
entityIdKey: entity_id_key2
eventPattern: '{"Price":[{"numeric":[">",9,"<=",19]}]}'
name: name2
unitLabel: unit_label2
valueKey: value_key2
scheduledSplitsConfig:
steps:
- groupWeights:
Variation1: 0
startTime: 2024-01-07 01:43:59+00:00
The metricMonitors property defines custom metrics that Evidently tracks during the launch. Each metricDefinition specifies an entityIdKey (identifies the user or session), eventPattern (JSON filter for relevant events), and valueKey (extracts the metric value). The eventPattern uses JSON path syntax to filter events by price range.
Gradually increase traffic over multiple stages
Progressive rollouts reduce risk by starting with small traffic percentages and increasing allocation as confidence grows.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Launch("example", {
name: "example",
project: exampleAwsEvidentlyProject.name,
groups: [
{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation1",
variation: "Variation1",
},
{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation2",
variation: "Variation2",
},
],
scheduledSplitsConfig: {
steps: [
{
groupWeights: {
Variation1: 15,
Variation2: 10,
},
startTime: "2024-01-07 01:43:59+00:00",
},
{
groupWeights: {
Variation1: 20,
Variation2: 25,
},
startTime: "2024-01-08 01:43:59+00:00",
},
],
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Launch("example",
name="example",
project=example_aws_evidently_project["name"],
groups=[
{
"feature": example_aws_evidently_feature["name"],
"name": "Variation1",
"variation": "Variation1",
},
{
"feature": example_aws_evidently_feature["name"],
"name": "Variation2",
"variation": "Variation2",
},
],
scheduled_splits_config={
"steps": [
{
"group_weights": {
"Variation1": 15,
"Variation2": 10,
},
"start_time": "2024-01-07 01:43:59+00:00",
},
{
"group_weights": {
"Variation1": 20,
"Variation2": 25,
},
"start_time": "2024-01-08 01:43:59+00:00",
},
],
})
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/evidently"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := evidently.NewLaunch(ctx, "example", &evidently.LaunchArgs{
Name: pulumi.String("example"),
Project: pulumi.Any(exampleAwsEvidentlyProject.Name),
Groups: evidently.LaunchGroupArray{
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation1"),
Variation: pulumi.String("Variation1"),
},
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation2"),
Variation: pulumi.String("Variation2"),
},
},
ScheduledSplitsConfig: &evidently.LaunchScheduledSplitsConfigArgs{
Steps: evidently.LaunchScheduledSplitsConfigStepArray{
&evidently.LaunchScheduledSplitsConfigStepArgs{
GroupWeights: pulumi.IntMap{
"Variation1": pulumi.Int(15),
"Variation2": pulumi.Int(10),
},
StartTime: pulumi.String("2024-01-07 01:43:59+00:00"),
},
&evidently.LaunchScheduledSplitsConfigStepArgs{
GroupWeights: pulumi.IntMap{
"Variation1": pulumi.Int(20),
"Variation2": pulumi.Int(25),
},
StartTime: pulumi.String("2024-01-08 01:43:59+00:00"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Evidently.Launch("example", new()
{
Name = "example",
Project = exampleAwsEvidentlyProject.Name,
Groups = new[]
{
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation1",
Variation = "Variation1",
},
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation2",
Variation = "Variation2",
},
},
ScheduledSplitsConfig = new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigArgs
{
Steps = new[]
{
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepArgs
{
GroupWeights =
{
{ "Variation1", 15 },
{ "Variation2", 10 },
},
StartTime = "2024-01-07 01:43:59+00:00",
},
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepArgs
{
GroupWeights =
{
{ "Variation1", 20 },
{ "Variation2", 25 },
},
StartTime = "2024-01-08 01:43:59+00:00",
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Launch;
import com.pulumi.aws.evidently.LaunchArgs;
import com.pulumi.aws.evidently.inputs.LaunchGroupArgs;
import com.pulumi.aws.evidently.inputs.LaunchScheduledSplitsConfigArgs;
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 example = new Launch("example", LaunchArgs.builder()
.name("example")
.project(exampleAwsEvidentlyProject.name())
.groups(
LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation1")
.variation("Variation1")
.build(),
LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation2")
.variation("Variation2")
.build())
.scheduledSplitsConfig(LaunchScheduledSplitsConfigArgs.builder()
.steps(
LaunchScheduledSplitsConfigStepArgs.builder()
.groupWeights(Map.ofEntries(
Map.entry("Variation1", 15),
Map.entry("Variation2", 10)
))
.startTime("2024-01-07 01:43:59+00:00")
.build(),
LaunchScheduledSplitsConfigStepArgs.builder()
.groupWeights(Map.ofEntries(
Map.entry("Variation1", 20),
Map.entry("Variation2", 25)
))
.startTime("2024-01-08 01:43:59+00:00")
.build())
.build())
.build());
}
}
resources:
example:
type: aws:evidently:Launch
properties:
name: example
project: ${exampleAwsEvidentlyProject.name}
groups:
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation1
variation: Variation1
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation2
variation: Variation2
scheduledSplitsConfig:
steps:
- groupWeights:
Variation1: 15
Variation2: 10
startTime: 2024-01-07 01:43:59+00:00
- groupWeights:
Variation1: 20
Variation2: 25
startTime: 2024-01-08 01:43:59+00:00
Multiple steps in scheduledSplitsConfig create a staged rollout. The first step allocates 15% to Variation1 and 10% to Variation2 starting January 7. The second step increases allocation to 20% and 25% respectively on January 8. Each step’s startTime determines when the new weights take effect.
Target specific user segments with custom weights
Some launches need to treat different user segments differently, routing beta users or premium customers to specific variations.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Launch("example", {
name: "example",
project: exampleAwsEvidentlyProject.name,
groups: [
{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation1",
variation: "Variation1",
},
{
feature: exampleAwsEvidentlyFeature.name,
name: "Variation2",
variation: "Variation2",
},
],
scheduledSplitsConfig: {
steps: [{
groupWeights: {
Variation1: 0,
Variation2: 0,
},
segmentOverrides: [
{
evaluationOrder: 1,
segment: exampleAwsEvidentlySegment.name,
weights: {
Variation2: 10000,
},
},
{
evaluationOrder: 2,
segment: exampleAwsEvidentlySegment.name,
weights: {
Variation1: 40000,
Variation2: 30000,
},
},
],
startTime: "2024-01-08 01:43:59+00:00",
}],
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Launch("example",
name="example",
project=example_aws_evidently_project["name"],
groups=[
{
"feature": example_aws_evidently_feature["name"],
"name": "Variation1",
"variation": "Variation1",
},
{
"feature": example_aws_evidently_feature["name"],
"name": "Variation2",
"variation": "Variation2",
},
],
scheduled_splits_config={
"steps": [{
"group_weights": {
"Variation1": 0,
"Variation2": 0,
},
"segment_overrides": [
{
"evaluation_order": 1,
"segment": example_aws_evidently_segment["name"],
"weights": {
"Variation2": 10000,
},
},
{
"evaluation_order": 2,
"segment": example_aws_evidently_segment["name"],
"weights": {
"Variation1": 40000,
"Variation2": 30000,
},
},
],
"start_time": "2024-01-08 01:43:59+00:00",
}],
})
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/evidently"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := evidently.NewLaunch(ctx, "example", &evidently.LaunchArgs{
Name: pulumi.String("example"),
Project: pulumi.Any(exampleAwsEvidentlyProject.Name),
Groups: evidently.LaunchGroupArray{
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation1"),
Variation: pulumi.String("Variation1"),
},
&evidently.LaunchGroupArgs{
Feature: pulumi.Any(exampleAwsEvidentlyFeature.Name),
Name: pulumi.String("Variation2"),
Variation: pulumi.String("Variation2"),
},
},
ScheduledSplitsConfig: &evidently.LaunchScheduledSplitsConfigArgs{
Steps: evidently.LaunchScheduledSplitsConfigStepArray{
&evidently.LaunchScheduledSplitsConfigStepArgs{
GroupWeights: pulumi.IntMap{
"Variation1": pulumi.Int(0),
"Variation2": pulumi.Int(0),
},
SegmentOverrides: evidently.LaunchScheduledSplitsConfigStepSegmentOverrideArray{
&evidently.LaunchScheduledSplitsConfigStepSegmentOverrideArgs{
EvaluationOrder: pulumi.Int(1),
Segment: pulumi.Any(exampleAwsEvidentlySegment.Name),
Weights: pulumi.IntMap{
"Variation2": pulumi.Int(10000),
},
},
&evidently.LaunchScheduledSplitsConfigStepSegmentOverrideArgs{
EvaluationOrder: pulumi.Int(2),
Segment: pulumi.Any(exampleAwsEvidentlySegment.Name),
Weights: pulumi.IntMap{
"Variation1": pulumi.Int(40000),
"Variation2": pulumi.Int(30000),
},
},
},
StartTime: pulumi.String("2024-01-08 01:43:59+00:00"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Evidently.Launch("example", new()
{
Name = "example",
Project = exampleAwsEvidentlyProject.Name,
Groups = new[]
{
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation1",
Variation = "Variation1",
},
new Aws.Evidently.Inputs.LaunchGroupArgs
{
Feature = exampleAwsEvidentlyFeature.Name,
Name = "Variation2",
Variation = "Variation2",
},
},
ScheduledSplitsConfig = new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigArgs
{
Steps = new[]
{
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepArgs
{
GroupWeights =
{
{ "Variation1", 0 },
{ "Variation2", 0 },
},
SegmentOverrides = new[]
{
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepSegmentOverrideArgs
{
EvaluationOrder = 1,
Segment = exampleAwsEvidentlySegment.Name,
Weights =
{
{ "Variation2", 10000 },
},
},
new Aws.Evidently.Inputs.LaunchScheduledSplitsConfigStepSegmentOverrideArgs
{
EvaluationOrder = 2,
Segment = exampleAwsEvidentlySegment.Name,
Weights =
{
{ "Variation1", 40000 },
{ "Variation2", 30000 },
},
},
},
StartTime = "2024-01-08 01:43:59+00:00",
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Launch;
import com.pulumi.aws.evidently.LaunchArgs;
import com.pulumi.aws.evidently.inputs.LaunchGroupArgs;
import com.pulumi.aws.evidently.inputs.LaunchScheduledSplitsConfigArgs;
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 example = new Launch("example", LaunchArgs.builder()
.name("example")
.project(exampleAwsEvidentlyProject.name())
.groups(
LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation1")
.variation("Variation1")
.build(),
LaunchGroupArgs.builder()
.feature(exampleAwsEvidentlyFeature.name())
.name("Variation2")
.variation("Variation2")
.build())
.scheduledSplitsConfig(LaunchScheduledSplitsConfigArgs.builder()
.steps(LaunchScheduledSplitsConfigStepArgs.builder()
.groupWeights(Map.ofEntries(
Map.entry("Variation1", 0),
Map.entry("Variation2", 0)
))
.segmentOverrides(
LaunchScheduledSplitsConfigStepSegmentOverrideArgs.builder()
.evaluationOrder(1)
.segment(exampleAwsEvidentlySegment.name())
.weights(Map.of("Variation2", 10000))
.build(),
LaunchScheduledSplitsConfigStepSegmentOverrideArgs.builder()
.evaluationOrder(2)
.segment(exampleAwsEvidentlySegment.name())
.weights(Map.ofEntries(
Map.entry("Variation1", 40000),
Map.entry("Variation2", 30000)
))
.build())
.startTime("2024-01-08 01:43:59+00:00")
.build())
.build())
.build());
}
}
resources:
example:
type: aws:evidently:Launch
properties:
name: example
project: ${exampleAwsEvidentlyProject.name}
groups:
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation1
variation: Variation1
- feature: ${exampleAwsEvidentlyFeature.name}
name: Variation2
variation: Variation2
scheduledSplitsConfig:
steps:
- groupWeights:
Variation1: 0
Variation2: 0
segmentOverrides:
- evaluationOrder: 1
segment: ${exampleAwsEvidentlySegment.name}
weights:
Variation2: 10000
- evaluationOrder: 2
segment: ${exampleAwsEvidentlySegment.name}
weights:
Variation1: 40000
Variation2: 30000
startTime: 2024-01-08 01:43:59+00:00
The segmentOverrides property within each step defines custom traffic allocation for specific segments. The evaluationOrder determines which override applies when a user matches multiple segments. The weights property allocates traffic within that segment, using basis points (10000 = 100%). Here, one segment receives 100% Variation2, while another splits between both variations.
Beyond these examples
These snippets focus on specific launch-level features: scheduled traffic allocation and progressive rollouts, metric monitoring and performance tracking, and segment-based traffic overrides. They’re intentionally minimal rather than full experimentation frameworks.
The examples reference pre-existing infrastructure such as Evidently projects and features, and Evidently segments for segment overrides. They focus on configuring the launch rather than provisioning the surrounding experimentation infrastructure.
To keep things focused, common launch patterns are omitted, including:
- Description and metadata (description property)
- Custom randomization salts (randomizationSalt)
- Launch lifecycle management (status transitions)
- Tags for organization and cost tracking
These omissions are intentional: the goal is to illustrate how each launch feature is wired, not provide drop-in experimentation modules. See the Evidently Launch resource reference for all available configuration options.
Let's configure AWS Evidently Launches
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Migration & Deprecation
Configuration & Limits
name and project properties are immutable. You’ll need to recreate the launch to change either of these.randomizationSalt if you omit it. Set a custom salt only if you need specific randomization behavior.Traffic Management
scheduledSplitsConfig with multiple steps, each specifying groupWeights and startTime to control traffic allocation over time.segmentOverrides within scheduledSplitsConfig steps to specify segment-specific weights and evaluationOrder for prioritization.Monitoring & Metrics
metricMonitors blocks with metricDefinition containing entityIdKey, eventPattern (JSON), name, unitLabel, and valueKey.launchName:projectName or launchName:projectArn format (e.g., exampleLaunchName:exampleProjectName).Using a different cloud?
Explore monitoring guides for other cloud providers: