AWS Resilience Hub Kiro Powers MCP Disaster Recovery Well-Architected

I built a Kiro power for AWS Resilience Hub. It told me none of my apps would survive a region failure.

Four MCP servers, four skills, one command. The power registered every unregistered workload in my account, ran GenAI failure-mode assessments against all of them, mapped each finding to a Well-Architected best-practice ID, and priced the fix using the live AWS Price List API. The total bill to make everything resilient came to $11.06 a month. The uncomfortable part was working out why I hadn't already paid it.

4Apps assessed
0.4Avg resiliency score / 1.0
10/16Components with Region gap
$11.06Monthly cost to fix all of it
In this post
  1. Why Resilience Hub needed to live in my IDE
  2. What the power actually is: four servers, four skills
  3. Install, onboarding, and the prerequisite gate
  4. The account scan, and the workloads nobody registered
  5. The assessment: where cross-scout broke
  6. Remediation, alarms, and the SOPs I never wrote
  7. Putting a price on it with the pricing MCP
  8. What I got wrong building this
Section 01

Why Resilience Hub needed to live in my IDE

AWS Resilience Hub has been around for years, and the next-generation version that went GA in May 2026 is good: GenAI failure-mode assessments, automatic dependency discovery, RTO/RPO validation against live infrastructure. I'd used it maybe three times. The problem was never the service. It was where the service lives.

The workflow is: leave your editor, open the console, create a resiliency policy, register an application, import resources from a stack, publish a version, run an assessment, wait, read the findings, then translate those findings back into the CloudFormation or Terraform sitting in the tab you left twenty minutes ago. Every one of those steps is a place to stop.

So the findings stayed in the console and my IaC stayed unresilient. I knew what was wrong. I just never did anything about it, because doing something about it meant retyping console output into a template by hand, later, when I had time.

Kiro powers close that distance. A power is a bundle of MCP servers, skills, and steering files you drop into the IDE, after which the agent treats the whole workflow as native capability. So I built one for Resilience Hub. Then, since I had it sitting there, I pointed it at my own AWS account. That turned out to be the part worth writing about.

[ ]
aquavis12/power-aws-resilience-hub
MIT licensed · install via Kiro → Powers → Import from GitHub
Section 02

What the power actually is

It's an umbrella power: four MCP servers, each covering a different part of one question. Is this workload resilient, and what does fixing it cost?

ServerWhat it bringsPackage
aws-mcpEvery AWS API operation: Resilience Hub, ARC, STS, Backup, DRSmcp-proxy-for-aws
aws-docsAuthoritative remediation guidance, console paths, service referencesawslabs.aws-documentation-mcp-server
aws-repostCommunity solutions and known issues from AWS re:Postawslabs.aws-repost-mcp-server
aws-pricingLive Price List API data for costing every recommendationawslabs.aws-pricing-mcp-server

The split matters. aws-mcp tells me a bucket has no cross-Region replication. aws-docs points at the Config rule and the CloudFormation property that fix it, aws-repost surfaces what broke for the people who tried it before me, and aws-pricing puts the number at 43 cents a month. Any one of those on its own just leaves me with homework.

Four skills

assess

Full assessment for a single app: validate, discover dependencies, assess, then report with WAF best-practice IDs.

account-scan

Account-wide multi-region scan. Every registered app, every unregistered workload, one aggregated posture report.

failover

ARC orchestration: zonal shift, routing controls, Region switch. Always gated behind explicit confirmation.

report

Enterprise report from an existing assessment: ARNs, cost-quantified fixes, console URLs, prioritized roadmap.

AWS Resilience Hub power detail page in Kiro alongside the onboarding walkthrough
The power's detail page in Kiro after import, with the agent reading POWER.md and mcp.json to onboard itself. This screenshot is from v3; v4 adds the fourth server, aws-pricing, which is what produces the cost numbers later in this post.

Skills are the part people underrate. An MCP server gives the agent capability. A skill gives it a procedure. Without skills/assess/SKILL.md, asking Kiro to "assess my app" produces a plausible-looking sequence of API calls that skips publishing the app version and then fails at the assessment step. With it, the ordering is fixed and the agent knows what a breached policy actually means.

Repository structure showing skills, steering, and context-templates directories
Repo layout: four skills, three steering files, and context-templates the user owns. The resilience-context folder is what a real project looks like after the templates are filled in.

The three steering files carry the judgment that doesn't belong in a skill: assessment-workflow.md for sequencing, arc-failover.md for the safety rules around moving production traffic, and wa-reliability.md for DR tier selection and mapping findings to Reliability-pillar best practices. The context-templates/ directory is deliberately user-owned. rto-rpo-targets.md is where you write down what the business actually promised, because no API can tell the agent that.

Install

Kiro → Powers panel → Add Custom Power → Import power from GitHub, then paste the repo URL. Kiro reads plugin.json and mcp.json and wires up all four servers. It activates on keywords like resilience, RTO, RPO, failover, disaster recovery, assessment, backup, pricing, cost, report.

Section 03

Onboarding and the prerequisite gate

