The aws:evidently/project:Project resource, part of the Pulumi AWS provider, defines a CloudWatch Evidently project that serves as a container for feature flags and experiments. This resource is deprecated; AWS recommends using AppConfig feature flags instead. This guide focuses on three capabilities: project creation with metadata, evaluation event delivery to CloudWatch Logs, and evaluation event archival to S3.
Evidently projects may reference CloudWatch Log Groups or S3 buckets for storing evaluation events. The examples are intentionally small. Combine them with your own logging infrastructure and feature flag resources.
Create a project with name and tags
Evidently projects serve as containers for feature flags and experiments. Most deployments start with a minimal project definition.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Project("example", {
name: "Example",
description: "Example Description",
tags: {
Key1: "example Project",
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Project("example",
name="Example",
description="Example Description",
tags={
"Key1": "example Project",
})
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.NewProject(ctx, "example", &evidently.ProjectArgs{
Name: pulumi.String("Example"),
Description: pulumi.String("Example Description"),
Tags: pulumi.StringMap{
"Key1": pulumi.String("example Project"),
},
})
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.Project("example", new()
{
Name = "Example",
Description = "Example Description",
Tags =
{
{ "Key1", "example Project" },
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Project;
import com.pulumi.aws.evidently.ProjectArgs;
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 Project("example", ProjectArgs.builder()
.name("Example")
.description("Example Description")
.tags(Map.of("Key1", "example Project"))
.build());
}
}
resources:
example:
type: aws:evidently:Project
properties:
name: Example
description: Example Description
tags:
Key1: example Project
The name property sets the project identifier. The description and tags properties add metadata for organization and cost tracking. Without dataDelivery configuration, Evidently deletes evaluation events after producing metrics and experiment results.
Send evaluation events to CloudWatch Logs
Teams analyzing feature flag evaluations or debugging experiment behavior can route events to CloudWatch Logs.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Project("example", {
name: "Example",
description: "Example Description",
dataDelivery: {
cloudwatchLogs: {
logGroup: "example-log-group-name",
},
},
tags: {
Key1: "example Project",
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Project("example",
name="Example",
description="Example Description",
data_delivery={
"cloudwatch_logs": {
"log_group": "example-log-group-name",
},
},
tags={
"Key1": "example Project",
})
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.NewProject(ctx, "example", &evidently.ProjectArgs{
Name: pulumi.String("Example"),
Description: pulumi.String("Example Description"),
DataDelivery: &evidently.ProjectDataDeliveryArgs{
CloudwatchLogs: &evidently.ProjectDataDeliveryCloudwatchLogsArgs{
LogGroup: pulumi.String("example-log-group-name"),
},
},
Tags: pulumi.StringMap{
"Key1": pulumi.String("example Project"),
},
})
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.Project("example", new()
{
Name = "Example",
Description = "Example Description",
DataDelivery = new Aws.Evidently.Inputs.ProjectDataDeliveryArgs
{
CloudwatchLogs = new Aws.Evidently.Inputs.ProjectDataDeliveryCloudwatchLogsArgs
{
LogGroup = "example-log-group-name",
},
},
Tags =
{
{ "Key1", "example Project" },
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Project;
import com.pulumi.aws.evidently.ProjectArgs;
import com.pulumi.aws.evidently.inputs.ProjectDataDeliveryArgs;
import com.pulumi.aws.evidently.inputs.ProjectDataDeliveryCloudwatchLogsArgs;
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 Project("example", ProjectArgs.builder()
.name("Example")
.description("Example Description")
.dataDelivery(ProjectDataDeliveryArgs.builder()
.cloudwatchLogs(ProjectDataDeliveryCloudwatchLogsArgs.builder()
.logGroup("example-log-group-name")
.build())
.build())
.tags(Map.of("Key1", "example Project"))
.build());
}
}
resources:
example:
type: aws:evidently:Project
properties:
name: Example
description: Example Description
dataDelivery:
cloudwatchLogs:
logGroup: example-log-group-name
tags:
Key1: example Project
The dataDelivery block configures where Evidently stores evaluation events. The cloudwatchLogs property specifies a log group name where events are written. This enables querying with CloudWatch Logs Insights and retention beyond Evidently’s default event lifecycle.
Archive evaluation events to S3
For long-term storage or data lake integration, evaluation events can be delivered to S3.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.evidently.Project("example", {
name: "Example",
description: "Example Description",
dataDelivery: {
s3Destination: {
bucket: "example-bucket-name",
prefix: "example",
},
},
tags: {
Key1: "example Project",
},
});
import pulumi
import pulumi_aws as aws
example = aws.evidently.Project("example",
name="Example",
description="Example Description",
data_delivery={
"s3_destination": {
"bucket": "example-bucket-name",
"prefix": "example",
},
},
tags={
"Key1": "example Project",
})
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.NewProject(ctx, "example", &evidently.ProjectArgs{
Name: pulumi.String("Example"),
Description: pulumi.String("Example Description"),
DataDelivery: &evidently.ProjectDataDeliveryArgs{
S3Destination: &evidently.ProjectDataDeliveryS3DestinationArgs{
Bucket: pulumi.String("example-bucket-name"),
Prefix: pulumi.String("example"),
},
},
Tags: pulumi.StringMap{
"Key1": pulumi.String("example Project"),
},
})
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.Project("example", new()
{
Name = "Example",
Description = "Example Description",
DataDelivery = new Aws.Evidently.Inputs.ProjectDataDeliveryArgs
{
S3Destination = new Aws.Evidently.Inputs.ProjectDataDeliveryS3DestinationArgs
{
Bucket = "example-bucket-name",
Prefix = "example",
},
},
Tags =
{
{ "Key1", "example Project" },
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.evidently.Project;
import com.pulumi.aws.evidently.ProjectArgs;
import com.pulumi.aws.evidently.inputs.ProjectDataDeliveryArgs;
import com.pulumi.aws.evidently.inputs.ProjectDataDeliveryS3DestinationArgs;
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 Project("example", ProjectArgs.builder()
.name("Example")
.description("Example Description")
.dataDelivery(ProjectDataDeliveryArgs.builder()
.s3Destination(ProjectDataDeliveryS3DestinationArgs.builder()
.bucket("example-bucket-name")
.prefix("example")
.build())
.build())
.tags(Map.of("Key1", "example Project"))
.build());
}
}
resources:
example:
type: aws:evidently:Project
properties:
name: Example
description: Example Description
dataDelivery:
s3Destination:
bucket: example-bucket-name
prefix: example
tags:
Key1: example Project
The s3Destination property routes evaluation events to an S3 bucket. The prefix property organizes events within the bucket. This supports long-term archival and integration with analytics tools that read from S3.
Beyond these examples
These snippets focus on specific project-level features: project creation and tagging, and evaluation event delivery to CloudWatch Logs and S3. They’re intentionally minimal rather than full feature flag deployments.
The examples may reference pre-existing infrastructure such as CloudWatch Log Groups for log delivery, and S3 buckets for S3 delivery. They focus on configuring the project rather than provisioning everything around it.
To keep things focused, common Evidently patterns are omitted, including:
- Feature flag and experiment configuration (separate resources)
- IAM permissions for data delivery destinations
- Event filtering or sampling configuration
These omissions are intentional: the goal is to illustrate how each project feature is wired, not provide drop-in feature flag modules. See the Evidently Project resource reference for all available configuration options.
Let's create AWS CloudWatch Evidently Projects
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Deprecation & Migration
Data Storage & Retention
You have two options:
- CloudWatch Logs - Configure
dataDelivery.cloudwatchLogs.logGroup - S3 bucket - Configure
dataDelivery.s3Destination.bucketand optionalprefix
Configuration & Limits
name property is immutable and cannot be changed after the project is created.Using a different cloud?
Explore monitoring guides for other cloud providers: