Skip to content

ExperimentTemplate

The ExperimentTemplate resource allows you to define and manage AWS Fault Injection Simulator (FIS) ExperimentTemplates, which are used to orchestrate chaos engineering experiments. For more details, refer to the AWS FIS ExperimentTemplates documentation.

Minimal Example

Create a simple ExperimentTemplate with necessary properties and some common optional configurations.

ts
import AWS from "alchemy/aws/control";

const basicExperimentTemplate = await AWS.FIS.ExperimentTemplate("basic-experiment", {
  Description: "A basic experiment to test service resilience.",
  StopConditions: [
    {
      Source: "aws:cloudwatch:alarm",
      Value: "my-alarm"
    }
  ],
  Targets: {
    myTarget: {
      ResourceType: "aws:ec2:instance",
      SelectionMode: "ALL"
    }
  },
  Actions: {
    myAction: {
      ActionId: "aws:ec2:stop-instances",
      Parameters: {
        "target": "myTarget"
      },
      Duration: "PT30S"
    }
  },
  RoleArn: "arn:aws:iam::123456789012:role/MyFISRole",
  Tags: {
    Environment: "test",
    Project: "ChaosEngineering"
  }
});

Advanced Configuration

Configure an ExperimentTemplate with a detailed report configuration and additional options for complex experiments.

ts
const advancedExperimentTemplate = await AWS.FIS.ExperimentTemplate("advanced-experiment", {
  Description: "An advanced experiment for testing failover mechanisms.",
  StopConditions: [
    {
      Source: "aws:cloudwatch:alarm",
      Value: "failover-alarm"
    }
  ],
  Targets: {
    myTarget: {
      ResourceType: "aws:ec2:instance",
      SelectionMode: "ALL"
    }
  },
  Actions: {
    myAction: {
      ActionId: "aws:ec2:stop-instances",
      Parameters: {
        "target": "myTarget"
      },
      Duration: "PT1M"
    }
  },
  ExperimentReportConfiguration: {
    S3Bucket: "my-experiment-reports",
    S3Prefix: "experiments/"
  },
  ExperimentOptions: {
    Include: ["monitoring"],
    Timeout: "PT10M"
  },
  RoleArn: "arn:aws:iam::123456789012:role/MyFISRole",
  Tags: {
    Environment: "production",
    Project: "ChaosEngineering"
  }
});

Using Log Configuration

Create an ExperimentTemplate that includes logging configurations to capture detailed experiment logs.

ts
const loggingExperimentTemplate = await AWS.FIS.ExperimentTemplate("logging-experiment", {
  Description: "An experiment with logging enabled for detailed insights.",
  StopConditions: [
    {
      Source: "aws:cloudwatch:alarm",
      Value: "log-alarm"
    }
  ],
  Targets: {
    myTarget: {
      ResourceType: "aws:ec2:instance",
      SelectionMode: "ALL"
    }
  },
  Actions: {
    myAction: {
      ActionId: "aws:ec2:stop-instances",
      Parameters: {
        "target": "myTarget"
      },
      Duration: "PT30S"
    }
  },
  LogConfiguration: {
    LogGroupArn: "arn:aws:logs:us-west-2:123456789012:log-group:my-log-group",
    LogStreamName: "experiment-logs"
  },
  RoleArn: "arn:aws:iam::123456789012:role/MyFISRole",
  Tags: {
    Environment: "staging",
    Project: "ChaosEngineering"
  }
});

Adopting Existing Resources

If you want to adopt an existing ExperimentTemplate instead of failing when it already exists, you can set the adopt property to true.

ts
const adoptExistingExperimentTemplate = await AWS.FIS.ExperimentTemplate("adopt-experiment", {
  Description: "An experiment template that adopts existing configurations.",
  StopConditions: [
    {
      Source: "aws:cloudwatch:alarm",
      Value: "adopt-alarm"
    }
  ],
  Targets: {
    myTarget: {
      ResourceType: "aws:ec2:instance",
      SelectionMode: "ALL"
    }
  },
  Actions: {
    myAction: {
      ActionId: "aws:ec2:stop-instances",
      Parameters: {
        "target": "myTarget"
      },
      Duration: "PT45S"
    }
  },
  RoleArn: "arn:aws:iam::123456789012:role/MyFISRole",
  Tags: {
    Environment: "production",
    Project: "ChaosEngineering"
  },
  adopt: true
});