Three prerequisites, and the power checks all of them before it touches anything: AWS CLI 2.32.0 or newer, uvx installed (the MCP servers launch through it), and an active AWS session.

prerequisite checks
uvx --version
aws --version
aws sts get-caller-identity
aws resiliencehub list-apps --region us-east-1
Terminal output verifying uvx, AWS CLI version, caller identity, and Resilience Hub reachability
Prerequisite gate passing: uvx v0.8.17, AWS CLI v2.35.3, active session, and Resilience Hub responding. Account ID redacted. Note the agent flagging that I was on root credentials.

I ran this on root credentials because it was my own sandbox account, and the steering caught it and told me to use a scoped IAM role with Resilience Hub and ARC read permissions instead. Fair enough. I've since fixed it. I'm leaving the screenshot in because the power flags this rather than quietly carrying on, and "quick test on root" is how bad habits end up in production accounts.

Section 04

The account scan, and the workloads nobody registered

The account-scan skill exists because of a failure mode I've hit repeatedly: Resilience Hub only assesses applications you've registered, and the applications you've registered are the ones you were already worried about. The ones that quietly matter never get added.

Resource scan output for us-east-1 showing compute, storage, and other service inventory
Full resource inventory for us-east-1 before any assessment: nine Lambda functions, zero EC2, plus the S3, DynamoDB, SNS, EventBridge and API Gateway resources enumerated below the fold.

The scan found one registered app and three CloudFormation-based workloads that had never been near Resilience Hub. So the agent registered them, which is a five-step sequence per app that I would absolutely have gotten wrong by hand.

Kiro registering three unregistered CloudFormation workloads and creating resiliency policies
Registering AIOPS, repost-scout, and my-cfp-backend: policy creation, app creation, resource import from the CFN stack, version publish, then assessment. Policy ARNs partially redacted.
The step everyone forgets

You must publish an app version between importing resources and running an assessment. Skip it and the assessment fails against an empty draft with an error that doesn't obviously point at the cause. This ordering is pinned in the steering file precisely because I got it wrong the first time by hand.

Section 05

The assessment: where cross-scout broke

Let me walk through one app in full rather than skim four. cross-scout is a small serverless app: one Lambda, one S3 bucket, one SNS topic, EventBridge on a schedule. The kind of thing you deploy in an afternoon and never think about again. Its policy targets 4 hours RTO and 1 hour RPO at the Region level.

Assessment results for cross-scout showing compliance by disruption type with Region and Software breached
Resiliency score 0.4/1.0. AZ and Hardware disruptions clear comfortably. Software misses by 12 minutes. Region is the one that matters.

Read that Region row again. Target RTO 4 hours, assessed RTO 30 days. Thirty days is Resilience Hub's way of writing "never." There is no recovery path. If us-east-1 goes down, that workload is offline until I rebuild it by hand.

What I found useful is that the assessment doesn't stop at the app level. It attributes the breach to specific components:

Per-component findings table for cross-scout with per-disruption-type status and remediation mapped to WAF best practices
Component-level breakdown. The Lambda is fine across every disruption type because it's stateless. The bucket and the topic are the whole problem, and each finding lands on a specific WAF Reliability best practice.

The four findings, in the order they'd hurt:

That last one is the finding I care most about. A missing DLQ never comes up in a DR conversation, because it isn't a DR problem. It loses data on an ordinary Tuesday, quietly, and the only reason I saw it at all is that the assessment scores each disruption type separately instead of collapsing everything into one number.

Where the docs and re:Post servers earn their place

A finding like "enable cross-Region replication" is where most tools stop. Here the agent turns around and searches AWS documentation for each recommendation, so the fix arrives with the Config rule that enforces it and the CloudFormation property that implements it.

Documentation search results enriching the S3 cross-region replication recommendation
The aws-docs server resolving the S3 CRR recommendation to the exact Config managed rules, s3-bucket-replication-enabled and s3-bucket-cross-region-replication-enabled, with a CloudFormation template reference.
Section 06

Remediation, alarms, and the SOPs I never wrote

The report skill converts findings into an ordered set of changes. Region-level items come first because those are the ones with no recovery path at all.

Must-implement Region resilience recommendations and observability gaps listing twelve missing alarms
Four must-implement Region items, each tied to a component and a WAF best-practice ID, then twelve missing CloudWatch alarms for a three-component app.

Twelve missing alarms on a three-resource app is the number that embarrassed me. Twelve isn't a lot. The problem is that the right number was never zero, and I'd never once stopped to ask. S3 4xx/5xx, request latency, Lambda errors and throttles, memory and duration anomalies, SNS delivery failures, canaries in-region and cross-region. Obvious in hindsight. None of them existed.

Recommended SOPs and prioritized next steps from the assessment
Six recommended SOPs plus prioritized next steps. The last item is the one that matters most: fill in the real business tier in rto-rpo-targets.md, because the agent shouldn't be guessing at your targets.

The SOP recommendations are runbooks: S3 object version restore, Lambda concurrency and memory adjustment, provisioned concurrency changes, alias version switching. Across the account there were 34 recommended SOPs and I had written zero of them. Recovery procedures I'd have been inventing at 3am with an outage running.

