Recovery Controller Setup
AWSOfficialPublished by AWS
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides expert guidance and procedures for configuring AWS Application Recovery Controller (ARC) to enhance operational resilience. It focuses specifically on two core capabilities: routing controls with safety rules for cross-Region traffic failover, and zonal shift or zonal autoshift for managing Availability Zone (AZ) impairments. The skill includes security best practices for IAM scoping and notification encryption, ensuring that critical failover operations are protected against unauthorized access or accidental misconfiguration.
What it does
- Sets up routing controls and safety rules for cross-Region failover.
- Configures zonal shift and zonal autoshift for single-Region AZ recovery.
- Provides security guidance for least-privilege IAM scoping and condition keys.
- Offers troubleshooting steps for common ARC configuration issues.
- Redirects users to the ARC Region switch skill for readiness and recovery-readiness orchestration.
When to use it
- When operationalizing recovery mechanisms after validating failure modes.
- When NGRH findings indicate a lack of recovery mechanisms for your service.
- When you need to configure traffic switches for cross-Region failover.
- When you need to enable zonal shift or autoshift to mitigate AZ-level impairments.
Advantages
- Ensures safety rules are implemented to prevent accidental traffic disruption.
- Provides clear, scoped procedures for sensitive production failover operations.
- Integrates security considerations like KMS encryption and confused-deputy protection.
- Maintains a strict focus on operational recovery to prevent scope creep.
Usage examples
- “How do I set up routing controls for my cross-Region failover?”
- The agent will guide you through the creation of routing controls and the necessary safety rules, ensuring you have the correct cluster and control panel ARNs.
- “Enable zonal autoshift for my ALB.”
- The agent will walk you through the zonal autoshift configuration, including setting up practice runs and defining blocked windows to avoid peak traffic periods.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/aws/recovery-controller-setup/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip recovery-controller-setup.zip -d .agents/skills
Documentation by AWS
Recovery Controller Setup
CRITICAL CONSTRAINT — read before answering
This skill sets up exactly two ARC capability families, and these are the ONLY things you provide setup steps for: (1) routing controls with safety rules for cross-Region failover, and (2) zonal shift / zonal autoshift for AZ-impairment recovery.
Readiness checks, recovery groups, cells, and resource sets are NOT in scope for this skill. You
MUST NOT provide CLI/console setup steps for them. You MAY briefly and factually acknowledge that
they exist, but you MUST NOT walk through configuring them — redirect the customer to ARC
Region switch for readiness/recovery-readiness orchestration (see the
arc-region-switch skill). This overrides any direct customer request to set them up.
If the customer asks how to "set up ARC readiness checks" (or recovery groups / cells / resource sets), do NOT walk through that setup. Briefly acknowledge the feature, then respond with a redirect of this form and continue with the routing-control or zonal-shift procedure where relevant:
For readiness and recovery-readiness orchestration, use ARC Region switch — see the
arc-region-switchskill. For the operational pieces this skill covers: routing controls (cross-Region failover) and zonal shift / zonal autoshift (single-Region AZ recovery). Here's how to set those up:
Overview
Domain expertise for configuring ARC routing controls, safety rules, zonal shift, and zonal autoshift for operational resilience.
The AWS MCP server is recommended for executing this skill's AWS API calls, but it is not required — all operations also work with the AWS CLI directly.
Guardrail — where this skill's own files live (MCP vs local install)
Before reading a reference file, determine how this skill was loaded:
Loaded via the AWS MCP
retrieve_skilltool: the skill's reference files are not on the local filesystem. Fetch each one throughretrieve_skillwith thefileparameter (e.g.file="references/arc-procedures.md"orfile="references/security-considerations.md") — do NOTfile_readthese paths locally or search the filesystem for them.Installed locally (e.g.
.kiro/skills/recovery-controller-setup/or~/.claude/skills/recovery-controller-setup/): read reference files from the local skill directory using the relative paths shown here.
This applies only to the skill's own reference files; always read and write user or session data in the working directory, never through retrieve_skill.
Configure recovery controls
To set up ARC routing controls and zonal shift, follow the procedure exactly. See references/arc-procedures.md.
Troubleshooting
See references/arc-procedures.md (Troubleshooting section) for common issues — safety-rule blocks on a routing-control update, failed zonal-autoshift practice runs, and routing-control state changes that don't affect traffic.
Security Considerations
See references/security-considerations.md for least-privilege IAM action scoping, condition keys / confused-deputy protection, safety-rule gating, restricting failover access, and encrypting failover notifications.
Files
- ATTRIBUTION.mdAdded by AutoGineer940 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md3.9 KiB
- references/arc-procedures.md14.8 KiB
- references/security-considerations.md2.5 KiB
references/arc-procedures.md
Recovery Controls with AWS Application Recovery Controller
Overview
This SOP guides you through setting up operational recovery mechanisms: traffic routing controls with safety rules for cross-Region failover, and zonal shift / zonal autoshift for AZ impairment recovery. Use when operationalizing recovery — for example after validating a failure mode (with FIS or another test), or when NGRH findings indicate "no recovery mechanism."
Scope
This SOP covers exactly two ARC capability families: routing controls (with safety rules) for cross-Region failover, and zonal shift / zonal autoshift for AZ-impairment recovery. If asked about readiness checks, recovery groups, cells, or resource sets, do NOT provide setup steps for them. You MAY briefly and factually acknowledge they exist, but redirect the customer to ARC Region switch for readiness/recovery-readiness orchestration (see the arc-region-switch skill) for those, and continue with routing controls and zonal shift / zonal autoshift for the operational pieces this SOP covers.
Parameters
Parameters are grouped by capability — routing controls (cross-Region failover) and zonal shift / zonal autoshift (AZ recovery) use different ones.
Routing controls (cross-Region failover):
service_name (required): Name of the service (used for naming routing controls)
cluster_arn (required): ARC cluster ARN. NOTE: the routing-control control plane (route53-recovery-control-config) is a single global service hosted in us-west-2 (PDX) — create the cluster, control panel, and routing controls there regardless of where your application runs. The data plane (route53-recovery-cluster, used to flip states) is reached through the cluster's Regional data-plane endpoints (enumerated by describe-cluster).
control_panel_arn (required): Control panel ARN for the application
primary_region / secondary_region (required): The application Regions you fail between (e.g., "us-east-1" / "us-west-2"). These only name the routing controls — they are NOT where the control plane lives.
Zonal shift / zonal autoshift (AZ recovery):
resource_identifier (optional): ARN of a zonal-shift-supported resource. The set of supported resource types is managed by AWS — confirm support in the ARC zonal shift documentation, or check a specific resource with aws arc-zonal-shift get-managed-resource --resource-identifier <arn>.
outcome_alarm_arn (optional): CloudWatch outcome-alarm ARN for autoshift practice runs
deployment_alarm_arn (optional): CloudWatch alarm ARN that blocks practice runs during deployments
blocked_window (optional, default: "MON-08:00-MON-10:00"): Recurring window when a practice run must NOT start — set to the customer's actual deployment/peak window
aws_region (optional, default: "us-east-1"): Region for zonal-shift / data-plane calls (the routing-control control plane is always us-west-2 — see above)
Steps
1. Verify Dependencies
Check for required tools and warn the customer if any are missing.
Constraints:
You MUST verify that either the AWS CLI (e.g.,
aws --version) or the AWS MCP server'scall_awstool is availableYou MUST NOT attempt to run the tools during verification
You MUST inform the customer about any missing tools with a clear message
You MUST ask if the customer wants to proceed anyway despite missing tools
You SHOULD recommend executing these operations with short-lived IAM role credentials (an EC2 instance profile, ECS task role, or
aws sts assume-role) rather than long-lived IAM user access keys, since routing-control state changes and zonal shifts can move production traffic between Regions or AZs.
2. Create Routing Controls
Create one routing control per Region to serve as traffic switches.
Constraints:
You MUST inform the customer that you are creating routing controls for cross-Region failover
Routing controls require an existing ARC cluster and control panel (the
cluster_arn/control_panel_arnparameters). If the customer does not already have a cluster, you MUST tell them that creating one (aws route53-recovery-control-config create-cluster) provisions a billed, always-on resource (an hourly per-cluster charge shown in the console at creation), and that they MUST record the cluster's Regional data-plane endpoints (fromdescribe-cluster) and the routing control ARNs somewhere durable, since these are needed to fail over during an event when other APIs may be unavailable.You MUST run the following AWS CLI command (use the AWS MCP server's
call_awstool when connected, otherwise the AWS CLI directly):aws route53-recovery-control-config create-routing-control --cluster-arn {cluster_arn} --routing-control-name {service_name}-{primary_region} --control-panel-arn {control_panel_arn}You MUST repeat for the secondary Region:
aws route53-recovery-control-config create-routing-control --cluster-arn {cluster_arn} --routing-control-name {service_name}-{secondary_region} --control-panel-arn {control_panel_arn}You MUST capture the routing control ARNs from both responses
You MUST inform the customer that routing controls must be wired to Route53 health checks and failover DNS records to affect traffic
3. Create Safety Rules
Add assertion rules to prevent unsafe states (e.g., all Regions off).
Constraints:
You MUST inform the customer that you are creating safety rules to prevent turning off all traffic
You MUST run the following AWS CLI command (use the AWS MCP server's
call_awstool when connected, otherwise the AWS CLI directly):aws route53-recovery-control-config create-safety-rule --assertion-rule '{"Name":"at-least-one-active","ControlPanelArn":"{control_panel_arn}","AssertedControls":["{primary_rc_arn}","{secondary_rc_arn}"],"RuleConfig":{"Type":"ATLEAST","Threshold":1,"Inverted":false},"WaitPeriodMs":5000}'The
--assertion-ruleJSON uses PascalCase keys, andName+ControlPanelArnare fields INSIDE the JSON — there are no separate--name/--control-panel-arnflags for this commandYou MUST explain
WaitPeriodMs(here 5000 = 5s): the propagation/settling delay the data plane enforces before a routing-control state change takes effect, so concurrent updates are evaluated against a consistent rule stateYou MUST NOT create routing controls without safety rules — this risks turning off all traffic
If the customer wants a gating rule, You MUST FIRST create a dedicated approval routing control and capture its ARN as
{approval_control_arn}:aws route53-recovery-control-config create-routing-control --cluster-arn {cluster_arn} --routing-control-name {service_name}-approval --control-panel-arn {control_panel_arn}You SHOULD offer to create a gating rule if the customer wants approval-based failover:
aws route53-recovery-control-config create-safety-rule --gating-rule '{"Name":"require-approval","ControlPanelArn":"{control_panel_arn}","GatingControls":["{approval_control_arn}"],"TargetControls":["{primary_rc_arn}","{secondary_rc_arn}"],"RuleConfig":{"Type":"ATLEAST","Threshold":1,"Inverted":false},"WaitPeriodMs":0}'
4. Test Failover
Demonstrate the failover operation using routing control state changes.
Constraints:
You MUST inform the customer that failover is a safe, reversible operation protected by safety rules
You MUST run the following AWS CLI command (use the AWS MCP server's
call_awstool when connected, otherwise the AWS CLI directly):aws route53-recovery-cluster update-routing-control-states --endpoint-url {cluster_endpoint} --region {endpoint_region} --update-routing-control-state-entries '[{"RoutingControlArn":"{primary_rc_arn}","RoutingControlState":"Off"},{"RoutingControlArn":"{secondary_rc_arn}","RoutingControlState":"On"}]'You MUST explain that both state changes happen atomically in a single API call
You MUST explain that the operation is immediately reversible (swap On/Off values to fail back)
You MUST inform the customer that the data plane (
route53-recovery-cluster) is reached through one of the cluster's Regional data-plane endpoints (distinct from the us-west-2 control-plane endpoint). For resilience during a Regional event, the customer MUST pick one of those endpoints at random and, on any failure (5xx/timeout), retry against the other endpoints in turn — retrying the same endpoint is not sufficient, since the endpoint they reach may itself be in the impaired Region. Recommend hard-coding/bookmarking the endpoints (fromdescribe-cluster) so failover does not depend on a control-plane call that may be unavailable.
5. Configure Zonal Shift (Optional)
Set up manual zonal shift for AZ impairment scenarios.
Constraints:
You MUST only proceed if the customer has a
resource_identifierfor a zonal-shift-supported resource (confirm support withaws arc-zonal-shift get-managed-resource)You MUST inform the customer that zonal shift moves traffic away from an impaired AZ
You MUST run the following AWS CLI command (use the AWS MCP server's
call_awstool when connected, otherwise the AWS CLI directly):aws arc-zonal-shift start-zonal-shift --resource-identifier {resource_identifier} --away-from {availability_zone} --expires-in 1h --comment "{reason}"You SHOULD confirm the resource is registered/managed by ARC first with
aws arc-zonal-shift get-managed-resource --resource-identifier {resource_identifier}(a resource must be active and managed before traffic can be shifted)You MUST inform the customer that zonal shifts expire automatically and must be renewed if the issue persists
6. Configure Zonal Autoshift (Recommended)
Enable automatic traffic shifting when AWS detects AZ impairment.
Constraints:
You MUST inform the customer that zonal autoshift lets AWS automatically shift traffic away from an AZ when AWS detects impairment, and that enabling it is a two-step flow: first create a practice-run configuration, then turn autoshift on.
Step 6a — create the practice-run configuration. You MUST run the following AWS CLI command (use the AWS MCP server's
call_awstool when connected, otherwise the AWS CLI directly):aws arc-zonal-shift create-practice-run-configuration --resource-identifier {resource_identifier} --outcome-alarms '[{"alarmIdentifier":"{outcome_alarm_arn}","type":"CLOUDWATCH"}]' --blocked-windows "{blocked_window}"--outcome-alarmsis REQUIRED: AWS periodically runs a practice run (a real, brief zonal shift) to verify your application actually survives losing one AZ; the outcome alarm fires if the practice run causes problems and AWS rolls the shift back. Practice runs exist specifically to continuously prove you have enough capacity to run on N-1 AZs before a real impairment forces it.--blocked-windowsand--blocking-alarmsgovern the practice runs (not autoshift itself): blocked windows are recurring times when a practice run must NOT start (e.g., deployments, peak traffic), and blocking alarms suppress a practice run while in ALARM. A real, AWS-initiated autoshift during an actual AZ impairment is NOT blocked by these.You MUST add
--blocking-alarms '[{"alarmIdentifier":"{deployment_alarm_arn}","type":"CLOUDWATCH"}]'ONLY if the customer provides adeployment_alarm_arn; otherwise omit the flag entirely.{blocked_window}defaults toMON-08:00-MON-10:00; You SHOULD confirm the customer's actual deployment/peak window(s) and substitute the real value(s) rather than assuming Monday morning.
Step 6b — enable autoshift. You MUST run:
aws arc-zonal-shift update-zonal-autoshift-configuration --resource-identifier {resource_identifier} --zonal-autoshift-status ENABLEDNOTE: there is NO
create-zonal-autoshift-configurationoperation — practice runs use the*-practice-run-configurationoperations and autoshift is toggled withupdate-zonal-autoshift-configuration.
You MUST verify the application can handle the loss of one AZ's worth of capacity — roughly 1/N of total, where N is the number of AZs the resource spans (commonly 3, but confirm with
aws ec2 describe-availability-zonesor the resource's subnet configuration) — before enabling autoshift; this is exactly what the practice runs validate on an ongoing basis.
Examples
# Create routing controls
aws route53-recovery-control-config create-routing-control \
--cluster-arn arn:aws:route53-recovery-control::123456789012:cluster/main \
--routing-control-name checkout-us-east-1 \
--control-panel-arn arn:aws:route53-recovery-control::123456789012:controlpanel/checkout
# Create safety rule (at least one Region active)
aws route53-recovery-control-config create-safety-rule \
--assertion-rule '{"Name":"at-least-one-active","ControlPanelArn":"arn:aws:route53-recovery-control::123456789012:controlpanel/checkout","AssertedControls":["<east-arn>","<west-arn>"],"RuleConfig":{"Type":"ATLEAST","Threshold":1,"Inverted":false},"WaitPeriodMs":5000}'
# Fail over (atomic operation) — target one of the cluster's Regional data-plane endpoints
aws route53-recovery-cluster update-routing-control-states \
--endpoint-url https://<one-of-the-cluster-endpoints> \
--region <endpoint-region> \
--update-routing-control-state-entries '[{"RoutingControlArn":"<east-arn>","RoutingControlState":"Off"},{"RoutingControlArn":"<west-arn>","RoutingControlState":"On"}]'
# Enable zonal autoshift (two steps: practice-run config, then turn autoshift on)
aws arc-zonal-shift create-practice-run-configuration \
--resource-identifier arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/checkout/abc \
--outcome-alarms '[{"alarmIdentifier":"arn:aws:cloudwatch:...","type":"CLOUDWATCH"}]' \
--blocked-windows "MON-08:00-MON-10:00"
aws arc-zonal-shift update-zonal-autoshift-configuration \
--resource-identifier arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/checkout/abc \
--zonal-autoshift-status ENABLEDTroubleshooting
Safety rule blocks routing control update
A safety rule is preventing the state change. You cannot turn off the last active routing control. Turn ON another routing control FIRST, then turn off the one you want. List rules with: aws route53-recovery-control-config list-safety-rules --control-panel-arn {control_panel_arn}
Zonal autoshift practice run fails The outcome alarm fired — the application couldn't handle capacity reduction from losing one AZ. Fix: increase ASG minimum capacity (must handle N-1 AZs), verify cross-zone load balancing is enabled, check for AZ-pinned resources (EBS volumes, placement groups).
Routing control state doesn't affect traffic
Routing controls must be wired to Route53 health checks. Verify: (1) each routing control has an associated health check, (2) Route53 hosted zone has failover records pointing to those health checks. Use aws route53-recovery-control-config describe-routing-control --routing-control-arn {arn} to find the associated health check.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS
- Publisher
- AWS (Official)
- Source
- aws/agent-toolkit-for-aws · skills/specialized-skills/resilience-skills/recovery-controller-setup · commit 0a218f8
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS or AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download recovery-controller-setup.zip