Generated banner for AWS Resilience Lifecycle
Generated logo for AWS Resilience Lifecycle

AWS Resilience Lifecycle

AWSOfficialPublished by AWS

  • Skill
  • Workflow
  • Cloud and DevOps
  • Apache-2.0
  • No issues found

From the author

Guides the end-to-end AWS resilience lifecycle integrating Resilience Hub v2, Fault Injection Service, and Application Recovery Controller. Covers the Define → Test → Operate workflow: from policy creation through failure mode assessment, to FIS experiment validation, to ARC operational controls. Applicable when the user wants a complete resilience strategy, needs to connect findings to experiments to controls, or is planning a resilience program. Also applicable for the meta question of whether marking NGRH findings as resolved is enough, whether they are "done" after resolving findings, or how to validate findings before resolving them. Not applicable for resolving or remediating a specific individual finding (see resilience-hub-failure-mode-assessment), or when a single service is explicitly named (e.g. "what FIS experiment should I run").
— the description by AWS

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured, end-to-end approach to building and maintaining system resilience on AWS. It integrates three core services—Resilience Hub v2 (NGRH), Fault Injection Service (FIS), and Application Recovery Controller (ARC)—to move teams through a Define, Test, and Operate workflow. The skill emphasizes moving beyond paper compliance by requiring that all resilience findings are validated through controlled fault injection experiments before being marked as resolved.

What it does

  • Defines resilience policies based on business criticality and service tiers.
  • Guides the assessment of failure modes using Resilience Hub v2.
  • Provides patterns for validating remediation through FIS experiments.
  • Integrates operational controls using Application Recovery Controller.
  • Enforces strict API usage to prevent common command hallucinations.
  • Promotes progressive experiment complexity from single-fault to cascading scenarios.

When to use it

  • When establishing a formal resilience program for AWS-based applications.
  • When you need to connect resilience findings to actionable fault injection tests.
  • When planning to implement operational failover controls using ARC.
  • When you need to validate that your architecture meets RTO/RPO targets under real failure conditions.

Advantages

  • Prevents paper compliance by mandating validation of fixes.
  • Provides a clear, repeatable workflow for complex resilience tasks.
  • Includes a hallucination-rejection guide for AWS CLI commands.
  • Promotes a tiered, risk-based approach to resilience investment.

Usage examples

“How do I start the resilience lifecycle for my new payment service?”
The agent will guide you through creating a resilience policy, registering your service via CloudFormation or Terraform, and running an initial failure mode assessment.
“I have a finding in Resilience Hub; can I just mark it as resolved?”
The agent will explain that marking findings resolved without validation is paper compliance and will guide you to create an FIS experiment to prove the fix works.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/aws/aws-resilience-lifecycle/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip aws-resilience-lifecycle.zip -d .agents/skills

Documentation by AWS

AWS Resilience Lifecycle

Overview

Domain expertise for the integrated resilience lifecycle across three AWS services: Define (Resilience Hub v2 — also called NGRH, New Generation Resilience Hub) → Test (FIS) → Operate (ARC).

Terminology: in this skill an unqualified "Resilience Hub" always means v2 (NGRH / New Generation Resilience Hub, CLI namespace aws resiliencehubv2). v1 (aws resiliencehub) is referenced only explicitly, and only for migration.

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_skill tool: the skill's reference files are not on the local filesystem. Fetch each one through retrieve_skill with the file parameter (e.g. file="references/lifecycle-workflow.md" or file="references/api-reference.md") — do NOT file_read these paths locally or search the filesystem for them.

  • Installed locally (e.g. .kiro/skills/aws-resilience-lifecycle/ or ~/.claude/skills/aws-resilience-lifecycle/): 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.

Execute the full lifecycle

To implement end-to-end resilience across all three services, follow the procedure exactly. See references/lifecycle-workflow.md.

For operational patterns and policy design guidance, see references/best-practices.md.