Section 07

Putting a price on it

This is why v4 added the pricing MCP. Every resilience conversation I've had eventually stalls on the same question: what does this cost? Without a number, "enable cross-Region replication" loses to a feature ticket every time. So the report now prices each recommendation against the live Price List API, unit rate × quantity = monthly total.

First, the account-wide picture across all four apps:

MetricValue
Total apps assessed4
Policy compliant0
Average resiliency score0.4 / 1.0
Total components assessed16
Components with a Region gap10
Components with a Software gap7
Missing CloudWatch alarms86
Missing SOPs34
Critical finding

Every application in the account had zero cross-Region disaster recovery for its stateful data stores, S3 buckets and DynamoDB tables alike. A us-east-1 regional failure meant unrecoverable data loss across all four workloads, with nothing to fall back on.

Then the cost to close all of it:

ApplicationMonthlyAnnual
AIOPS$4.59$55.08
cross-scout$1.64$19.68
my-cfp-backend$2.26$27.12
repost-scout$2.57$30.84
Total — all four apps$11.06$132.72

Eleven dollars a month. That number is low for reasons worth being honest about, and the report says so itself: my data volumes are tiny (every DynamoDB table under 1 GB), and several of the highest-value fixes are free features I simply hadn't turned on.

FixUnit priceNotes
S3 versioningFreeAPI feature; you pay only for version storage
Lambda versioning + aliasesFreeBuilt-in; turns a 30-min rebuild into an alias swap
SQS dead-letter queuesFreeWithin the first 1M requests/month
DynamoDB PITR$0.20per GB-month of continuous backup
DynamoDB Global Tables$0.625per million replicated write units (on-demand)
S3 CRR$0.023 + $0.02destination storage per GB-month + transfer per GB
CloudWatch standard alarm$0.10per alarm per month

Three of my top-priority fixes cost nothing at all. The biggest line item across the whole account was CloudWatch alarms, $8.60/month for all 86 of them, which means observability outspent replication. At production scale, say 100 GB per data store, the report projects $50-80/month. Still not a number worth losing an argument over.

The systemic view

Aggregating four apps surfaced something a single assessment can't: the same eight root causes repeating.

#IssueApps affectedRoot cause
1DynamoDB tables have no recovery3 of 4PITR disabled, no Global Tables
2S3 buckets have no cross-Region protection2 of 4No CRR, no cross-Region Backup
3S3 buckets without versioningAIOPS (3 buckets)Never enabled
4SNS topics are single-Region2 of 4No multi-Region fanout
5Lambda functions lack DLQsAllFailed invocations silently dropped
6Lambda functions lack versioningAll30-min rebuild vs instant alias swap
7Zero CloudWatch alarmsAllNo automated failure detection
8Zero SOPs documentedAllNo runbooks for recovery

Rows 5 through 8 hit every app. Four separate oversights would be bad luck. One habit repeated four times is what this actually is: I deploy stateless compute carefully and treat everything around it as an afterthought. No single-app assessment would have shown me that.

Section 08

What I got wrong building this

v1 had one MCP server and it wasn't enoughRaw API access produces findings, not decisions. "Enable CRR" is a to-do. "Enable CRR, here's the Config rule, here's the CFN property, here's the known issue on re:Post, it costs $0.43/month" is a change I'll actually make that afternoon. Three of the four servers exist to close that gap.
Tag filters silently shrink your scopeRegistering an app by tag filter quietly excludes anything untagged, and the assessment then passes on a subset while looking like it covered everything. The power now cross-references assessment scope against live infrastructure and flags what got missed.
"Stateless" is sometimes a false positiveResilience Hub occasionally classifies clearly stateful workloads as stateless, which inflates the score. The report skill flags that classification for review rather than trusting it — a confidently wrong 0.9 is worse than an honest 0.4.
Failover needs a hard gate, not a warningARC routing controls and zonal shift move production traffic. The steering makes these read-only by default and requires explicit confirmation, and recovery always goes through the data plane rather than the control plane. That's REL11-BP04, which exists because the control plane is exactly what's impaired during a regional event.
Some context can't be discoveredNo API knows your business RTO. That's why context-templates ships with rto-rpo-targets.md as a file you own. Every assessment I ran used inferred targets, and the report's own closing recommendation was to go fill in the real ones.

So: I built this expecting to make an existing service more convenient. What it did instead was tell me my whole account sat one region away from unrecoverable. Four apps, sixteen components, ten with no regional recovery path, for eleven dollars a month I hadn't spent because nothing had ever put the number in front of me.

The findings weren't new information. Resilience Hub could have told me all of this two years ago. The difference is that this time the finding arrived in the same window as the CloudFormation that caused it, priced, with the best-practice ID attached. That's the only thing that changed, and it was enough.

[ ]
github.com/aquavis12/power-aws-resilience-hub
Four MCP servers, four skills, three steering files. MIT. Fork it and point it at your own account.

If you run this against your own account, I'd like to know what your Region row says. My guess is you already know and haven't looked.