Configure AWS Systems Manager Contacts Rotation

The aws:ssm/contactsRotation:ContactsRotation resource, part of the Pulumi AWS provider, defines on-call rotation schedules that determine when contacts are active for incident response in AWS Systems Manager Incident Manager. This guide focuses on three rotation capabilities: daily schedules, weekly rotations with coverage windows, and monthly patterns.

Rotations require existing SSM Contacts and an SSM Incidents replication set. The examples are intentionally small. Combine them with your own contact definitions and incident management configuration.

Schedule daily on-call rotations

Teams managing incident response often start with daily rotations that hand off at a consistent time each day, providing predictable coverage without complex scheduling.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const example = new aws.ssm.ContactsRotation("example", {
    contactIds: [exampleAwsSsmcontactsContact.arn],
    name: "rotation",
    recurrence: {
        numberOfOnCalls: 1,
        recurrenceMultiplier: 1,
        dailySettings: [{
            hourOfDay: 9,
            minuteOfHour: 0,
        }],
    },
    timeZoneId: "Australia/Sydney",
}, {
    dependsOn: [exampleAwsSsmincidentsReplicationSet],
});
import pulumi
import pulumi_aws as aws

example = aws.ssm.ContactsRotation("example",
    contact_ids=[example_aws_ssmcontacts_contact["arn"]],
    name="rotation",
    recurrence={
        "number_of_on_calls": 1,
        "recurrence_multiplier": 1,
        "daily_settings": [{
            "hour_of_day": 9,
            "minute_of_hour": 0,
        }],
    },
    time_zone_id="Australia/Sydney",
    opts = pulumi.ResourceOptions(depends_on=[example_aws_ssmincidents_replication_set]))
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ssm"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := ssm.NewContactsRotation(ctx, "example", &ssm.ContactsRotationArgs{
			ContactIds: pulumi.StringArray{
				exampleAwsSsmcontactsContact.Arn,
			},
			Name: pulumi.String("rotation"),
			Recurrence: &ssm.ContactsRotationRecurrenceArgs{
				NumberOfOnCalls:      pulumi.Int(1),
				RecurrenceMultiplier: pulumi.Int(1),
				DailySettings: ssm.ContactsRotationRecurrenceDailySettingArray{
					&ssm.ContactsRotationRecurrenceDailySettingArgs{
						HourOfDay:    pulumi.Int(9),
						MinuteOfHour: pulumi.Int(0),
					},
				},
			},
			TimeZoneId: pulumi.String("Australia/Sydney"),
		}, pulumi.DependsOn([]pulumi.Resource{
			exampleAwsSsmincidentsReplicationSet,
		}))
		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.Ssm.ContactsRotation("example", new()
    {
        ContactIds = new[]
        {
            exampleAwsSsmcontactsContact.Arn,
        },
        Name = "rotation",
        Recurrence = new Aws.Ssm.Inputs.ContactsRotationRecurrenceArgs
        {
            NumberOfOnCalls = 1,
            RecurrenceMultiplier = 1,
            DailySettings = new[]
            {
                new Aws.Ssm.Inputs.ContactsRotationRecurrenceDailySettingArgs
                {
                    HourOfDay = 9,
                    MinuteOfHour = 0,
                },
            },
        },
        TimeZoneId = "Australia/Sydney",
    }, new CustomResourceOptions
    {
        DependsOn =
        {
            exampleAwsSsmincidentsReplicationSet,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.ssm.ContactsRotation;
import com.pulumi.aws.ssm.ContactsRotationArgs;
import com.pulumi.aws.ssm.inputs.ContactsRotationRecurrenceArgs;
import com.pulumi.resources.CustomResourceOptions;
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 ContactsRotation("example", ContactsRotationArgs.builder()
            .contactIds(exampleAwsSsmcontactsContact.arn())
            .name("rotation")
            .recurrence(ContactsRotationRecurrenceArgs.builder()
                .numberOfOnCalls(1)
                .recurrenceMultiplier(1)
                .dailySettings(ContactsRotationRecurrenceDailySettingArgs.builder()
                    .hourOfDay(9)
                    .minuteOfHour(0)
                    .build())
                .build())
            .timeZoneId("Australia/Sydney")
            .build(), CustomResourceOptions.builder()
                .dependsOn(exampleAwsSsmincidentsReplicationSet)
                .build());

    }
}
resources:
  example:
    type: aws:ssm:ContactsRotation
    properties:
      contactIds:
        - ${exampleAwsSsmcontactsContact.arn}
      name: rotation
      recurrence:
        numberOfOnCalls: 1
        recurrenceMultiplier: 1
        dailySettings:
          - hourOfDay: 9
            minuteOfHour: 0
      timeZoneId: Australia/Sydney
    options:
      dependsOn:
        - ${exampleAwsSsmincidentsReplicationSet}

The recurrence property defines when and how often the rotation cycles. The dailySettings array specifies the hand-off time in the configured time zone. The numberOfOnCalls property controls how many contacts are active simultaneously; here, one contact is on-call at a time. The contactIds array determines shift order.

Define weekly handoffs with coverage windows

Some teams need rotations that hand off on specific weekdays at different times, with coverage windows that limit when on-call contacts can be paged.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const example = new aws.ssm.ContactsRotation("example", {
    contactIds: [exampleAwsSsmcontactsContact.arn],
    name: "rotation",
    recurrence: {
        numberOfOnCalls: 1,
        recurrenceMultiplier: 1,
        weeklySettings: [
            {
                dayOfWeek: "WED",
                handOffTime: {
                    hourOfDay: 4,
                    minuteOfHour: 25,
                },
            },
            {
                dayOfWeek: "FRI",
                handOffTime: {
                    hourOfDay: 15,
                    minuteOfHour: 57,
                },
            },
        ],
        shiftCoverages: [{
            mapBlockKey: "MON",
            coverageTimes: [{
                start: {
                    hourOfDay: 1,
                    minuteOfHour: 0,
                },
                end: {
                    hourOfDay: 23,
                    minuteOfHour: 0,
                },
            }],
        }],
    },
    startTime: "2023-07-20T02:21:49+00:00",
    timeZoneId: "Australia/Sydney",
    tags: {
        key1: "tag1",
        key2: "tag2",
    },
}, {
    dependsOn: [exampleAwsSsmincidentsReplicationSet],
});
import pulumi
import pulumi_aws as aws

example = aws.ssm.ContactsRotation("example",
    contact_ids=[example_aws_ssmcontacts_contact["arn"]],
    name="rotation",
    recurrence={
        "number_of_on_calls": 1,
        "recurrence_multiplier": 1,
        "weekly_settings": [
            {
                "day_of_week": "WED",
                "hand_off_time": {
                    "hour_of_day": 4,
                    "minute_of_hour": 25,
                },
            },
            {
                "day_of_week": "FRI",
                "hand_off_time": {
                    "hour_of_day": 15,
                    "minute_of_hour": 57,
                },
            },
        ],
        "shift_coverages": [{
            "map_block_key": "MON",
            "coverage_times": [{
                "start": {
                    "hour_of_day": 1,
                    "minute_of_hour": 0,
                },
                "end": {
                    "hour_of_day": 23,
                    "minute_of_hour": 0,
                },
            }],
        }],
    },
    start_time="2023-07-20T02:21:49+00:00",
    time_zone_id="Australia/Sydney",
    tags={
        "key1": "tag1",
        "key2": "tag2",
    },
    opts = pulumi.ResourceOptions(depends_on=[example_aws_ssmincidents_replication_set]))
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ssm"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := ssm.NewContactsRotation(ctx, "example", &ssm.ContactsRotationArgs{
			ContactIds: pulumi.StringArray{
				exampleAwsSsmcontactsContact.Arn,
			},
			Name: pulumi.String("rotation"),
			Recurrence: &ssm.ContactsRotationRecurrenceArgs{
				NumberOfOnCalls:      pulumi.Int(1),
				RecurrenceMultiplier: pulumi.Int(1),
				WeeklySettings: ssm.ContactsRotationRecurrenceWeeklySettingArray{
					&ssm.ContactsRotationRecurrenceWeeklySettingArgs{
						DayOfWeek: pulumi.String("WED"),
						HandOffTime: &ssm.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs{
							HourOfDay:    pulumi.Int(4),
							MinuteOfHour: pulumi.Int(25),
						},
					},
					&ssm.ContactsRotationRecurrenceWeeklySettingArgs{
						DayOfWeek: pulumi.String("FRI"),
						HandOffTime: &ssm.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs{
							HourOfDay:    pulumi.Int(15),
							MinuteOfHour: pulumi.Int(57),
						},
					},
				},
				ShiftCoverages: ssm.ContactsRotationRecurrenceShiftCoverageArray{
					&ssm.ContactsRotationRecurrenceShiftCoverageArgs{
						MapBlockKey: pulumi.String("MON"),
						CoverageTimes: ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeArray{
							&ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeArgs{
								Start: &ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeStartArgs{
									HourOfDay:    pulumi.Int(1),
									MinuteOfHour: pulumi.Int(0),
								},
								End: &ssm.ContactsRotationRecurrenceShiftCoverageCoverageTimeEndArgs{
									HourOfDay:    pulumi.Int(23),
									MinuteOfHour: pulumi.Int(0),
								},
							},
						},
					},
				},
			},
			StartTime:  pulumi.String("2023-07-20T02:21:49+00:00"),
			TimeZoneId: pulumi.String("Australia/Sydney"),
			Tags: pulumi.StringMap{
				"key1": pulumi.String("tag1"),
				"key2": pulumi.String("tag2"),
			},
		}, pulumi.DependsOn([]pulumi.Resource{
			exampleAwsSsmincidentsReplicationSet,
		}))
		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.Ssm.ContactsRotation("example", new()
    {
        ContactIds = new[]
        {
            exampleAwsSsmcontactsContact.Arn,
        },
        Name = "rotation",
        Recurrence = new Aws.Ssm.Inputs.ContactsRotationRecurrenceArgs
        {
            NumberOfOnCalls = 1,
            RecurrenceMultiplier = 1,
            WeeklySettings = new[]
            {
                new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingArgs
                {
                    DayOfWeek = "WED",
                    HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs
                    {
                        HourOfDay = 4,
                        MinuteOfHour = 25,
                    },
                },
                new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingArgs
                {
                    DayOfWeek = "FRI",
                    HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs
                    {
                        HourOfDay = 15,
                        MinuteOfHour = 57,
                    },
                },
            },
            ShiftCoverages = new[]
            {
                new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageArgs
                {
                    MapBlockKey = "MON",
                    CoverageTimes = new[]
                    {
                        new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageCoverageTimeArgs
                        {
                            Start = new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageCoverageTimeStartArgs
                            {
                                HourOfDay = 1,
                                MinuteOfHour = 0,
                            },
                            End = new Aws.Ssm.Inputs.ContactsRotationRecurrenceShiftCoverageCoverageTimeEndArgs
                            {
                                HourOfDay = 23,
                                MinuteOfHour = 0,
                            },
                        },
                    },
                },
            },
        },
        StartTime = "2023-07-20T02:21:49+00:00",
        TimeZoneId = "Australia/Sydney",
        Tags = 
        {
            { "key1", "tag1" },
            { "key2", "tag2" },
        },
    }, new CustomResourceOptions
    {
        DependsOn =
        {
            exampleAwsSsmincidentsReplicationSet,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.ssm.ContactsRotation;
import com.pulumi.aws.ssm.ContactsRotationArgs;
import com.pulumi.aws.ssm.inputs.ContactsRotationRecurrenceArgs;
import com.pulumi.resources.CustomResourceOptions;
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 ContactsRotation("example", ContactsRotationArgs.builder()
            .contactIds(exampleAwsSsmcontactsContact.arn())
            .name("rotation")
            .recurrence(ContactsRotationRecurrenceArgs.builder()
                .numberOfOnCalls(1)
                .recurrenceMultiplier(1)
                .weeklySettings(                
                    ContactsRotationRecurrenceWeeklySettingArgs.builder()
                        .dayOfWeek("WED")
                        .handOffTime(ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs.builder()
                            .hourOfDay(4)
                            .minuteOfHour(25)
                            .build())
                        .build(),
                    ContactsRotationRecurrenceWeeklySettingArgs.builder()
                        .dayOfWeek("FRI")
                        .handOffTime(ContactsRotationRecurrenceWeeklySettingHandOffTimeArgs.builder()
                            .hourOfDay(15)
                            .minuteOfHour(57)
                            .build())
                        .build())
                .shiftCoverages(ContactsRotationRecurrenceShiftCoverageArgs.builder()
                    .mapBlockKey("MON")
                    .coverageTimes(ContactsRotationRecurrenceShiftCoverageCoverageTimeArgs.builder()
                        .start(ContactsRotationRecurrenceShiftCoverageCoverageTimeStartArgs.builder()
                            .hourOfDay(1)
                            .minuteOfHour(0)
                            .build())
                        .end(ContactsRotationRecurrenceShiftCoverageCoverageTimeEndArgs.builder()
                            .hourOfDay(23)
                            .minuteOfHour(0)
                            .build())
                        .build())
                    .build())
                .build())
            .startTime("2023-07-20T02:21:49+00:00")
            .timeZoneId("Australia/Sydney")
            .tags(Map.ofEntries(
                Map.entry("key1", "tag1"),
                Map.entry("key2", "tag2")
            ))
            .build(), CustomResourceOptions.builder()
                .dependsOn(exampleAwsSsmincidentsReplicationSet)
                .build());

    }
}
resources:
  example:
    type: aws:ssm:ContactsRotation
    properties:
      contactIds:
        - ${exampleAwsSsmcontactsContact.arn}
      name: rotation
      recurrence:
        numberOfOnCalls: 1
        recurrenceMultiplier: 1
        weeklySettings:
          - dayOfWeek: WED
            handOffTime:
              hourOfDay: 4
              minuteOfHour: 25
          - dayOfWeek: FRI
            handOffTime:
              hourOfDay: 15
              minuteOfHour: 57
        shiftCoverages:
          - mapBlockKey: MON
            coverageTimes:
              - start:
                  hourOfDay: 1
                  minuteOfHour: 0
                end:
                  hourOfDay: 23
                  minuteOfHour: 0
      startTime: 2023-07-20T02:21:49+00:00
      timeZoneId: Australia/Sydney
      tags:
        key1: tag1
        key2: tag2
    options:
      dependsOn:
        - ${exampleAwsSsmincidentsReplicationSet}

The weeklySettings array defines hand-off times for specific days of the week. Each entry specifies a dayOfWeek and handOffTime. The shiftCoverages property restricts when contacts can be paged; in this configuration, Monday coverage runs from 1:00 AM to 11:00 PM. Outside coverage windows, pages are not delivered.

Schedule monthly rotations on specific dates

Organizations with longer rotation cycles can schedule handoffs on specific days of each month.

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const example = new aws.ssm.ContactsRotation("example", {
    contactIds: [exampleAwsSsmcontactsContact.arn],
    name: "rotation",
    recurrence: {
        numberOfOnCalls: 1,
        recurrenceMultiplier: 1,
        monthlySettings: [
            {
                dayOfMonth: 20,
                handOffTime: {
                    hourOfDay: 8,
                    minuteOfHour: 0,
                },
            },
            {
                dayOfMonth: 13,
                handOffTime: {
                    hourOfDay: 12,
                    minuteOfHour: 34,
                },
            },
        ],
    },
    timeZoneId: "Australia/Sydney",
}, {
    dependsOn: [exampleAwsSsmincidentsReplicationSet],
});
import pulumi
import pulumi_aws as aws

example = aws.ssm.ContactsRotation("example",
    contact_ids=[example_aws_ssmcontacts_contact["arn"]],
    name="rotation",
    recurrence={
        "number_of_on_calls": 1,
        "recurrence_multiplier": 1,
        "monthly_settings": [
            {
                "day_of_month": 20,
                "hand_off_time": {
                    "hour_of_day": 8,
                    "minute_of_hour": 0,
                },
            },
            {
                "day_of_month": 13,
                "hand_off_time": {
                    "hour_of_day": 12,
                    "minute_of_hour": 34,
                },
            },
        ],
    },
    time_zone_id="Australia/Sydney",
    opts = pulumi.ResourceOptions(depends_on=[example_aws_ssmincidents_replication_set]))
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ssm"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		_, err := ssm.NewContactsRotation(ctx, "example", &ssm.ContactsRotationArgs{
			ContactIds: pulumi.StringArray{
				exampleAwsSsmcontactsContact.Arn,
			},
			Name: pulumi.String("rotation"),
			Recurrence: &ssm.ContactsRotationRecurrenceArgs{
				NumberOfOnCalls:      pulumi.Int(1),
				RecurrenceMultiplier: pulumi.Int(1),
				MonthlySettings: ssm.ContactsRotationRecurrenceMonthlySettingArray{
					&ssm.ContactsRotationRecurrenceMonthlySettingArgs{
						DayOfMonth: pulumi.Int(20),
						HandOffTime: &ssm.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs{
							HourOfDay:    pulumi.Int(8),
							MinuteOfHour: pulumi.Int(0),
						},
					},
					&ssm.ContactsRotationRecurrenceMonthlySettingArgs{
						DayOfMonth: pulumi.Int(13),
						HandOffTime: &ssm.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs{
							HourOfDay:    pulumi.Int(12),
							MinuteOfHour: pulumi.Int(34),
						},
					},
				},
			},
			TimeZoneId: pulumi.String("Australia/Sydney"),
		}, pulumi.DependsOn([]pulumi.Resource{
			exampleAwsSsmincidentsReplicationSet,
		}))
		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.Ssm.ContactsRotation("example", new()
    {
        ContactIds = new[]
        {
            exampleAwsSsmcontactsContact.Arn,
        },
        Name = "rotation",
        Recurrence = new Aws.Ssm.Inputs.ContactsRotationRecurrenceArgs
        {
            NumberOfOnCalls = 1,
            RecurrenceMultiplier = 1,
            MonthlySettings = new[]
            {
                new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingArgs
                {
                    DayOfMonth = 20,
                    HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs
                    {
                        HourOfDay = 8,
                        MinuteOfHour = 0,
                    },
                },
                new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingArgs
                {
                    DayOfMonth = 13,
                    HandOffTime = new Aws.Ssm.Inputs.ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs
                    {
                        HourOfDay = 12,
                        MinuteOfHour = 34,
                    },
                },
            },
        },
        TimeZoneId = "Australia/Sydney",
    }, new CustomResourceOptions
    {
        DependsOn =
        {
            exampleAwsSsmincidentsReplicationSet,
        },
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.ssm.ContactsRotation;
import com.pulumi.aws.ssm.ContactsRotationArgs;
import com.pulumi.aws.ssm.inputs.ContactsRotationRecurrenceArgs;
import com.pulumi.resources.CustomResourceOptions;
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 ContactsRotation("example", ContactsRotationArgs.builder()
            .contactIds(exampleAwsSsmcontactsContact.arn())
            .name("rotation")
            .recurrence(ContactsRotationRecurrenceArgs.builder()
                .numberOfOnCalls(1)
                .recurrenceMultiplier(1)
                .monthlySettings(                
                    ContactsRotationRecurrenceMonthlySettingArgs.builder()
                        .dayOfMonth(20)
                        .handOffTime(ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs.builder()
                            .hourOfDay(8)
                            .minuteOfHour(0)
                            .build())
                        .build(),
                    ContactsRotationRecurrenceMonthlySettingArgs.builder()
                        .dayOfMonth(13)
                        .handOffTime(ContactsRotationRecurrenceMonthlySettingHandOffTimeArgs.builder()
                            .hourOfDay(12)
                            .minuteOfHour(34)
                            .build())
                        .build())
                .build())
            .timeZoneId("Australia/Sydney")
            .build(), CustomResourceOptions.builder()
                .dependsOn(exampleAwsSsmincidentsReplicationSet)
                .build());

    }
}
resources:
  example:
    type: aws:ssm:ContactsRotation
    properties:
      contactIds:
        - ${exampleAwsSsmcontactsContact.arn}
      name: rotation
      recurrence:
        numberOfOnCalls: 1
        recurrenceMultiplier: 1
        monthlySettings:
          - dayOfMonth: 20
            handOffTime:
              hourOfDay: 8
              minuteOfHour: 0
          - dayOfMonth: 13
            handOffTime:
              hourOfDay: 12
              minuteOfHour: 34
      timeZoneId: Australia/Sydney
    options:
      dependsOn:
        - ${exampleAwsSsmincidentsReplicationSet}