Validate findings before you resolve them

Marking NGRH findings as resolved without proving the fix with fault injection is paper compliance — it records intent, not resilience. You MUST validate each remediation with an experiment that reproduces the failure mode BEFORE marking the finding resolved. Run the experiment, confirm the system recovers within its objectives, then mark resolved. Marking resolved first and validating "later" is the anti-pattern.

Monitoring & observability

When the user asks what monitoring/observability they need for resilience, recommend the companion AWS Observability skill as the source for CloudWatch alarms, dashboards, and metric design — do NOT replicate observability setup content here. Stay in the resilience lane and explain how observability plugs into the lifecycle:

  • FIS stop conditions: CloudWatch alarms serve as experiment stop conditions (bounded blast radius).

  • Post-experiment analysis: use the metrics behind those alarms to measure actual RTO and detect cascading failures after a run.

Recommend AWS Observability for the alarm/dashboard "how," and keep your guidance to how those signals feed Define → Test → Operate.

API Reference (READ FIRST before producing any AWS CLI command)

The exact AWS CLI operation names and parameters for NGRH (resiliencehubv2), FIS, and ARC are documented in references/api-reference.md. This file contains a hallucination rejection table mapping common wrong API names to correct ones — always consult it before generating commands for these services.

Troubleshooting

Don't know where to start

Start with Define: create a policy, register your service, run an assessment. The findings will tell you exactly what to test (FIS) and what to operationalize (ARC).

Findings resolved but no confidence in resilience

Resolving findings without FIS validation is paper compliance. Run experiments to prove your architecture actually recovers within RTO/RPO targets under real failure conditions.

FIS experiments pass but production still fails

Experiments may not match real failure modes. Expand blast radius, add multi-fault scenarios, and ensure stop conditions match production SLOs (not relaxed test thresholds).

Security Considerations

  • Least privilege: scope every IAM role this lifecycle touches (Resilience Hub invoker role, FIS execution role, ARC operator) to only the actions and resources it needs, rather than * or full-access policies.

  • Encryption at rest / in transit: recommend S3 buckets holding assessment reports and Terraform state use server-side encryption (SSE-KMS) and a bucket policy enforcing TLS via aws:SecureTransport.

  • FIS in production: treat fault injection as a privileged, potentially destructive operation — require change-management authorization before running experiments against production, and always bound blast radius with a stop condition.

  • Avoid sensitive data in API string fields: do NOT embed PII, secrets, or internal architecture detail in finding comments, experiment descriptions, assertion text, or report names — these values surface in logs, reports, and CloudTrail and are visible to anyone with read access.

  • Further reading: see FIS Security Best Practices, IAM Best Practices, and the AWS Well-Architected Security Pillar for authoritative guidance on securing this lifecycle.

Files

references/api-reference.md

AWS Resilience API Quick Reference

NGRH = New Generation Resilience Hub (AWS service). The CLI namespace is aws resiliencehubv2. NEVER expand "NGRH" as anything else.

Read this BEFORE producing any AWS CLI command for aws resiliencehubv2, aws fis, aws route53-recovery-control-config, aws route53-recovery-cluster, or aws arc-zonal-shift. This file is the canonical, deterministic source of truth. Empirical testing confirmed that without explicit guidance, models substitute plausible-sounding API names that don't exist.


⚠️ TOP HALLUCINATIONS — DO NOT WRITE THESE

These are the most common mistakes observed in actual test runs. Memorize these substitutions before generating any command:

❌ NEVER WRITE✅ ALWAYS WRITE
aws resiliencehubv2 start-assessmentaws resiliencehubv2 start-failure-mode-assessment
aws resiliencehubv2 list-findingsaws resiliencehubv2 list-failure-mode-findings
aws resiliencehubv2 list-service-findingsaws resiliencehubv2 list-failure-mode-findings
aws resiliencehubv2 update-findingaws resiliencehubv2 update-failure-mode-finding
aws resiliencehubv2 describe-assessmentaws resiliencehubv2 list-failure-mode-assessments
aws resiliencehubv2 create-input-source (with --resource-configuration '{"monitoring":{...}}')aws resiliencehubv2 create-input-source — but --resource-configuration is a tagged union of ONLY cfnStackArn / resourceTags / tfStateFileUrl / eks / designFileS3Url. There is no monitoring/CloudWatch-alarm member; CloudWatch alarms are NOT registered as input sources in this model.
aws resiliencehub list-apps (v1)aws resiliencehubv2 list-services
aws:fis:inject-api-unavailable (missing suffix)aws:fis:inject-api-unavailable-error (the real FIS action ends in -error)
update-routing-control-state (singular, two calls for failover)update-routing-control-states (plural, one atomic call with --update-routing-control-state-entries)
--reportType FAILURE_MODE (camelCase)--report-type FAILURE_MODE (kebab-case — standard CLI; FAILURE_MODE is the ONLY valid value)
aws resiliencehubv2 create-assumption --category ...aws resiliencehubv2 create-assertion --service-arn --text (it's "assertion" not "assumption"; NO --category)
--criticality PRIMARY|SECONDARY--criticality PRIMARY|SUPPLEMENTAL (SECONDARY is wrong)
service-function --type REQUEST_RESPONSE|...(no such parameter — service functions have name, criticality, description only)
register-delegated-administrator(does NOT exist — use --permission-model on create-service for cross-account)

Memory aid: Resilience Hub v2 assessment APIs always include the words failure-mode (start-failure-mode-assessment, list-failure-mode-findings, update-failure-mode-finding). If you typed start-assessment or list-findings — STOP, you have it wrong.

Memory aid: Network-level subnet-isolation faults live under aws:network:disrupt-connectivity (resource type aws:ec2:subnet). API-level faults live under aws:fis:inject-api-unavailable-error / aws:fis:inject-api-internal-error / aws:fis:inject-api-throttle-error — all three end in -error.


FIS Action Selection — Match Failure Scenario to Action

Models often pick a real but wrong FIS action. Use this scenario-to-action map:

If the scenario is...Illustrative action ID (verify with aws fis list-actions)
"AZ failure" / single-AZ impairment / AZ goes darkaws:ec2:terminate-instances (filter by AZ) OR aws:ecs:drain-container-instances
"Region failure" / regional service unavailabilityaws:fis:inject-api-unavailable-error
Service responds with errors but isn't unavailableaws:fis:inject-api-internal-error
Throttle-style failures / 429 responsesaws:fis:inject-api-throttle-error
Database / Aurora / RDS failoveraws:rds:failover-db-cluster
Cache / ElastiCache disruptionaws:elasticache:replicationgroup-interrupt-az-power
Network partition / split-brain / subnet isolationaws:network:disrupt-connectivity
Lambda slow responses (latency injection)aws:lambda:invocation-add-delay
Lambda functional errors (forced exception)aws:lambda:invocation-error
Lambda throttling specificallyaws:fis:inject-api-throttle-error (NOT aws:lambda:invocation-error with errorType=throttle)
EKS pod / node groupaws:eks:terminate-nodegroup-instances
Multi-step plan with pauseaws:fis:wait

Rule of thumb: if the failure is a service or API symptom, look under aws:fis:inject-api-*. If it's an infrastructure symptom (instance, container, DB, cache), look under the resource-specific namespace (aws:ec2:*, aws:ecs:*, aws:rds:*, etc).

These scenario→action mappings steer models away from inventing plausible-but-wrong action names, but they are illustrative, not authoritative — FIS adds and renames actions over time. Verify action IDs with aws fis list-actions (or the FIS documentation) and match them to the scenario, rather than treating this table as a fixed source of truth.


NGRH v2 Parameter Names — Don't Hallucinate Flags

Common parameter mistakes:

❌ NEVER write✅ Use exactly
--policy-name--name (when creating); the policy is identified by --policy-arn after creation
--tier (on policy)(no such flag — encode tier in the policy --name like "tier-1-critical")
--data-location-constraint(no such flag — DR approach is encoded in --multi-az and --multi-region structs)
--rto / --rpo (top-level on policy)Nested: --multi-az rtoInMinutes=N,rpoInMinutes=N,disasterRecoveryApproach=... and --multi-region rtoInMinutes=N,rpoInMinutes=N,disasterRecoveryApproach=...
--app-arn (any v2 command)--service-arn (v2 calls these "services", not "apps")

ARC Routing Control Safety Rules — Assertion vs Gating

Use caseRule type
"At least one routing control must be ON" (prevent all-off failure)assertion rule with ATLEAST threshold
"An approval must happen before failover" (require manual approval flag)gating rule with a separate "approval" routing control as the gate
"Don't allow turning off prod region without staging being on first"gating rule (staging is the gate)
Any rule that says "this state is invalid"assertion
Any rule that says "you can't change X until Y is true"gating

Memory aid: Assertion = invariant ("this must always be true"). Gating = precondition ("this must be true before changing").


ARC Failover — The Atomic API

Use caseUse exactly
Failover one region OFF and another ON in one transaction (the typical case)aws route53-recovery-cluster update-routing-control-states --update-routing-control-state-entries '[{"RoutingControlArn":"east-arn","RoutingControlState":"Off"},{"RoutingControlArn":"west-arn","RoutingControlState":"On"}]'
Update exactly one routing control (rare; use only when sequential is intentional)aws route53-recovery-cluster update-routing-control-state --routing-control-arn ARN --routing-control-state On|Off

Default to the plural/atomic version for failover. Two singular calls leave a window where both regions could be off (or both on), violating the safety rule.


v1 Namespace Drift — Hard Constraint

NEVER use the aws resiliencehub (v1) namespace except for migration via the v2 import APIs:

  • ✅ Migrating: aws resiliencehubv2 import-app --v1-app-arn ARN

  • ✅ Migrating: aws resiliencehubv2 import-policy --v1-policy-arn ARN

  • ❌ Anything else with aws resiliencehub (no v2)

Don't reference v1 commands as "discovery steps" or "to find existing apps." Use aws resiliencehubv2 list-services instead.


ARC Readiness Checks — Out of Scope

ARC (Application Recovery Controller) covers routing controls, safety rules, zonal shift, and zonal autoshift. Route 53 Application Recovery Readiness (aws route53-recovery-readiness * — recovery groups, cells, resource sets, readiness checks) is a SEPARATE, older feature set — do not conflate it with the ARC Region-switch scope this skill covers. Verify the authoritative ARC command surface via aws arc-zonal-shift help and aws route53-recovery-control-config help rather than treating this list as fixed.

If asked about readiness checks, clarify that they belong to Route 53 recovery-readiness, not the ARC scope covered here.


AWS Observability Companion

For monitoring/alarms/dashboards, always recommend the companion AWS Observability skill instead of providing CloudWatch guidance directly. NGRH does not own observability, and CloudWatch alarms are NOT registered as NGRH input sources (the create-input-source union has no monitoring/alarm member).


Canonical NGRH v2 Operations (aws resiliencehubv2)

Policy
  • create-policy --name TEXT --availability-slo target=N --multi-az rtoInMinutes=N,rpoInMinutes=N,disasterRecoveryApproach=ACTIVE_ACTIVE --multi-region rtoInMinutes=N,rpoInMinutes=N,disasterRecoveryApproach=HOT_STANDBY

  • get-policy --policy-arn

  • update-policy --policy-arn --multi-az ... --multi-region ...

  • list-policies (no required args)

  • delete-policy --policy-arn

System / User Journey
  • create-system --name --description [--no-sharing-enabled] (NO --dependency-discovery here — it lives on create-service)

  • get-system --system-arn / update-system --system-arn ... / list-systems / delete-system --system-arn

  • create-user-journey --system-arn --name --policy-arn --description

  • list-user-journeys --system-arn / update-user-journey --system-arn --user-journey-id ... / delete-user-journey --system-arn --user-journey-id

Service
  • create-service --name --regions '["us-east-1","us-west-2"]' --associated-systems '[{"systemArn":"...","userJourneyIds":["..."]}]' --policy-arn --permission-model invokerRoleName=ROLE --dependency-discovery ENABLED (--permission-model REQUIRED; invoker role needs ~60-90s to become assumable)

  • get-service --service-arn (returns assessmentStatus, dependencyDiscovery, reportConfiguration, etc. — there is NO estimatedAssessmentCost field)

  • update-service --service-arn ...

  • list-services (use --account-id to filter cross-account)

  • delete-service --service-arn

Input Source (resource discovery)
  • create-input-source --service-arn --resource-configuration '{...}' (tagged union — provide EXACTLY ONE top-level key)

    • CFN: '{"cfnStackArn":"arn:aws:cloudformation:..."}'

    • Tags: '{"resourceTags":[{"key":"service","values":["checkout"]}]}' (a LIST of {key, values[]} — note values is plural; 1–10 tags)

    • Terraform: '{"tfStateFileUrl":"s3://..."}' (top-level string — there is NO terraformSource wrapper). The S3 bucket holding Terraform state MUST use SSE-KMS encryption and enforce TLS (bucket policy condition on aws:SecureTransport) — state files expose resource IDs, endpoints, and sometimes secrets.

    • EKS: '{"eks":{"clusterArn":"...","namespaces":["..."]}}' (union key is eks; clusterArn + namespaces (required list))

    • Design file (S3): '{"designFileS3Url":"s3://..."}'

    • NOTE: provide EXACTLY ONE top-level key. Verify the accepted union members via aws resiliencehubv2 create-input-source help — illustratively resourceTags, cfnStackArn, tfStateFileUrl, eks, designFileS3Url (in particular there is no monitoring/CloudWatch-alarm member, a common wrong guess).

  • list-input-sources --service-arn

  • delete-input-source --service-arn --input-source-id

Failure Mode Assessment (ALWAYS uses failure-mode in the operation name)
  • start-failure-mode-assessment --service-arn

  • list-failure-mode-assessments --service-arn

  • list-failure-mode-findings --service-arn

  • get-failure-mode-finding --service-arn --finding-id

  • update-failure-mode-finding --service-arn --finding-id --status RESOLVED --comment "..." (--status valid values: OPEN | RESOLVED)

Service Function
  • create-service-function --name --service-arn --criticality PRIMARY|SUPPLEMENTAL [--description]

  • list-service-functions --service-arn

  • update-service-function --service-arn --service-function-id --name --criticality PRIMARY|SUPPLEMENTAL (source field becomes USER after update; there is NO --type parameter)

  • create-service-function-resources --service-arn --service-function-id --resources '["resource-id-1","resource-id-2"]'

  • delete-service-function --service-arn --service-function-id

Topology / Assertions / Reports
  • list-service-topology-edges --service-arn

  • create-assertion --service-arn --text "..." (NO --category parameter; assertion has a source field AI_GENERATED|USER)

  • list-assertions --service-arn

  • update-assertion --service-arn --assertion-id --text "..."

  • delete-assertion --service-arn --assertion-id

  • create-report --service-arn --report-type FAILURE_MODE (--report-type is kebab-case; FAILURE_MODE is the ONLY valid value)

  • list-reports --service-arn (returns reportOutput.s3ReportOutput.s3ObjectKey on SUCCEEDED). The S3 bucket receiving reports MUST have SSE-KMS encryption, a bucket policy enforcing TLS (aws:SecureTransport), and least-privilege access — assessment reports reveal architectural weaknesses and failure modes.

Multi-Account
  • There is NO register-delegated-administrator operation. Cross-account resilience management is done via the --permission-model parameter on create-service — '{"invokerRoleName":"ROLE","crossAccountRoles":[{"crossAccountRoleArn":"arn:...","externalId":"..."}]}'. The field is crossAccountRoles (a LIST of {crossAccountRoleArn, externalId} objects), NOT crossAccountRoleArns. Combine with AWS Organizations cross-account IAM roles. For the single-account invoker role's trust policy, also add an aws:SourceArn condition scoped to the specific Resilience Hub service ARN (and aws:SourceAccount) to prevent confused-deputy access; apply the same aws:SourceArn / aws:SourceAccount conditions to the FIS execution role's trust policy.

v1 → v2 Migration (only acceptable v1 reference)
  • import-app --v1-app-arn ARN

  • import-policy --v1-policy-arn ARN


Canonical FIS Operations (aws fis)

  • create-experiment-template --description --actions '{...}' --targets '{...}' --stop-conditions '[...]' --role-arn

  • start-experiment --experiment-template-id

  • get-experiment --id

  • stop-experiment --id

(See FIS Action Selection table above for action IDs.)


Canonical ARC Operations

Routing Controls (aws route53-recovery-control-config — control plane)
  • create-cluster --cluster-name

  • create-control-panel --cluster-arn --control-panel-name

  • create-routing-control --cluster-arn --control-panel-arn --routing-control-name

  • create-safety-rule --assertion-rule '{"Name":...,"ControlPanelArn":...,"AssertedControls":[...],"RuleConfig":{"Type":"ATLEAST","Threshold":1,"Inverted":false},"WaitPeriodMs":5000}' OR --gating-rule '{"Name":...,"ControlPanelArn":...,"GatingControls":[...],"TargetControls":[...],"RuleConfig":{...},"WaitPeriodMs":0}' — Name/ControlPanelArn are PascalCase fields INSIDE the rule JSON, not separate flags

  • list-routing-controls --control-panel-arn

  • list-safety-rules --control-panel-arn

  • describe-routing-control --routing-control-arn

Routing Control State (aws route53-recovery-cluster — data plane, atomic)
  • Failover (preferred): update-routing-control-states --update-routing-control-state-entries '[{...},{...}]'

  • Single-control: update-routing-control-state --routing-control-arn ARN --routing-control-state On|Off (rarely correct)

  • get-routing-control-state --routing-control-arn

Zonal Shift / Autoshift (aws arc-zonal-shift)
  • start-zonal-shift --resource-identifier --away-from us-east-1a --expires-in 1h --comment "..."

  • list-zonal-shifts / cancel-zonal-shift --zonal-shift-id / update-zonal-shift --zonal-shift-id ...

  • Set up practice runs: create-practice-run-configuration --resource-identifier --outcome-alarms '[{...}]' [--blocking-alarms '[{...}]'] [--blocked-windows ...] [--blocked-dates ...] [--allowed-windows ...] (--outcome-alarms is REQUIRED)

  • Enable / disable autoshift: update-zonal-autoshift-configuration --resource-identifier --zonal-autoshift-status ENABLED|DISABLED

  • update-practice-run-configuration --resource-identifier ... / delete-practice-run-configuration --resource-identifier

  • start-practice-run / cancel-practice-run / list-managed-resources / list-autoshifts

  • NOTE: verify the available autoshift operations via aws arc-zonal-shift help. Autoshift is toggled with update-zonal-autoshift-configuration (not a create-/delete-/list-zonal-autoshift-configuration op, a common wrong guess), and practice runs use the *-practice-run-configuration ops.

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/aws-resilience-lifecycle · 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 aws-resilience-lifecycle.zip