The monthlySettings array defines hand-off times for specific calendar dates. Each entry specifies a dayOfMonth (1-31) and handOffTime. This configuration rotates on the 20th at 8:00 AM and the 13th at 12:34 PM each month.

Beyond these examples

These snippets focus on specific rotation schedule features: daily, weekly, and monthly rotation schedules, and shift coverage windows. They’re intentionally minimal rather than full incident management configurations.

The examples reference pre-existing infrastructure such as SSM Contacts (contact ARNs) and an SSM Incidents replication set. They focus on rotation scheduling rather than provisioning the underlying incident management infrastructure.

To keep things focused, common rotation patterns are omitted, including:

  • Start time configuration for delayed activation
  • Multiple on-call contacts per shift (numberOfOnCalls > 1)
  • Recurrence multipliers for multi-day/week/month periods
  • Tags for organization and cost tracking

These omissions are intentional: the goal is to illustrate how each rotation schedule pattern is wired, not provide drop-in incident management modules. See the SSM Contacts Rotation resource reference for all available configuration options.

Let's configure AWS Systems Manager Contacts Rotation

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Configuration & Requirements
Can I use multiple recurrence settings like daily and weekly together?
No, you must choose exactly one of dailySettings, monthlySettings, or weeklySettings in the recurrence block. Using multiple or none will cause an error.
Why do I need to depend on a replication set?
All examples show dependsOn: [exampleAwsSsmincidentsReplicationSet], indicating the replication set is a prerequisite for creating rotations.
Does the order of contacts in contactIds matter?
Yes, the order you list contacts determines their shift order in the rotation schedule.
Scheduling & Time Formats
What timezone format should I use for timeZoneId?
Use IANA format (e.g., Australia/Sydney, America/New_York). This determines when the rotation’s activity occurs.
What format should I use for startTime?
Use RFC 3339 format (e.g., 2023-07-20T02:21:49+00:00). This specifies when the rotation goes into effect.

Using a different cloud?

Explore integration guides for other cloud providers: