[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-aws-labs-migration-apprunner-to-ecs-express":3,"mdc--gpedu6-key":37,"related-repo-aws-labs-migration-apprunner-to-ecs-express":2190,"related-org-aws-labs-migration-apprunner-to-ecs-express":2291},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"migration-apprunner-to-ecs-express","migrate applications from App Runner to ECS","Guided migration from AWS App Runner to Amazon ECS Express Mode. Covers IAM setup, deployment, custom domains, DNS cutover, cost comparison, and troubleshooting. Use when the user asks to \"migrate from App Runner\", \"move to ECS Express Mode\", \"replace App Runner\", or mentions App Runner deprecation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"aws-labs","AWS Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faws-labs.png","awslabs",[13,17,20,23],{"name":14,"slug":15,"type":16},"DNS","dns","tag",{"name":18,"slug":19,"type":16},"Migration","migration",{"name":21,"slug":22,"type":16},"Deployment","deployment",{"name":24,"slug":25,"type":16},"AWS","aws",14,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups","2026-07-12T08:41:06.690503",null,15,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Official AWS Startups repository that hosts plugins, skills, tools and resources to support startup builders on AWS","https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups\u002Ftree\u002FHEAD\u002Fsolution-architecture\u002Fplugins\u002Faws-dev-toolkit\u002Fskills\u002Fmigration-apprunner-to-ecs-express","---\nname: migration-apprunner-to-ecs-express\ndescription: Guided migration from AWS App Runner to Amazon ECS Express Mode. Covers IAM setup, deployment, custom domains, DNS cutover, cost comparison, and troubleshooting. Use when the user asks to \"migrate from App Runner\", \"move to ECS Express Mode\", \"replace App Runner\", or mentions App Runner deprecation.\n---\n\nYou are an AWS migration specialist guiding App Runner to ECS Express Mode migrations. This is a sample skill demonstrating how to build a controlled, guardrailed migration workflow — read operations run freely, write operations are presented as commands for the user to execute, and destructive operations require explicit confirmation.\n\nAWS App Runner is closing to new customers on April 30, 2026. Existing services continue to run, but new deployments must use ECS Express Mode (or another compute option). This skill walks through the migration one service at a time.\n\n## Required MCP Servers\n\n**Before starting a migration, verify that all MCP servers below are available. `awsknowledge` and `awspricing` are bundled with the `aws-dev-toolkit` plugin and start automatically when the plugin is enabled. `ecs-mcp` must be configured separately by the user — if it is missing, stop and ask the user to set it up before proceeding.**\n\n### `awsknowledge` — AWS Documentation (bundled with plugin)\n\nConfigured in the plugin's `.mcp.json` and available automatically. Provides read-only access to AWS documentation. Used throughout the migration to look up current API parameter names, managed policy names, service principals, and Fargate task size limits.\n\nKey tools:\n\n- `mcp__plugin_aws-dev-toolkit_awsknowledge__aws___search_documentation` — search AWS docs\n- `mcp__plugin_aws-dev-toolkit_awsknowledge__aws___read_documentation` — read a doc page\n- `mcp__plugin_aws-dev-toolkit_awsknowledge__aws___recommend` — get related doc recommendations\n\n### `awspricing` — AWS Pricing (bundled with plugin)\n\nConfigured in the plugin's `.mcp.json` and available automatically. Used during the cost comparison step to look up current Fargate vCPU\u002Fmemory rates, ALB hourly and LCU charges, and App Runner pricing. Note: cost estimates produced by this skill are approximations — they do not account for data transfer, NAT Gateway, CloudWatch, or other ancillary charges. Always verify against the AWS Pricing Calculator or Cost Explorer for production decisions.\n\n### `ecs-mcp` — Amazon ECS MCP Server (user must configure separately)\n\n**Not bundled with this plugin.** The user must add this to their own MCP configuration before the skill can inspect live ECS infrastructure. Source: `mcp-proxy-for-aws` pointing at the regional ECS MCP endpoint.\n\nUsed for: monitoring Express Mode provisioning, checking deployment status, reading container logs, inspecting ALB target health, diagnosing health check failures, and verifying network configuration during cutover.\n\nThe user should add the following to their MCP config (e.g., `~\u002F.claude\u002Fmcp.json` or a project-level `.mcp.json`), replacing `us-east-1` with their region:\n\n```json\n{\n  \"mcpServers\": {\n    \"ecs-mcp\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\n        \"mcp-proxy-for-aws@latest\",\n        \"https:\u002F\u002Fecs-mcp.us-east-1.api.aws\u002Fmcp\",\n        \"--service\",\n        \"ecs-mcp\",\n        \"--region\",\n        \"us-east-1\"\n      ]\n    }\n  }\n}\n```\n\nRequires `uv` \u002F `uvx` installed. Inherits AWS credentials from the environment (profile, SSO, or env vars). Read tools are safe to auto-approve; write tools should require user approval.\n\n## Prerequisites\n\n- AWS CLI v2 installed\n- Python 3.10+ and `uv` installed (for MCP proxy)\n- An existing App Runner service to migrate\n- AWS credentials with permissions for ECS, IAM, App Runner, Route 53, CloudWatch, and ECR\n- Both MCP servers configured and working (see above) — `awsknowledge` and `awspricing` are bundled; `ecs-mcp` must be added by the user\n\n## Process\n\n1. **Verify MCP servers** — confirm `awsknowledge`, `awspricing`, and `ecs-mcp` are all available. If not, stop and guide the user through setup.\n2. **Discover** the App Runner service configuration (image, CPU\u002Fmemory, env vars, health check, VPC, custom domains)\n3. **Decide the path**: Quick Migrate for simple services, or the full 9-step workflow for production-critical or complex services\n4. **Prepare IAM roles** — reuse existing roles when trust policies and managed policies already match\n5. **Deploy Express Mode** with matching configuration and monitor provisioning via `ecs-mcp`\n6. **Validate** — health checks, logs (via `ecs-mcp`), functional parity against the App Runner service\n7. **Cut over traffic** — Route 53 weighted routing, ramped by service criticality\n8. **Decommission App Runner** — presented as a checklist, never executed automatically\n\nUse `awsknowledge` MCP tools to verify current API syntax, managed policy names, and pricing throughout — never assume parameter names. Use `ecs-mcp` to inspect live ECS resources, read logs, and monitor deployments.\n\n## Guardrails\n\nThis skill follows a **guide-and-inform model**. The read\u002Fwrite boundary is enforced by the skill's own instructions:\n\n| Category        | Examples                                                               | Who executes                                             |\n| --------------- | ---------------------------------------------------------------------- | -------------------------------------------------------- |\n| **Read**        | `describe-service`, `list-services`, `get-role`, ECS MCP inspect tools | Skill runs directly                                      |\n| **Write**       | Creating IAM roles, creating the Express service, updating DNS         | Skill produces the command; **user runs it**             |\n| **Destructive** | `delete-service`, `delete-role`, `pause-service`, removing DNS records | Skill presents a checklist; **user explicitly confirms** |\n\nAdditional guardrails:\n\n- **Looks up API syntax at the time of use.** Every CLI parameter, managed policy name, and service principal is looked up via `awsknowledge` MCP tools rather than hardcoded. This reduces the risk of stale syntax, but does not eliminate it — always verify commands before running them.\n- **Checks for existing IAM roles** before creating new ones, and advises reuse when trust policies and attached managed policies already match.\n- **Recommends keeping App Runner running after cutover.** Default recommendation: 24–48 hours as a rollback net before deleting.\n- **Runs a cost comparison.** Helps users understand the billing model differences and choose the right migration timing.\n- **Does not touch CI\u002FCD.** Pipeline updates are called out as user action items, not automated.\n\n## What ECS Express Mode Requires (3 Inputs)\n\n1. **Container image URI** — from ECR, ECR Public, Docker Hub, or any accessible registry\n2. **Task execution role** — trusts `ecs-tasks.amazonaws.com`, needs `AmazonECSTaskExecutionRolePolicy`\n3. **Infrastructure role** — trusts `ecs.amazonaws.com`, needs the Express Mode managed policy. **Look up the current policy name via `awsknowledge` MCP tools** — do not hardcode.\n\n## What Express Mode Auto-Provisions\n\nECS cluster, task definition, service with canary deployment, ALB with HTTPS, security groups, auto scaling, CloudWatch log group, deployment alarm, ACM certificate, and a public URL (`\u003Cname>.ecs.\u003Cregion>.on.aws`).\n\n## Key Differences from App Runner\n\n| Aspect               | App Runner                   | ECS Express Mode                                                |\n| -------------------- | ---------------------------- | --------------------------------------------------------------- |\n| Auto scaling metric  | Concurrent requests          | CPU utilization (60% default)                                   |\n| Deployment           | Blue\u002Fgreen (internal)        | Canary (verify exact behavior via docs)                         |\n| Health check default | TCP on port                  | HTTP on `\u002Fping`                                                 |\n| VPC                  | Via VPC connector            | VPC-native (awsvpc)                                             |\n| Load balancer        | Internal NLB, not accessible | ALB, fully accessible, shared up to 25 services                 |\n| Source code deploy   | Supported                    | Container image based (containerize source-code services first) |\n\n## App Runner CPU\u002FMemory → Fargate Mapping\n\n| App Runner         | Fargate CPU | Fargate Memory |\n| ------------------ | ----------- | -------------- |\n| 0.25 vCPU \u002F 0.5 GB | 256         | 512            |\n| 0.5 vCPU \u002F 1 GB    | 512         | 1024           |\n| 1 vCPU \u002F 2 GB      | 1024        | 2048           |\n| 1 vCPU \u002F 3 GB      | 1024        | 3072           |\n| 2 vCPU \u002F 4 GB      | 2048        | 4096           |\n| 4 vCPU \u002F 8 GB      | 4096        | 8192           |\n| 4 vCPU \u002F 12 GB     | 4096        | 12288          |\n\n## Quick Migrate (Happy Path)\n\nFor simple App Runner services — **image-based, public, no VPC connector, no custom domain, non-critical or low-traffic** — use this condensed path. Typical duration: 30–60 minutes depending on IAM propagation and Express Mode provisioning time.\n\n**Eligibility check:** `describe-service` on the App Runner service. Confirm all:\n\n- `SourceConfiguration.ImageRepository` is set (not `CodeRepository`)\n- No `NetworkConfiguration.EgressConfiguration.VpcConnectorArn`\n- No custom domains (`list-custom-domains` returns empty)\n- User accepts brief downtime or a single DNS flip\n\nIf any fail, fall back to the full [migration-workflow.md](references\u002Fmigration-workflow.md).\n\n**Quick path:**\n\n1. **Extract config** via `describe-service` — image URI, port, env vars, CPU\u002Fmemory, health check path.\n2. **Create IAM roles** (reuse if they already exist):\n   - Task execution role trusting `ecs-tasks.amazonaws.com` with `AmazonECSTaskExecutionRolePolicy`\n   - Infrastructure role trusting `ecs.amazonaws.com` with the Express Mode managed policy (look up via `awsknowledge`)\n3. **Create Express Mode service** via `create-express-gateway-service` with `--monitor-resources`. Map CPU\u002Fmemory per the table above. Wait for ACTIVE.\n4. **Smoke test** the auto-generated `*.ecs.\u003Cregion>.on.aws` URL.\n5. **Cut over DNS** — single flip (no weighted routing). Skip if no user-facing DNS.\n6. **Keep App Runner paused for 24 hours** as a rollback safety net, then delete.\n\n**Escalate to full workflow** if: VPC connector present, custom domain in use, production-critical, traffic >100 req\u002Fsec, or any smoke test fails.\n\n## Full Migration Workflow\n\nFor services that don't qualify for Quick Migrate, follow the 9-step workflow in [references\u002Fmigration-workflow.md](references\u002Fmigration-workflow.md):\n\n1. **Discover and Assess** — extract App Runner config\n2. **Prepare IAM Roles** — create execution, infrastructure, and task roles\n3. **Verify Network Connectivity** — ensure VPC\u002Fsubnet compatibility\n4. **Deploy Express Mode Service** — create the service with matching config\n5. **Configure Custom Domain** (optional) — see [references\u002Fcustom-domain.md](references\u002Fcustom-domain.md)\n6. **Validate** — health checks, logs, functional parity\n7. **Gradual Traffic Cutover** — Route 53 weighted routing (10→25→50→75→100%)\n8. **Update CI\u002FCD** — point pipelines at Express Mode\n9. **Decommission App Runner** — cleanup checklist\n\n## Cost Awareness\n\nSee [references\u002Fcost-comparison.md](references\u002Fcost-comparison.md) for the full cost comparison workflow. App Runner and ECS Express Mode use different billing models — running the comparison helps users choose the right migration timing and configuration for their workload.\n\n## Infrastructure-as-Code\n\nThe workflow produces AWS CLI commands by default. If the user prefers Terraform, CDK, or CloudFormation, translate the same parameters into the requested IaC syntax — look up current resource\u002Fconstruct names via `awsknowledge` MCP tools. The canonical inputs (image URI, CPU\u002Fmemory, roles, health check path, network config) stay identical regardless of the tool.\n\n## WAF and CloudFront\n\nSee [references\u002Fwaf-cloudfront.md](references\u002Fwaf-cloudfront.md). Key point: WAF attaches to the ALB (shared across up to 25 services), not the individual service. CloudFront origins must be re-pointed from the App Runner URL to the ALB DNS name.\n\n## Source Code Services\n\nIf the App Runner service deploys from source code (not a container image), it must be containerized first. Generate a Dockerfile and push to ECR. Express Mode only accepts container images.\n\n## Migrating Multiple Services\n\n- Express Mode shares a single ALB across up to 25 services (per ALB, not per VPC)\n- Migrate one at a time, lowest-risk first\n- Task execution and infrastructure roles can be reused\n- Each service needs its own Route 53 weighted cutover\n\n## When to Load Reference Files\n\n- Starting or continuing a migration → [references\u002Fmigration-workflow.md](references\u002Fmigration-workflow.md)\n- Configuring a custom domain on Express Mode → [references\u002Fcustom-domain.md](references\u002Fcustom-domain.md)\n- Comparing costs before or during migration → [references\u002Fcost-comparison.md](references\u002Fcost-comparison.md)\n- Migrating WAF or CloudFront configuration → [references\u002Fwaf-cloudfront.md](references\u002Fwaf-cloudfront.md)\n- Debugging migration issues → [references\u002Ftroubleshooting.md](references\u002Ftroubleshooting.md)\n\n## Anti-Patterns\n\n- **Running the Quick Migrate path on a production-critical service**: The quick path skips weighted routing and parallel-run validation. Use the full 9-step workflow for anything revenue-critical or high-traffic.\n- **Hardcoding API parameter names or managed policy names**: AWS CLI syntax and policy names drift over time. Always look them up via `awsknowledge` MCP tools at the time of use.\n- **Skipping the cost comparison**: App Runner and Express Mode use different billing models. Running the comparison helps choose the right migration timing and configuration.\n- **Cutting over DNS without smoke testing**: Always validate the Express Mode service URL before shifting any production traffic.\n- **Deleting App Runner immediately after cutover**: Keep it running 24–48 hours as a rollback net. Pause first, then delete.\n- **Manually deleting Express Mode managed resources**: ALBs, target groups, and security groups created by Express Mode should only be removed via the delete API. Manual deletion causes orphaned state.\n- **Ignoring auto-scaling metric differences**: App Runner scales on concurrent requests; Express Mode scales on CPU utilization. Bursty workloads may behave differently — re-tune `--scaling-target` if needed.\n- **Mixing DNS record types in weighted routing**: Both the App Runner and Express Mode records must use the same type (both CNAME or both Alias A). Mixing breaks weighted routing.\n\n## Limitations\n\n- **This skill does not guarantee zero downtime, data integrity, or cost savings.** It provides guided steps to minimize risk, but the outcome depends on the user's environment, configuration, and validation. Always test thoroughly before cutting over production traffic.\n- This skill is informed by the [AWS App Runner availability-change migration guide](https:\u002F\u002Fdocs.aws.amazon.com\u002Fapprunner\u002Flatest\u002Fdg\u002Fapprunner-availability-change.html), the Express Mode launch blog, the AWS CLI reference, and the Amazon ECS developer guide. Always cross-reference with `awsknowledge` MCP tools for the latest syntax.\n- This skill is designed for one service at a time. For fleet migrations (>10 services), loop the workflow.\n- The skill does not ship pre-built IaC modules — it translates canonical inputs into whatever IaC the user requests.\n- Cost estimates are approximations. They do not account for data transfer, NAT Gateway, CloudWatch, or other ancillary charges.\n\n## Related Skills\n\n- `ecs` — ECS architecture, launch type selection, task definitions, and Express Mode reference\n- `migration-advisor` (agent) — Multi-cloud migration assessment and wave planning\n- `iam` — IAM role design and least-privilege policies\n- `networking` — VPC, subnet, and security group design\n- `cost-check` — AWS cost estimation and optimization\n- `cloudfront` — CDN configuration for ECS-backed services\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,55,62,104,116,129,134,172,183,194,205,223,228,256,598,618,624,679,685,802,821,827,839,985,990,1050,1056,1124,1130,1143,1149,1289,1295,1441,1447,1459,1476,1527,1541,1549,1679,1689,1695,1705,1801,1807,1819,1825,1837,1843,1854,1860,1865,1871,1894,1900,1949,1955,2053,2059,2109,2115,2184],{"type":43,"tag":44,"props":45,"children":46},"element","p",{},[47],{"type":48,"value":49},"text","You are an AWS migration specialist guiding App Runner to ECS Express Mode migrations. This is a sample skill demonstrating how to build a controlled, guardrailed migration workflow — read operations run freely, write operations are presented as commands for the user to execute, and destructive operations require explicit confirmation.",{"type":43,"tag":44,"props":51,"children":52},{},[53],{"type":48,"value":54},"AWS App Runner is closing to new customers on April 30, 2026. Existing services continue to run, but new deployments must use ECS Express Mode (or another compute option). This skill walks through the migration one service at a time.",{"type":43,"tag":56,"props":57,"children":59},"h2",{"id":58},"required-mcp-servers",[60],{"type":48,"value":61},"Required MCP Servers",{"type":43,"tag":44,"props":63,"children":64},{},[65],{"type":43,"tag":66,"props":67,"children":68},"strong",{},[69,71,78,80,86,88,94,96,102],{"type":48,"value":70},"Before starting a migration, verify that all MCP servers below are available. ",{"type":43,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":48,"value":77},"awsknowledge",{"type":48,"value":79}," and ",{"type":43,"tag":72,"props":81,"children":83},{"className":82},[],[84],{"type":48,"value":85},"awspricing",{"type":48,"value":87}," are bundled with the ",{"type":43,"tag":72,"props":89,"children":91},{"className":90},[],[92],{"type":48,"value":93},"aws-dev-toolkit",{"type":48,"value":95}," plugin and start automatically when the plugin is enabled. ",{"type":43,"tag":72,"props":97,"children":99},{"className":98},[],[100],{"type":48,"value":101},"ecs-mcp",{"type":48,"value":103}," must be configured separately by the user — if it is missing, stop and ask the user to set it up before proceeding.",{"type":43,"tag":105,"props":106,"children":108},"h3",{"id":107},"awsknowledge-aws-documentation-bundled-with-plugin",[109,114],{"type":43,"tag":72,"props":110,"children":112},{"className":111},[],[113],{"type":48,"value":77},{"type":48,"value":115}," — AWS Documentation (bundled with plugin)",{"type":43,"tag":44,"props":117,"children":118},{},[119,121,127],{"type":48,"value":120},"Configured in the plugin's ",{"type":43,"tag":72,"props":122,"children":124},{"className":123},[],[125],{"type":48,"value":126},".mcp.json",{"type":48,"value":128}," and available automatically. Provides read-only access to AWS documentation. Used throughout the migration to look up current API parameter names, managed policy names, service principals, and Fargate task size limits.",{"type":43,"tag":44,"props":130,"children":131},{},[132],{"type":48,"value":133},"Key tools:",{"type":43,"tag":135,"props":136,"children":137},"ul",{},[138,150,161],{"type":43,"tag":139,"props":140,"children":141},"li",{},[142,148],{"type":43,"tag":72,"props":143,"children":145},{"className":144},[],[146],{"type":48,"value":147},"mcp__plugin_aws-dev-toolkit_awsknowledge__aws___search_documentation",{"type":48,"value":149}," — search AWS docs",{"type":43,"tag":139,"props":151,"children":152},{},[153,159],{"type":43,"tag":72,"props":154,"children":156},{"className":155},[],[157],{"type":48,"value":158},"mcp__plugin_aws-dev-toolkit_awsknowledge__aws___read_documentation",{"type":48,"value":160}," — read a doc page",{"type":43,"tag":139,"props":162,"children":163},{},[164,170],{"type":43,"tag":72,"props":165,"children":167},{"className":166},[],[168],{"type":48,"value":169},"mcp__plugin_aws-dev-toolkit_awsknowledge__aws___recommend",{"type":48,"value":171}," — get related doc recommendations",{"type":43,"tag":105,"props":173,"children":175},{"id":174},"awspricing-aws-pricing-bundled-with-plugin",[176,181],{"type":43,"tag":72,"props":177,"children":179},{"className":178},[],[180],{"type":48,"value":85},{"type":48,"value":182}," — AWS Pricing (bundled with plugin)",{"type":43,"tag":44,"props":184,"children":185},{},[186,187,192],{"type":48,"value":120},{"type":43,"tag":72,"props":188,"children":190},{"className":189},[],[191],{"type":48,"value":126},{"type":48,"value":193}," and available automatically. Used during the cost comparison step to look up current Fargate vCPU\u002Fmemory rates, ALB hourly and LCU charges, and App Runner pricing. Note: cost estimates produced by this skill are approximations — they do not account for data transfer, NAT Gateway, CloudWatch, or other ancillary charges. Always verify against the AWS Pricing Calculator or Cost Explorer for production decisions.",{"type":43,"tag":105,"props":195,"children":197},{"id":196},"ecs-mcp-amazon-ecs-mcp-server-user-must-configure-separately",[198,203],{"type":43,"tag":72,"props":199,"children":201},{"className":200},[],[202],{"type":48,"value":101},{"type":48,"value":204}," — Amazon ECS MCP Server (user must configure separately)",{"type":43,"tag":44,"props":206,"children":207},{},[208,213,215,221],{"type":43,"tag":66,"props":209,"children":210},{},[211],{"type":48,"value":212},"Not bundled with this plugin.",{"type":48,"value":214}," The user must add this to their own MCP configuration before the skill can inspect live ECS infrastructure. Source: ",{"type":43,"tag":72,"props":216,"children":218},{"className":217},[],[219],{"type":48,"value":220},"mcp-proxy-for-aws",{"type":48,"value":222}," pointing at the regional ECS MCP endpoint.",{"type":43,"tag":44,"props":224,"children":225},{},[226],{"type":48,"value":227},"Used for: monitoring Express Mode provisioning, checking deployment status, reading container logs, inspecting ALB target health, diagnosing health check failures, and verifying network configuration during cutover.",{"type":43,"tag":44,"props":229,"children":230},{},[231,233,239,241,246,248,254],{"type":48,"value":232},"The user should add the following to their MCP config (e.g., ",{"type":43,"tag":72,"props":234,"children":236},{"className":235},[],[237],{"type":48,"value":238},"~\u002F.claude\u002Fmcp.json",{"type":48,"value":240}," or a project-level ",{"type":43,"tag":72,"props":242,"children":244},{"className":243},[],[245],{"type":48,"value":126},{"type":48,"value":247},"), replacing ",{"type":43,"tag":72,"props":249,"children":251},{"className":250},[],[252],{"type":48,"value":253},"us-east-1",{"type":48,"value":255}," with their region:",{"type":43,"tag":257,"props":258,"children":263},"pre",{"className":259,"code":260,"language":261,"meta":262,"style":262},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"mcpServers\": {\n    \"ecs-mcp\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\n        \"mcp-proxy-for-aws@latest\",\n        \"https:\u002F\u002Fecs-mcp.us-east-1.api.aws\u002Fmcp\",\n        \"--service\",\n        \"ecs-mcp\",\n        \"--region\",\n        \"us-east-1\"\n      ]\n    }\n  }\n}\n","json","",[264],{"type":43,"tag":72,"props":265,"children":266},{"__ignoreMap":262},[267,279,309,335,378,416,442,464,485,506,526,547,564,573,581,589],{"type":43,"tag":268,"props":269,"children":272},"span",{"class":270,"line":271},"line",1,[273],{"type":43,"tag":268,"props":274,"children":276},{"style":275},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[277],{"type":48,"value":278},"{\n",{"type":43,"tag":268,"props":280,"children":282},{"class":270,"line":281},2,[283,288,294,299,304],{"type":43,"tag":268,"props":284,"children":285},{"style":275},[286],{"type":48,"value":287},"  \"",{"type":43,"tag":268,"props":289,"children":291},{"style":290},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[292],{"type":48,"value":293},"mcpServers",{"type":43,"tag":268,"props":295,"children":296},{"style":275},[297],{"type":48,"value":298},"\"",{"type":43,"tag":268,"props":300,"children":301},{"style":275},[302],{"type":48,"value":303},":",{"type":43,"tag":268,"props":305,"children":306},{"style":275},[307],{"type":48,"value":308}," {\n",{"type":43,"tag":268,"props":310,"children":312},{"class":270,"line":311},3,[313,318,323,327,331],{"type":43,"tag":268,"props":314,"children":315},{"style":275},[316],{"type":48,"value":317},"    \"",{"type":43,"tag":268,"props":319,"children":321},{"style":320},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[322],{"type":48,"value":101},{"type":43,"tag":268,"props":324,"children":325},{"style":275},[326],{"type":48,"value":298},{"type":43,"tag":268,"props":328,"children":329},{"style":275},[330],{"type":48,"value":303},{"type":43,"tag":268,"props":332,"children":333},{"style":275},[334],{"type":48,"value":308},{"type":43,"tag":268,"props":336,"children":338},{"class":270,"line":337},4,[339,344,350,354,358,363,369,373],{"type":43,"tag":268,"props":340,"children":341},{"style":275},[342],{"type":48,"value":343},"      \"",{"type":43,"tag":268,"props":345,"children":347},{"style":346},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[348],{"type":48,"value":349},"type",{"type":43,"tag":268,"props":351,"children":352},{"style":275},[353],{"type":48,"value":298},{"type":43,"tag":268,"props":355,"children":356},{"style":275},[357],{"type":48,"value":303},{"type":43,"tag":268,"props":359,"children":360},{"style":275},[361],{"type":48,"value":362}," \"",{"type":43,"tag":268,"props":364,"children":366},{"style":365},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[367],{"type":48,"value":368},"stdio",{"type":43,"tag":268,"props":370,"children":371},{"style":275},[372],{"type":48,"value":298},{"type":43,"tag":268,"props":374,"children":375},{"style":275},[376],{"type":48,"value":377},",\n",{"type":43,"tag":268,"props":379,"children":381},{"class":270,"line":380},5,[382,386,391,395,399,403,408,412],{"type":43,"tag":268,"props":383,"children":384},{"style":275},[385],{"type":48,"value":343},{"type":43,"tag":268,"props":387,"children":388},{"style":346},[389],{"type":48,"value":390},"command",{"type":43,"tag":268,"props":392,"children":393},{"style":275},[394],{"type":48,"value":298},{"type":43,"tag":268,"props":396,"children":397},{"style":275},[398],{"type":48,"value":303},{"type":43,"tag":268,"props":400,"children":401},{"style":275},[402],{"type":48,"value":362},{"type":43,"tag":268,"props":404,"children":405},{"style":365},[406],{"type":48,"value":407},"uvx",{"type":43,"tag":268,"props":409,"children":410},{"style":275},[411],{"type":48,"value":298},{"type":43,"tag":268,"props":413,"children":414},{"style":275},[415],{"type":48,"value":377},{"type":43,"tag":268,"props":417,"children":419},{"class":270,"line":418},6,[420,424,429,433,437],{"type":43,"tag":268,"props":421,"children":422},{"style":275},[423],{"type":48,"value":343},{"type":43,"tag":268,"props":425,"children":426},{"style":346},[427],{"type":48,"value":428},"args",{"type":43,"tag":268,"props":430,"children":431},{"style":275},[432],{"type":48,"value":298},{"type":43,"tag":268,"props":434,"children":435},{"style":275},[436],{"type":48,"value":303},{"type":43,"tag":268,"props":438,"children":439},{"style":275},[440],{"type":48,"value":441}," [\n",{"type":43,"tag":268,"props":443,"children":445},{"class":270,"line":444},7,[446,451,456,460],{"type":43,"tag":268,"props":447,"children":448},{"style":275},[449],{"type":48,"value":450},"        \"",{"type":43,"tag":268,"props":452,"children":453},{"style":365},[454],{"type":48,"value":455},"mcp-proxy-for-aws@latest",{"type":43,"tag":268,"props":457,"children":458},{"style":275},[459],{"type":48,"value":298},{"type":43,"tag":268,"props":461,"children":462},{"style":275},[463],{"type":48,"value":377},{"type":43,"tag":268,"props":465,"children":467},{"class":270,"line":466},8,[468,472,477,481],{"type":43,"tag":268,"props":469,"children":470},{"style":275},[471],{"type":48,"value":450},{"type":43,"tag":268,"props":473,"children":474},{"style":365},[475],{"type":48,"value":476},"https:\u002F\u002Fecs-mcp.us-east-1.api.aws\u002Fmcp",{"type":43,"tag":268,"props":478,"children":479},{"style":275},[480],{"type":48,"value":298},{"type":43,"tag":268,"props":482,"children":483},{"style":275},[484],{"type":48,"value":377},{"type":43,"tag":268,"props":486,"children":488},{"class":270,"line":487},9,[489,493,498,502],{"type":43,"tag":268,"props":490,"children":491},{"style":275},[492],{"type":48,"value":450},{"type":43,"tag":268,"props":494,"children":495},{"style":365},[496],{"type":48,"value":497},"--service",{"type":43,"tag":268,"props":499,"children":500},{"style":275},[501],{"type":48,"value":298},{"type":43,"tag":268,"props":503,"children":504},{"style":275},[505],{"type":48,"value":377},{"type":43,"tag":268,"props":507,"children":509},{"class":270,"line":508},10,[510,514,518,522],{"type":43,"tag":268,"props":511,"children":512},{"style":275},[513],{"type":48,"value":450},{"type":43,"tag":268,"props":515,"children":516},{"style":365},[517],{"type":48,"value":101},{"type":43,"tag":268,"props":519,"children":520},{"style":275},[521],{"type":48,"value":298},{"type":43,"tag":268,"props":523,"children":524},{"style":275},[525],{"type":48,"value":377},{"type":43,"tag":268,"props":527,"children":529},{"class":270,"line":528},11,[530,534,539,543],{"type":43,"tag":268,"props":531,"children":532},{"style":275},[533],{"type":48,"value":450},{"type":43,"tag":268,"props":535,"children":536},{"style":365},[537],{"type":48,"value":538},"--region",{"type":43,"tag":268,"props":540,"children":541},{"style":275},[542],{"type":48,"value":298},{"type":43,"tag":268,"props":544,"children":545},{"style":275},[546],{"type":48,"value":377},{"type":43,"tag":268,"props":548,"children":550},{"class":270,"line":549},12,[551,555,559],{"type":43,"tag":268,"props":552,"children":553},{"style":275},[554],{"type":48,"value":450},{"type":43,"tag":268,"props":556,"children":557},{"style":365},[558],{"type":48,"value":253},{"type":43,"tag":268,"props":560,"children":561},{"style":275},[562],{"type":48,"value":563},"\"\n",{"type":43,"tag":268,"props":565,"children":567},{"class":270,"line":566},13,[568],{"type":43,"tag":268,"props":569,"children":570},{"style":275},[571],{"type":48,"value":572},"      ]\n",{"type":43,"tag":268,"props":574,"children":575},{"class":270,"line":26},[576],{"type":43,"tag":268,"props":577,"children":578},{"style":275},[579],{"type":48,"value":580},"    }\n",{"type":43,"tag":268,"props":582,"children":583},{"class":270,"line":30},[584],{"type":43,"tag":268,"props":585,"children":586},{"style":275},[587],{"type":48,"value":588},"  }\n",{"type":43,"tag":268,"props":590,"children":592},{"class":270,"line":591},16,[593],{"type":43,"tag":268,"props":594,"children":595},{"style":275},[596],{"type":48,"value":597},"}\n",{"type":43,"tag":44,"props":599,"children":600},{},[601,603,609,611,616],{"type":48,"value":602},"Requires ",{"type":43,"tag":72,"props":604,"children":606},{"className":605},[],[607],{"type":48,"value":608},"uv",{"type":48,"value":610}," \u002F ",{"type":43,"tag":72,"props":612,"children":614},{"className":613},[],[615],{"type":48,"value":407},{"type":48,"value":617}," installed. Inherits AWS credentials from the environment (profile, SSO, or env vars). Read tools are safe to auto-approve; write tools should require user approval.",{"type":43,"tag":56,"props":619,"children":621},{"id":620},"prerequisites",[622],{"type":48,"value":623},"Prerequisites",{"type":43,"tag":135,"props":625,"children":626},{},[627,632,644,649,654],{"type":43,"tag":139,"props":628,"children":629},{},[630],{"type":48,"value":631},"AWS CLI v2 installed",{"type":43,"tag":139,"props":633,"children":634},{},[635,637,642],{"type":48,"value":636},"Python 3.10+ and ",{"type":43,"tag":72,"props":638,"children":640},{"className":639},[],[641],{"type":48,"value":608},{"type":48,"value":643}," installed (for MCP proxy)",{"type":43,"tag":139,"props":645,"children":646},{},[647],{"type":48,"value":648},"An existing App Runner service to migrate",{"type":43,"tag":139,"props":650,"children":651},{},[652],{"type":48,"value":653},"AWS credentials with permissions for ECS, IAM, App Runner, Route 53, CloudWatch, and ECR",{"type":43,"tag":139,"props":655,"children":656},{},[657,659,664,665,670,672,677],{"type":48,"value":658},"Both MCP servers configured and working (see above) — ",{"type":43,"tag":72,"props":660,"children":662},{"className":661},[],[663],{"type":48,"value":77},{"type":48,"value":79},{"type":43,"tag":72,"props":666,"children":668},{"className":667},[],[669],{"type":48,"value":85},{"type":48,"value":671}," are bundled; ",{"type":43,"tag":72,"props":673,"children":675},{"className":674},[],[676],{"type":48,"value":101},{"type":48,"value":678}," must be added by the user",{"type":43,"tag":56,"props":680,"children":682},{"id":681},"process",[683],{"type":48,"value":684},"Process",{"type":43,"tag":686,"props":687,"children":688},"ol",{},[689,720,730,740,750,765,782,792],{"type":43,"tag":139,"props":690,"children":691},{},[692,697,699,704,706,711,713,718],{"type":43,"tag":66,"props":693,"children":694},{},[695],{"type":48,"value":696},"Verify MCP servers",{"type":48,"value":698}," — confirm ",{"type":43,"tag":72,"props":700,"children":702},{"className":701},[],[703],{"type":48,"value":77},{"type":48,"value":705},", ",{"type":43,"tag":72,"props":707,"children":709},{"className":708},[],[710],{"type":48,"value":85},{"type":48,"value":712},", and ",{"type":43,"tag":72,"props":714,"children":716},{"className":715},[],[717],{"type":48,"value":101},{"type":48,"value":719}," are all available. If not, stop and guide the user through setup.",{"type":43,"tag":139,"props":721,"children":722},{},[723,728],{"type":43,"tag":66,"props":724,"children":725},{},[726],{"type":48,"value":727},"Discover",{"type":48,"value":729}," the App Runner service configuration (image, CPU\u002Fmemory, env vars, health check, VPC, custom domains)",{"type":43,"tag":139,"props":731,"children":732},{},[733,738],{"type":43,"tag":66,"props":734,"children":735},{},[736],{"type":48,"value":737},"Decide the path",{"type":48,"value":739},": Quick Migrate for simple services, or the full 9-step workflow for production-critical or complex services",{"type":43,"tag":139,"props":741,"children":742},{},[743,748],{"type":43,"tag":66,"props":744,"children":745},{},[746],{"type":48,"value":747},"Prepare IAM roles",{"type":48,"value":749}," — reuse existing roles when trust policies and managed policies already match",{"type":43,"tag":139,"props":751,"children":752},{},[753,758,760],{"type":43,"tag":66,"props":754,"children":755},{},[756],{"type":48,"value":757},"Deploy Express Mode",{"type":48,"value":759}," with matching configuration and monitor provisioning via ",{"type":43,"tag":72,"props":761,"children":763},{"className":762},[],[764],{"type":48,"value":101},{"type":43,"tag":139,"props":766,"children":767},{},[768,773,775,780],{"type":43,"tag":66,"props":769,"children":770},{},[771],{"type":48,"value":772},"Validate",{"type":48,"value":774}," — health checks, logs (via ",{"type":43,"tag":72,"props":776,"children":778},{"className":777},[],[779],{"type":48,"value":101},{"type":48,"value":781},"), functional parity against the App Runner service",{"type":43,"tag":139,"props":783,"children":784},{},[785,790],{"type":43,"tag":66,"props":786,"children":787},{},[788],{"type":48,"value":789},"Cut over traffic",{"type":48,"value":791}," — Route 53 weighted routing, ramped by service criticality",{"type":43,"tag":139,"props":793,"children":794},{},[795,800],{"type":43,"tag":66,"props":796,"children":797},{},[798],{"type":48,"value":799},"Decommission App Runner",{"type":48,"value":801}," — presented as a checklist, never executed automatically",{"type":43,"tag":44,"props":803,"children":804},{},[805,807,812,814,819],{"type":48,"value":806},"Use ",{"type":43,"tag":72,"props":808,"children":810},{"className":809},[],[811],{"type":48,"value":77},{"type":48,"value":813}," MCP tools to verify current API syntax, managed policy names, and pricing throughout — never assume parameter names. Use ",{"type":43,"tag":72,"props":815,"children":817},{"className":816},[],[818],{"type":48,"value":101},{"type":48,"value":820}," to inspect live ECS resources, read logs, and monitor deployments.",{"type":43,"tag":56,"props":822,"children":824},{"id":823},"guardrails",[825],{"type":48,"value":826},"Guardrails",{"type":43,"tag":44,"props":828,"children":829},{},[830,832,837],{"type":48,"value":831},"This skill follows a ",{"type":43,"tag":66,"props":833,"children":834},{},[835],{"type":48,"value":836},"guide-and-inform model",{"type":48,"value":838},". The read\u002Fwrite boundary is enforced by the skill's own instructions:",{"type":43,"tag":840,"props":841,"children":842},"table",{},[843,867],{"type":43,"tag":844,"props":845,"children":846},"thead",{},[847],{"type":43,"tag":848,"props":849,"children":850},"tr",{},[851,857,862],{"type":43,"tag":852,"props":853,"children":854},"th",{},[855],{"type":48,"value":856},"Category",{"type":43,"tag":852,"props":858,"children":859},{},[860],{"type":48,"value":861},"Examples",{"type":43,"tag":852,"props":863,"children":864},{},[865],{"type":48,"value":866},"Who executes",{"type":43,"tag":868,"props":869,"children":870},"tbody",{},[871,913,939],{"type":43,"tag":848,"props":872,"children":873},{},[874,883,908],{"type":43,"tag":875,"props":876,"children":877},"td",{},[878],{"type":43,"tag":66,"props":879,"children":880},{},[881],{"type":48,"value":882},"Read",{"type":43,"tag":875,"props":884,"children":885},{},[886,892,893,899,900,906],{"type":43,"tag":72,"props":887,"children":889},{"className":888},[],[890],{"type":48,"value":891},"describe-service",{"type":48,"value":705},{"type":43,"tag":72,"props":894,"children":896},{"className":895},[],[897],{"type":48,"value":898},"list-services",{"type":48,"value":705},{"type":43,"tag":72,"props":901,"children":903},{"className":902},[],[904],{"type":48,"value":905},"get-role",{"type":48,"value":907},", ECS MCP inspect tools",{"type":43,"tag":875,"props":909,"children":910},{},[911],{"type":48,"value":912},"Skill runs directly",{"type":43,"tag":848,"props":914,"children":915},{},[916,924,929],{"type":43,"tag":875,"props":917,"children":918},{},[919],{"type":43,"tag":66,"props":920,"children":921},{},[922],{"type":48,"value":923},"Write",{"type":43,"tag":875,"props":925,"children":926},{},[927],{"type":48,"value":928},"Creating IAM roles, creating the Express service, updating DNS",{"type":43,"tag":875,"props":930,"children":931},{},[932,934],{"type":48,"value":933},"Skill produces the command; ",{"type":43,"tag":66,"props":935,"children":936},{},[937],{"type":48,"value":938},"user runs it",{"type":43,"tag":848,"props":940,"children":941},{},[942,950,975],{"type":43,"tag":875,"props":943,"children":944},{},[945],{"type":43,"tag":66,"props":946,"children":947},{},[948],{"type":48,"value":949},"Destructive",{"type":43,"tag":875,"props":951,"children":952},{},[953,959,960,966,967,973],{"type":43,"tag":72,"props":954,"children":956},{"className":955},[],[957],{"type":48,"value":958},"delete-service",{"type":48,"value":705},{"type":43,"tag":72,"props":961,"children":963},{"className":962},[],[964],{"type":48,"value":965},"delete-role",{"type":48,"value":705},{"type":43,"tag":72,"props":968,"children":970},{"className":969},[],[971],{"type":48,"value":972},"pause-service",{"type":48,"value":974},", removing DNS records",{"type":43,"tag":875,"props":976,"children":977},{},[978,980],{"type":48,"value":979},"Skill presents a checklist; ",{"type":43,"tag":66,"props":981,"children":982},{},[983],{"type":48,"value":984},"user explicitly confirms",{"type":43,"tag":44,"props":986,"children":987},{},[988],{"type":48,"value":989},"Additional guardrails:",{"type":43,"tag":135,"props":991,"children":992},{},[993,1010,1020,1030,1040],{"type":43,"tag":139,"props":994,"children":995},{},[996,1001,1003,1008],{"type":43,"tag":66,"props":997,"children":998},{},[999],{"type":48,"value":1000},"Looks up API syntax at the time of use.",{"type":48,"value":1002}," Every CLI parameter, managed policy name, and service principal is looked up via ",{"type":43,"tag":72,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":48,"value":77},{"type":48,"value":1009}," MCP tools rather than hardcoded. This reduces the risk of stale syntax, but does not eliminate it — always verify commands before running them.",{"type":43,"tag":139,"props":1011,"children":1012},{},[1013,1018],{"type":43,"tag":66,"props":1014,"children":1015},{},[1016],{"type":48,"value":1017},"Checks for existing IAM roles",{"type":48,"value":1019}," before creating new ones, and advises reuse when trust policies and attached managed policies already match.",{"type":43,"tag":139,"props":1021,"children":1022},{},[1023,1028],{"type":43,"tag":66,"props":1024,"children":1025},{},[1026],{"type":48,"value":1027},"Recommends keeping App Runner running after cutover.",{"type":48,"value":1029}," Default recommendation: 24–48 hours as a rollback net before deleting.",{"type":43,"tag":139,"props":1031,"children":1032},{},[1033,1038],{"type":43,"tag":66,"props":1034,"children":1035},{},[1036],{"type":48,"value":1037},"Runs a cost comparison.",{"type":48,"value":1039}," Helps users understand the billing model differences and choose the right migration timing.",{"type":43,"tag":139,"props":1041,"children":1042},{},[1043,1048],{"type":43,"tag":66,"props":1044,"children":1045},{},[1046],{"type":48,"value":1047},"Does not touch CI\u002FCD.",{"type":48,"value":1049}," Pipeline updates are called out as user action items, not automated.",{"type":43,"tag":56,"props":1051,"children":1053},{"id":1052},"what-ecs-express-mode-requires-3-inputs",[1054],{"type":48,"value":1055},"What ECS Express Mode Requires (3 Inputs)",{"type":43,"tag":686,"props":1057,"children":1058},{},[1059,1069,1093],{"type":43,"tag":139,"props":1060,"children":1061},{},[1062,1067],{"type":43,"tag":66,"props":1063,"children":1064},{},[1065],{"type":48,"value":1066},"Container image URI",{"type":48,"value":1068}," — from ECR, ECR Public, Docker Hub, or any accessible registry",{"type":43,"tag":139,"props":1070,"children":1071},{},[1072,1077,1079,1085,1087],{"type":43,"tag":66,"props":1073,"children":1074},{},[1075],{"type":48,"value":1076},"Task execution role",{"type":48,"value":1078}," — trusts ",{"type":43,"tag":72,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":48,"value":1084},"ecs-tasks.amazonaws.com",{"type":48,"value":1086},", needs ",{"type":43,"tag":72,"props":1088,"children":1090},{"className":1089},[],[1091],{"type":48,"value":1092},"AmazonECSTaskExecutionRolePolicy",{"type":43,"tag":139,"props":1094,"children":1095},{},[1096,1101,1102,1108,1110,1122],{"type":43,"tag":66,"props":1097,"children":1098},{},[1099],{"type":48,"value":1100},"Infrastructure role",{"type":48,"value":1078},{"type":43,"tag":72,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":48,"value":1107},"ecs.amazonaws.com",{"type":48,"value":1109},", needs the Express Mode managed policy. ",{"type":43,"tag":66,"props":1111,"children":1112},{},[1113,1115,1120],{"type":48,"value":1114},"Look up the current policy name via ",{"type":43,"tag":72,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":48,"value":77},{"type":48,"value":1121}," MCP tools",{"type":48,"value":1123}," — do not hardcode.",{"type":43,"tag":56,"props":1125,"children":1127},{"id":1126},"what-express-mode-auto-provisions",[1128],{"type":48,"value":1129},"What Express Mode Auto-Provisions",{"type":43,"tag":44,"props":1131,"children":1132},{},[1133,1135,1141],{"type":48,"value":1134},"ECS cluster, task definition, service with canary deployment, ALB with HTTPS, security groups, auto scaling, CloudWatch log group, deployment alarm, ACM certificate, and a public URL (",{"type":43,"tag":72,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":48,"value":1140},"\u003Cname>.ecs.\u003Cregion>.on.aws",{"type":48,"value":1142},").",{"type":43,"tag":56,"props":1144,"children":1146},{"id":1145},"key-differences-from-app-runner",[1147],{"type":48,"value":1148},"Key Differences from App Runner",{"type":43,"tag":840,"props":1150,"children":1151},{},[1152,1173],{"type":43,"tag":844,"props":1153,"children":1154},{},[1155],{"type":43,"tag":848,"props":1156,"children":1157},{},[1158,1163,1168],{"type":43,"tag":852,"props":1159,"children":1160},{},[1161],{"type":48,"value":1162},"Aspect",{"type":43,"tag":852,"props":1164,"children":1165},{},[1166],{"type":48,"value":1167},"App Runner",{"type":43,"tag":852,"props":1169,"children":1170},{},[1171],{"type":48,"value":1172},"ECS Express Mode",{"type":43,"tag":868,"props":1174,"children":1175},{},[1176,1194,1211,1235,1253,1271],{"type":43,"tag":848,"props":1177,"children":1178},{},[1179,1184,1189],{"type":43,"tag":875,"props":1180,"children":1181},{},[1182],{"type":48,"value":1183},"Auto scaling metric",{"type":43,"tag":875,"props":1185,"children":1186},{},[1187],{"type":48,"value":1188},"Concurrent requests",{"type":43,"tag":875,"props":1190,"children":1191},{},[1192],{"type":48,"value":1193},"CPU utilization (60% default)",{"type":43,"tag":848,"props":1195,"children":1196},{},[1197,1201,1206],{"type":43,"tag":875,"props":1198,"children":1199},{},[1200],{"type":48,"value":21},{"type":43,"tag":875,"props":1202,"children":1203},{},[1204],{"type":48,"value":1205},"Blue\u002Fgreen (internal)",{"type":43,"tag":875,"props":1207,"children":1208},{},[1209],{"type":48,"value":1210},"Canary (verify exact behavior via docs)",{"type":43,"tag":848,"props":1212,"children":1213},{},[1214,1219,1224],{"type":43,"tag":875,"props":1215,"children":1216},{},[1217],{"type":48,"value":1218},"Health check default",{"type":43,"tag":875,"props":1220,"children":1221},{},[1222],{"type":48,"value":1223},"TCP on port",{"type":43,"tag":875,"props":1225,"children":1226},{},[1227,1229],{"type":48,"value":1228},"HTTP on ",{"type":43,"tag":72,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":48,"value":1234},"\u002Fping",{"type":43,"tag":848,"props":1236,"children":1237},{},[1238,1243,1248],{"type":43,"tag":875,"props":1239,"children":1240},{},[1241],{"type":48,"value":1242},"VPC",{"type":43,"tag":875,"props":1244,"children":1245},{},[1246],{"type":48,"value":1247},"Via VPC connector",{"type":43,"tag":875,"props":1249,"children":1250},{},[1251],{"type":48,"value":1252},"VPC-native (awsvpc)",{"type":43,"tag":848,"props":1254,"children":1255},{},[1256,1261,1266],{"type":43,"tag":875,"props":1257,"children":1258},{},[1259],{"type":48,"value":1260},"Load balancer",{"type":43,"tag":875,"props":1262,"children":1263},{},[1264],{"type":48,"value":1265},"Internal NLB, not accessible",{"type":43,"tag":875,"props":1267,"children":1268},{},[1269],{"type":48,"value":1270},"ALB, fully accessible, shared up to 25 services",{"type":43,"tag":848,"props":1272,"children":1273},{},[1274,1279,1284],{"type":43,"tag":875,"props":1275,"children":1276},{},[1277],{"type":48,"value":1278},"Source code deploy",{"type":43,"tag":875,"props":1280,"children":1281},{},[1282],{"type":48,"value":1283},"Supported",{"type":43,"tag":875,"props":1285,"children":1286},{},[1287],{"type":48,"value":1288},"Container image based (containerize source-code services first)",{"type":43,"tag":56,"props":1290,"children":1292},{"id":1291},"app-runner-cpumemory-fargate-mapping",[1293],{"type":48,"value":1294},"App Runner CPU\u002FMemory → Fargate Mapping",{"type":43,"tag":840,"props":1296,"children":1297},{},[1298,1318],{"type":43,"tag":844,"props":1299,"children":1300},{},[1301],{"type":43,"tag":848,"props":1302,"children":1303},{},[1304,1308,1313],{"type":43,"tag":852,"props":1305,"children":1306},{},[1307],{"type":48,"value":1167},{"type":43,"tag":852,"props":1309,"children":1310},{},[1311],{"type":48,"value":1312},"Fargate CPU",{"type":43,"tag":852,"props":1314,"children":1315},{},[1316],{"type":48,"value":1317},"Fargate Memory",{"type":43,"tag":868,"props":1319,"children":1320},{},[1321,1339,1356,1373,1390,1407,1424],{"type":43,"tag":848,"props":1322,"children":1323},{},[1324,1329,1334],{"type":43,"tag":875,"props":1325,"children":1326},{},[1327],{"type":48,"value":1328},"0.25 vCPU \u002F 0.5 GB",{"type":43,"tag":875,"props":1330,"children":1331},{},[1332],{"type":48,"value":1333},"256",{"type":43,"tag":875,"props":1335,"children":1336},{},[1337],{"type":48,"value":1338},"512",{"type":43,"tag":848,"props":1340,"children":1341},{},[1342,1347,1351],{"type":43,"tag":875,"props":1343,"children":1344},{},[1345],{"type":48,"value":1346},"0.5 vCPU \u002F 1 GB",{"type":43,"tag":875,"props":1348,"children":1349},{},[1350],{"type":48,"value":1338},{"type":43,"tag":875,"props":1352,"children":1353},{},[1354],{"type":48,"value":1355},"1024",{"type":43,"tag":848,"props":1357,"children":1358},{},[1359,1364,1368],{"type":43,"tag":875,"props":1360,"children":1361},{},[1362],{"type":48,"value":1363},"1 vCPU \u002F 2 GB",{"type":43,"tag":875,"props":1365,"children":1366},{},[1367],{"type":48,"value":1355},{"type":43,"tag":875,"props":1369,"children":1370},{},[1371],{"type":48,"value":1372},"2048",{"type":43,"tag":848,"props":1374,"children":1375},{},[1376,1381,1385],{"type":43,"tag":875,"props":1377,"children":1378},{},[1379],{"type":48,"value":1380},"1 vCPU \u002F 3 GB",{"type":43,"tag":875,"props":1382,"children":1383},{},[1384],{"type":48,"value":1355},{"type":43,"tag":875,"props":1386,"children":1387},{},[1388],{"type":48,"value":1389},"3072",{"type":43,"tag":848,"props":1391,"children":1392},{},[1393,1398,1402],{"type":43,"tag":875,"props":1394,"children":1395},{},[1396],{"type":48,"value":1397},"2 vCPU \u002F 4 GB",{"type":43,"tag":875,"props":1399,"children":1400},{},[1401],{"type":48,"value":1372},{"type":43,"tag":875,"props":1403,"children":1404},{},[1405],{"type":48,"value":1406},"4096",{"type":43,"tag":848,"props":1408,"children":1409},{},[1410,1415,1419],{"type":43,"tag":875,"props":1411,"children":1412},{},[1413],{"type":48,"value":1414},"4 vCPU \u002F 8 GB",{"type":43,"tag":875,"props":1416,"children":1417},{},[1418],{"type":48,"value":1406},{"type":43,"tag":875,"props":1420,"children":1421},{},[1422],{"type":48,"value":1423},"8192",{"type":43,"tag":848,"props":1425,"children":1426},{},[1427,1432,1436],{"type":43,"tag":875,"props":1428,"children":1429},{},[1430],{"type":48,"value":1431},"4 vCPU \u002F 12 GB",{"type":43,"tag":875,"props":1433,"children":1434},{},[1435],{"type":48,"value":1406},{"type":43,"tag":875,"props":1437,"children":1438},{},[1439],{"type":48,"value":1440},"12288",{"type":43,"tag":56,"props":1442,"children":1444},{"id":1443},"quick-migrate-happy-path",[1445],{"type":48,"value":1446},"Quick Migrate (Happy Path)",{"type":43,"tag":44,"props":1448,"children":1449},{},[1450,1452,1457],{"type":48,"value":1451},"For simple App Runner services — ",{"type":43,"tag":66,"props":1453,"children":1454},{},[1455],{"type":48,"value":1456},"image-based, public, no VPC connector, no custom domain, non-critical or low-traffic",{"type":48,"value":1458}," — use this condensed path. Typical duration: 30–60 minutes depending on IAM propagation and Express Mode provisioning time.",{"type":43,"tag":44,"props":1460,"children":1461},{},[1462,1467,1469,1474],{"type":43,"tag":66,"props":1463,"children":1464},{},[1465],{"type":48,"value":1466},"Eligibility check:",{"type":48,"value":1468}," ",{"type":43,"tag":72,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":48,"value":891},{"type":48,"value":1475}," on the App Runner service. Confirm all:",{"type":43,"tag":135,"props":1477,"children":1478},{},[1479,1498,1509,1522],{"type":43,"tag":139,"props":1480,"children":1481},{},[1482,1488,1490,1496],{"type":43,"tag":72,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":48,"value":1487},"SourceConfiguration.ImageRepository",{"type":48,"value":1489}," is set (not ",{"type":43,"tag":72,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":48,"value":1495},"CodeRepository",{"type":48,"value":1497},")",{"type":43,"tag":139,"props":1499,"children":1500},{},[1501,1503],{"type":48,"value":1502},"No ",{"type":43,"tag":72,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":48,"value":1508},"NetworkConfiguration.EgressConfiguration.VpcConnectorArn",{"type":43,"tag":139,"props":1510,"children":1511},{},[1512,1514,1520],{"type":48,"value":1513},"No custom domains (",{"type":43,"tag":72,"props":1515,"children":1517},{"className":1516},[],[1518],{"type":48,"value":1519},"list-custom-domains",{"type":48,"value":1521}," returns empty)",{"type":43,"tag":139,"props":1523,"children":1524},{},[1525],{"type":48,"value":1526},"User accepts brief downtime or a single DNS flip",{"type":43,"tag":44,"props":1528,"children":1529},{},[1530,1532,1539],{"type":48,"value":1531},"If any fail, fall back to the full ",{"type":43,"tag":1533,"props":1534,"children":1536},"a",{"href":1535},"references\u002Fmigration-workflow.md",[1537],{"type":48,"value":1538},"migration-workflow.md",{"type":48,"value":1540},".",{"type":43,"tag":44,"props":1542,"children":1543},{},[1544],{"type":43,"tag":66,"props":1545,"children":1546},{},[1547],{"type":48,"value":1548},"Quick path:",{"type":43,"tag":686,"props":1550,"children":1551},{},[1552,1569,1617,1641,1659,1669],{"type":43,"tag":139,"props":1553,"children":1554},{},[1555,1560,1562,1567],{"type":43,"tag":66,"props":1556,"children":1557},{},[1558],{"type":48,"value":1559},"Extract config",{"type":48,"value":1561}," via ",{"type":43,"tag":72,"props":1563,"children":1565},{"className":1564},[],[1566],{"type":48,"value":891},{"type":48,"value":1568}," — image URI, port, env vars, CPU\u002Fmemory, health check path.",{"type":43,"tag":139,"props":1570,"children":1571},{},[1572,1577,1579],{"type":43,"tag":66,"props":1573,"children":1574},{},[1575],{"type":48,"value":1576},"Create IAM roles",{"type":48,"value":1578}," (reuse if they already exist):\n",{"type":43,"tag":135,"props":1580,"children":1581},{},[1582,1599],{"type":43,"tag":139,"props":1583,"children":1584},{},[1585,1587,1592,1594],{"type":48,"value":1586},"Task execution role trusting ",{"type":43,"tag":72,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":48,"value":1084},{"type":48,"value":1593}," with ",{"type":43,"tag":72,"props":1595,"children":1597},{"className":1596},[],[1598],{"type":48,"value":1092},{"type":43,"tag":139,"props":1600,"children":1601},{},[1602,1604,1609,1611,1616],{"type":48,"value":1603},"Infrastructure role trusting ",{"type":43,"tag":72,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":48,"value":1107},{"type":48,"value":1610}," with the Express Mode managed policy (look up via ",{"type":43,"tag":72,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":48,"value":77},{"type":48,"value":1497},{"type":43,"tag":139,"props":1618,"children":1619},{},[1620,1625,1626,1632,1633,1639],{"type":43,"tag":66,"props":1621,"children":1622},{},[1623],{"type":48,"value":1624},"Create Express Mode service",{"type":48,"value":1561},{"type":43,"tag":72,"props":1627,"children":1629},{"className":1628},[],[1630],{"type":48,"value":1631},"create-express-gateway-service",{"type":48,"value":1593},{"type":43,"tag":72,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":48,"value":1638},"--monitor-resources",{"type":48,"value":1640},". Map CPU\u002Fmemory per the table above. Wait for ACTIVE.",{"type":43,"tag":139,"props":1642,"children":1643},{},[1644,1649,1651,1657],{"type":43,"tag":66,"props":1645,"children":1646},{},[1647],{"type":48,"value":1648},"Smoke test",{"type":48,"value":1650}," the auto-generated ",{"type":43,"tag":72,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":48,"value":1656},"*.ecs.\u003Cregion>.on.aws",{"type":48,"value":1658}," URL.",{"type":43,"tag":139,"props":1660,"children":1661},{},[1662,1667],{"type":43,"tag":66,"props":1663,"children":1664},{},[1665],{"type":48,"value":1666},"Cut over DNS",{"type":48,"value":1668}," — single flip (no weighted routing). Skip if no user-facing DNS.",{"type":43,"tag":139,"props":1670,"children":1671},{},[1672,1677],{"type":43,"tag":66,"props":1673,"children":1674},{},[1675],{"type":48,"value":1676},"Keep App Runner paused for 24 hours",{"type":48,"value":1678}," as a rollback safety net, then delete.",{"type":43,"tag":44,"props":1680,"children":1681},{},[1682,1687],{"type":43,"tag":66,"props":1683,"children":1684},{},[1685],{"type":48,"value":1686},"Escalate to full workflow",{"type":48,"value":1688}," if: VPC connector present, custom domain in use, production-critical, traffic >100 req\u002Fsec, or any smoke test fails.",{"type":43,"tag":56,"props":1690,"children":1692},{"id":1691},"full-migration-workflow",[1693],{"type":48,"value":1694},"Full Migration Workflow",{"type":43,"tag":44,"props":1696,"children":1697},{},[1698,1700,1704],{"type":48,"value":1699},"For services that don't qualify for Quick Migrate, follow the 9-step workflow in ",{"type":43,"tag":1533,"props":1701,"children":1702},{"href":1535},[1703],{"type":48,"value":1535},{"type":48,"value":303},{"type":43,"tag":686,"props":1706,"children":1707},{},[1708,1718,1728,1738,1748,1763,1772,1782,1792],{"type":43,"tag":139,"props":1709,"children":1710},{},[1711,1716],{"type":43,"tag":66,"props":1712,"children":1713},{},[1714],{"type":48,"value":1715},"Discover and Assess",{"type":48,"value":1717}," — extract App Runner config",{"type":43,"tag":139,"props":1719,"children":1720},{},[1721,1726],{"type":43,"tag":66,"props":1722,"children":1723},{},[1724],{"type":48,"value":1725},"Prepare IAM Roles",{"type":48,"value":1727}," — create execution, infrastructure, and task roles",{"type":43,"tag":139,"props":1729,"children":1730},{},[1731,1736],{"type":43,"tag":66,"props":1732,"children":1733},{},[1734],{"type":48,"value":1735},"Verify Network Connectivity",{"type":48,"value":1737}," — ensure VPC\u002Fsubnet compatibility",{"type":43,"tag":139,"props":1739,"children":1740},{},[1741,1746],{"type":43,"tag":66,"props":1742,"children":1743},{},[1744],{"type":48,"value":1745},"Deploy Express Mode Service",{"type":48,"value":1747}," — create the service with matching config",{"type":43,"tag":139,"props":1749,"children":1750},{},[1751,1756,1758],{"type":43,"tag":66,"props":1752,"children":1753},{},[1754],{"type":48,"value":1755},"Configure Custom Domain",{"type":48,"value":1757}," (optional) — see ",{"type":43,"tag":1533,"props":1759,"children":1761},{"href":1760},"references\u002Fcustom-domain.md",[1762],{"type":48,"value":1760},{"type":43,"tag":139,"props":1764,"children":1765},{},[1766,1770],{"type":43,"tag":66,"props":1767,"children":1768},{},[1769],{"type":48,"value":772},{"type":48,"value":1771}," — health checks, logs, functional parity",{"type":43,"tag":139,"props":1773,"children":1774},{},[1775,1780],{"type":43,"tag":66,"props":1776,"children":1777},{},[1778],{"type":48,"value":1779},"Gradual Traffic Cutover",{"type":48,"value":1781}," — Route 53 weighted routing (10→25→50→75→100%)",{"type":43,"tag":139,"props":1783,"children":1784},{},[1785,1790],{"type":43,"tag":66,"props":1786,"children":1787},{},[1788],{"type":48,"value":1789},"Update CI\u002FCD",{"type":48,"value":1791}," — point pipelines at Express Mode",{"type":43,"tag":139,"props":1793,"children":1794},{},[1795,1799],{"type":43,"tag":66,"props":1796,"children":1797},{},[1798],{"type":48,"value":799},{"type":48,"value":1800}," — cleanup checklist",{"type":43,"tag":56,"props":1802,"children":1804},{"id":1803},"cost-awareness",[1805],{"type":48,"value":1806},"Cost Awareness",{"type":43,"tag":44,"props":1808,"children":1809},{},[1810,1812,1817],{"type":48,"value":1811},"See ",{"type":43,"tag":1533,"props":1813,"children":1815},{"href":1814},"references\u002Fcost-comparison.md",[1816],{"type":48,"value":1814},{"type":48,"value":1818}," for the full cost comparison workflow. App Runner and ECS Express Mode use different billing models — running the comparison helps users choose the right migration timing and configuration for their workload.",{"type":43,"tag":56,"props":1820,"children":1822},{"id":1821},"infrastructure-as-code",[1823],{"type":48,"value":1824},"Infrastructure-as-Code",{"type":43,"tag":44,"props":1826,"children":1827},{},[1828,1830,1835],{"type":48,"value":1829},"The workflow produces AWS CLI commands by default. If the user prefers Terraform, CDK, or CloudFormation, translate the same parameters into the requested IaC syntax — look up current resource\u002Fconstruct names via ",{"type":43,"tag":72,"props":1831,"children":1833},{"className":1832},[],[1834],{"type":48,"value":77},{"type":48,"value":1836}," MCP tools. The canonical inputs (image URI, CPU\u002Fmemory, roles, health check path, network config) stay identical regardless of the tool.",{"type":43,"tag":56,"props":1838,"children":1840},{"id":1839},"waf-and-cloudfront",[1841],{"type":48,"value":1842},"WAF and CloudFront",{"type":43,"tag":44,"props":1844,"children":1845},{},[1846,1847,1852],{"type":48,"value":1811},{"type":43,"tag":1533,"props":1848,"children":1850},{"href":1849},"references\u002Fwaf-cloudfront.md",[1851],{"type":48,"value":1849},{"type":48,"value":1853},". Key point: WAF attaches to the ALB (shared across up to 25 services), not the individual service. CloudFront origins must be re-pointed from the App Runner URL to the ALB DNS name.",{"type":43,"tag":56,"props":1855,"children":1857},{"id":1856},"source-code-services",[1858],{"type":48,"value":1859},"Source Code Services",{"type":43,"tag":44,"props":1861,"children":1862},{},[1863],{"type":48,"value":1864},"If the App Runner service deploys from source code (not a container image), it must be containerized first. Generate a Dockerfile and push to ECR. Express Mode only accepts container images.",{"type":43,"tag":56,"props":1866,"children":1868},{"id":1867},"migrating-multiple-services",[1869],{"type":48,"value":1870},"Migrating Multiple Services",{"type":43,"tag":135,"props":1872,"children":1873},{},[1874,1879,1884,1889],{"type":43,"tag":139,"props":1875,"children":1876},{},[1877],{"type":48,"value":1878},"Express Mode shares a single ALB across up to 25 services (per ALB, not per VPC)",{"type":43,"tag":139,"props":1880,"children":1881},{},[1882],{"type":48,"value":1883},"Migrate one at a time, lowest-risk first",{"type":43,"tag":139,"props":1885,"children":1886},{},[1887],{"type":48,"value":1888},"Task execution and infrastructure roles can be reused",{"type":43,"tag":139,"props":1890,"children":1891},{},[1892],{"type":48,"value":1893},"Each service needs its own Route 53 weighted cutover",{"type":43,"tag":56,"props":1895,"children":1897},{"id":1896},"when-to-load-reference-files",[1898],{"type":48,"value":1899},"When to Load Reference Files",{"type":43,"tag":135,"props":1901,"children":1902},{},[1903,1912,1921,1930,1939],{"type":43,"tag":139,"props":1904,"children":1905},{},[1906,1908],{"type":48,"value":1907},"Starting or continuing a migration → ",{"type":43,"tag":1533,"props":1909,"children":1910},{"href":1535},[1911],{"type":48,"value":1535},{"type":43,"tag":139,"props":1913,"children":1914},{},[1915,1917],{"type":48,"value":1916},"Configuring a custom domain on Express Mode → ",{"type":43,"tag":1533,"props":1918,"children":1919},{"href":1760},[1920],{"type":48,"value":1760},{"type":43,"tag":139,"props":1922,"children":1923},{},[1924,1926],{"type":48,"value":1925},"Comparing costs before or during migration → ",{"type":43,"tag":1533,"props":1927,"children":1928},{"href":1814},[1929],{"type":48,"value":1814},{"type":43,"tag":139,"props":1931,"children":1932},{},[1933,1935],{"type":48,"value":1934},"Migrating WAF or CloudFront configuration → ",{"type":43,"tag":1533,"props":1936,"children":1937},{"href":1849},[1938],{"type":48,"value":1849},{"type":43,"tag":139,"props":1940,"children":1941},{},[1942,1944],{"type":48,"value":1943},"Debugging migration issues → ",{"type":43,"tag":1533,"props":1945,"children":1947},{"href":1946},"references\u002Ftroubleshooting.md",[1948],{"type":48,"value":1946},{"type":43,"tag":56,"props":1950,"children":1952},{"id":1951},"anti-patterns",[1953],{"type":48,"value":1954},"Anti-Patterns",{"type":43,"tag":135,"props":1956,"children":1957},{},[1958,1968,1985,1995,2005,2015,2025,2043],{"type":43,"tag":139,"props":1959,"children":1960},{},[1961,1966],{"type":43,"tag":66,"props":1962,"children":1963},{},[1964],{"type":48,"value":1965},"Running the Quick Migrate path on a production-critical service",{"type":48,"value":1967},": The quick path skips weighted routing and parallel-run validation. Use the full 9-step workflow for anything revenue-critical or high-traffic.",{"type":43,"tag":139,"props":1969,"children":1970},{},[1971,1976,1978,1983],{"type":43,"tag":66,"props":1972,"children":1973},{},[1974],{"type":48,"value":1975},"Hardcoding API parameter names or managed policy names",{"type":48,"value":1977},": AWS CLI syntax and policy names drift over time. Always look them up via ",{"type":43,"tag":72,"props":1979,"children":1981},{"className":1980},[],[1982],{"type":48,"value":77},{"type":48,"value":1984}," MCP tools at the time of use.",{"type":43,"tag":139,"props":1986,"children":1987},{},[1988,1993],{"type":43,"tag":66,"props":1989,"children":1990},{},[1991],{"type":48,"value":1992},"Skipping the cost comparison",{"type":48,"value":1994},": App Runner and Express Mode use different billing models. Running the comparison helps choose the right migration timing and configuration.",{"type":43,"tag":139,"props":1996,"children":1997},{},[1998,2003],{"type":43,"tag":66,"props":1999,"children":2000},{},[2001],{"type":48,"value":2002},"Cutting over DNS without smoke testing",{"type":48,"value":2004},": Always validate the Express Mode service URL before shifting any production traffic.",{"type":43,"tag":139,"props":2006,"children":2007},{},[2008,2013],{"type":43,"tag":66,"props":2009,"children":2010},{},[2011],{"type":48,"value":2012},"Deleting App Runner immediately after cutover",{"type":48,"value":2014},": Keep it running 24–48 hours as a rollback net. Pause first, then delete.",{"type":43,"tag":139,"props":2016,"children":2017},{},[2018,2023],{"type":43,"tag":66,"props":2019,"children":2020},{},[2021],{"type":48,"value":2022},"Manually deleting Express Mode managed resources",{"type":48,"value":2024},": ALBs, target groups, and security groups created by Express Mode should only be removed via the delete API. Manual deletion causes orphaned state.",{"type":43,"tag":139,"props":2026,"children":2027},{},[2028,2033,2035,2041],{"type":43,"tag":66,"props":2029,"children":2030},{},[2031],{"type":48,"value":2032},"Ignoring auto-scaling metric differences",{"type":48,"value":2034},": App Runner scales on concurrent requests; Express Mode scales on CPU utilization. Bursty workloads may behave differently — re-tune ",{"type":43,"tag":72,"props":2036,"children":2038},{"className":2037},[],[2039],{"type":48,"value":2040},"--scaling-target",{"type":48,"value":2042}," if needed.",{"type":43,"tag":139,"props":2044,"children":2045},{},[2046,2051],{"type":43,"tag":66,"props":2047,"children":2048},{},[2049],{"type":48,"value":2050},"Mixing DNS record types in weighted routing",{"type":48,"value":2052},": Both the App Runner and Express Mode records must use the same type (both CNAME or both Alias A). Mixing breaks weighted routing.",{"type":43,"tag":56,"props":2054,"children":2056},{"id":2055},"limitations",[2057],{"type":48,"value":2058},"Limitations",{"type":43,"tag":135,"props":2060,"children":2061},{},[2062,2072,2094,2099,2104],{"type":43,"tag":139,"props":2063,"children":2064},{},[2065,2070],{"type":43,"tag":66,"props":2066,"children":2067},{},[2068],{"type":48,"value":2069},"This skill does not guarantee zero downtime, data integrity, or cost savings.",{"type":48,"value":2071}," It provides guided steps to minimize risk, but the outcome depends on the user's environment, configuration, and validation. Always test thoroughly before cutting over production traffic.",{"type":43,"tag":139,"props":2073,"children":2074},{},[2075,2077,2085,2087,2092],{"type":48,"value":2076},"This skill is informed by the ",{"type":43,"tag":1533,"props":2078,"children":2082},{"href":2079,"rel":2080},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fapprunner\u002Flatest\u002Fdg\u002Fapprunner-availability-change.html",[2081],"nofollow",[2083],{"type":48,"value":2084},"AWS App Runner availability-change migration guide",{"type":48,"value":2086},", the Express Mode launch blog, the AWS CLI reference, and the Amazon ECS developer guide. Always cross-reference with ",{"type":43,"tag":72,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":48,"value":77},{"type":48,"value":2093}," MCP tools for the latest syntax.",{"type":43,"tag":139,"props":2095,"children":2096},{},[2097],{"type":48,"value":2098},"This skill is designed for one service at a time. For fleet migrations (>10 services), loop the workflow.",{"type":43,"tag":139,"props":2100,"children":2101},{},[2102],{"type":48,"value":2103},"The skill does not ship pre-built IaC modules — it translates canonical inputs into whatever IaC the user requests.",{"type":43,"tag":139,"props":2105,"children":2106},{},[2107],{"type":48,"value":2108},"Cost estimates are approximations. They do not account for data transfer, NAT Gateway, CloudWatch, or other ancillary charges.",{"type":43,"tag":56,"props":2110,"children":2112},{"id":2111},"related-skills",[2113],{"type":48,"value":2114},"Related Skills",{"type":43,"tag":135,"props":2116,"children":2117},{},[2118,2129,2140,2151,2162,2173],{"type":43,"tag":139,"props":2119,"children":2120},{},[2121,2127],{"type":43,"tag":72,"props":2122,"children":2124},{"className":2123},[],[2125],{"type":48,"value":2126},"ecs",{"type":48,"value":2128}," — ECS architecture, launch type selection, task definitions, and Express Mode reference",{"type":43,"tag":139,"props":2130,"children":2131},{},[2132,2138],{"type":43,"tag":72,"props":2133,"children":2135},{"className":2134},[],[2136],{"type":48,"value":2137},"migration-advisor",{"type":48,"value":2139}," (agent) — Multi-cloud migration assessment and wave planning",{"type":43,"tag":139,"props":2141,"children":2142},{},[2143,2149],{"type":43,"tag":72,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":48,"value":2148},"iam",{"type":48,"value":2150}," — IAM role design and least-privilege policies",{"type":43,"tag":139,"props":2152,"children":2153},{},[2154,2160],{"type":43,"tag":72,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":48,"value":2159},"networking",{"type":48,"value":2161}," — VPC, subnet, and security group design",{"type":43,"tag":139,"props":2163,"children":2164},{},[2165,2171],{"type":43,"tag":72,"props":2166,"children":2168},{"className":2167},[],[2169],{"type":48,"value":2170},"cost-check",{"type":48,"value":2172}," — AWS cost estimation and optimization",{"type":43,"tag":139,"props":2174,"children":2175},{},[2176,2182],{"type":43,"tag":72,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":48,"value":2181},"cloudfront",{"type":48,"value":2183}," — CDN configuration for ECS-backed services",{"type":43,"tag":2185,"props":2186,"children":2187},"style",{},[2188],{"type":48,"value":2189},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2191,"total":2290},[2192,2206,2221,2233,2245,2260,2275],{"slug":2193,"name":2193,"fn":2194,"description":2195,"org":2196,"tags":2197,"stars":26,"repoUrl":27,"updatedAt":2205},"agentcore","design Amazon Bedrock AgentCore architectures","Deep-dive into Amazon Bedrock AgentCore platform design, service selection, deployment, and production operations. This skill should be used when the user asks to \"design an AgentCore architecture\", \"deploy agents on AgentCore\", \"configure AgentCore Runtime\", \"set up AgentCore Memory\", \"use AgentCore Gateway\", \"configure AgentCore Identity\", \"set up AgentCore Policy\", \"plan agent observability\", \"evaluate agent quality\", \"move agent PoC to production\", or mentions AgentCore, AgentCore Runtime, AgentCore Memory, AgentCore Gateway, AgentCore Identity, AgentCore Policy, AgentCore Evaluations, AgentCore Code Interpreter, AgentCore Browser, A2A protocol, or multi-agent orchestration on AWS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2198,2201,2204],{"name":2199,"slug":2200,"type":16},"Agents","agents",{"name":2202,"slug":2203,"type":16},"Architecture","architecture",{"name":24,"slug":25,"type":16},"2026-07-12T08:40:11.108951",{"slug":2207,"name":2207,"fn":2208,"description":2209,"org":2210,"tags":2211,"stars":26,"repoUrl":27,"updatedAt":2220},"aidlc-lite","develop AI applications on AWS","Lightweight AI development lifecycle for building on AWS. A simplified take on the AI-DLC philosophy — think together, then build fast. Acts as a design partner that understands intent, proposes alternatives with trade-offs, and ships working code without the ceremony of full requirements\u002Fdesign\u002Fspec documents. Use when a founder says \"build X on AWS\", \"add Y to my stack\", \"scaffold an API\", or \"write the CDK for Z\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2212,2213,2216,2217],{"name":2199,"slug":2200,"type":16},{"name":2214,"slug":2215,"type":16},"AI Infrastructure","ai-infrastructure",{"name":24,"slug":25,"type":16},{"name":2218,"slug":2219,"type":16},"Engineering","engineering","2026-07-12T08:40:40.204103",{"slug":2222,"name":2222,"fn":2223,"description":2224,"org":2225,"tags":2226,"stars":26,"repoUrl":27,"updatedAt":2232},"architect-for-startups","advise on AWS architecture for startups","AWS architecture advisor tailored specifically for startups. Alters AWS architecture recommendations based on startup stage (pre-revenue through Series B+), team size, runway, and credits. ALWAYS use when asked about building on AWS, choosing services, planning infrastructure, managing costs with credits, or preparing architecture for fundraising.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2227,2228,2229],{"name":2202,"slug":2203,"type":16},{"name":24,"slug":25,"type":16},{"name":2230,"slug":2231,"type":16},"Strategy","strategy","2026-07-12T08:41:33.557354",{"slug":2234,"name":2234,"fn":2235,"description":2236,"org":2237,"tags":2238,"stars":26,"repoUrl":27,"updatedAt":2244},"aws-architect","design and review AWS architectures","Design and review AWS architectures following Well-Architected Framework principles. Use when planning new infrastructure, reviewing existing architectures, evaluating trade-offs between AWS services, or when asked about AWS best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2239,2240,2241],{"name":2202,"slug":2203,"type":16},{"name":24,"slug":25,"type":16},{"name":2242,"slug":2243,"type":16},"Infrastructure","infrastructure","2026-07-12T08:40:57.630086",{"slug":2246,"name":2246,"fn":2247,"description":2248,"org":2249,"tags":2250,"stars":26,"repoUrl":27,"updatedAt":2259},"aws-compare","compare AWS architecture options","Compare 2-3 AWS architecture options side-by-side across cost, complexity, performance, security, and operational burden. Use when evaluating trade-offs between approaches or when the user is deciding between options.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2251,2252,2253,2256],{"name":2202,"slug":2203,"type":16},{"name":24,"slug":25,"type":16},{"name":2254,"slug":2255,"type":16},"Cost Optimization","cost-optimization",{"name":2257,"slug":2258,"type":16},"Security","security","2026-07-12T08:40:23.960287",{"slug":2261,"name":2261,"fn":2262,"description":2263,"org":2264,"tags":2265,"stars":26,"repoUrl":27,"updatedAt":2274},"aws-debug","debug AWS infrastructure and deployment failures","Debug AWS infrastructure issues, deployment failures, and runtime errors. Use when troubleshooting CloudFormation stack failures, Lambda errors, ECS task failures, permission issues, networking problems, or any AWS service misbehavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2266,2267,2270,2271],{"name":24,"slug":25,"type":16},{"name":2268,"slug":2269,"type":16},"Debugging","debugging",{"name":21,"slug":22,"type":16},{"name":2272,"slug":2273,"type":16},"Observability","observability","2026-07-12T08:40:16.767171",{"slug":2276,"name":2276,"fn":2277,"description":2278,"org":2279,"tags":2280,"stars":26,"repoUrl":27,"updatedAt":2289},"aws-diagram","generate AWS architecture diagrams","Generate AWS architecture diagrams in Mermaid or ASCII from a description, existing IaC, or conversation context. Use when the user wants to visualize an architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2281,2282,2283,2286],{"name":2202,"slug":2203,"type":16},{"name":24,"slug":25,"type":16},{"name":2284,"slug":2285,"type":16},"Diagrams","diagrams",{"name":2287,"slug":2288,"type":16},"Visualization","visualization","2026-07-12T08:40:43.26341",42,{"items":2292,"total":2462},[2293,2308,2329,2339,2350,2363,2373,2383,2402,2417,2432,2447],{"slug":2294,"name":2294,"fn":2295,"description":2296,"org":2297,"tags":2298,"stars":2305,"repoUrl":2306,"updatedAt":2307},"agentcore-investigation","investigate Bedrock AgentCore runtime sessions","Investigate Bedrock AgentCore runtime sessions via CloudWatch Logs Insights — resolve session\u002Ftrace IDs, query OTEL spans, filter noise, build timelines. Use when debugging AgentCore agent sessions, tracing tool calls, or analyzing latency.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2299,2300,2301,2304],{"name":24,"slug":25,"type":16},{"name":2268,"slug":2269,"type":16},{"name":2302,"slug":2303,"type":16},"Logs","logs",{"name":2272,"slug":2273,"type":16},9427,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fmcp","2026-07-12T08:37:22.601527",{"slug":2309,"name":2310,"fn":2311,"description":2312,"org":2313,"tags":2314,"stars":2305,"repoUrl":2306,"updatedAt":2328},"amazon-aurora-dsql","amazon aurora dsql","build applications with Aurora DSQL","Build with Aurora DSQL — manage schemas, execute queries, handle migrations, diagnose query plans, load data, and develop applications with a serverless, distributed SQL database. Covers IAM auth, multi-tenant patterns, MySQL-to-DSQL and PostgreSQL-to-DSQL schema conversion, FK replacement code generation, OCC retry patterns, ORM migration (Django\u002FHibernate\u002FRails), DDL operations, query plan explainability, SQL compatibility validation, and bulk data loading. Triggers on phrases like: DSQL, Aurora DSQL, create DSQL table, DSQL schema, migrate to DSQL, distributed SQL database, serverless PostgreSQL-compatible database, DSQL query plan, DSQL EXPLAIN ANALYZE, why is my DSQL query slow, DSQL foreign key, DSQL OCC retry, DSQL multi-region, load into DSQL, load CSV into DSQL, bulk load DSQL, aurora-dsql-loader.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2315,2318,2319,2322,2325],{"name":2316,"slug":2317,"type":16},"Aurora","aurora",{"name":24,"slug":25,"type":16},{"name":2320,"slug":2321,"type":16},"Database","database",{"name":2323,"slug":2324,"type":16},"Serverless","serverless",{"name":2326,"slug":2327,"type":16},"SQL","sql","2026-07-12T08:36:45.053393",{"slug":2330,"name":2331,"fn":2311,"description":2312,"org":2332,"tags":2333,"stars":2305,"repoUrl":2306,"updatedAt":2338},"aurora-dsql","aurora dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2334,2335,2336,2337],{"name":24,"slug":25,"type":16},{"name":2320,"slug":2321,"type":16},{"name":2323,"slug":2324,"type":16},{"name":2326,"slug":2327,"type":16},"2026-07-12T08:36:42.694299",{"slug":2340,"name":2341,"fn":2311,"description":2312,"org":2342,"tags":2343,"stars":2305,"repoUrl":2306,"updatedAt":2349},"aws-dsql","aws dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2344,2345,2346,2347,2348],{"name":24,"slug":25,"type":16},{"name":2320,"slug":2321,"type":16},{"name":18,"slug":19,"type":16},{"name":2323,"slug":2324,"type":16},{"name":2326,"slug":2327,"type":16},"2026-07-12T08:36:38.584057",{"slug":2351,"name":2352,"fn":2311,"description":2312,"org":2353,"tags":2354,"stars":2305,"repoUrl":2306,"updatedAt":2362},"distributed-postgres","distributed postgres",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2355,2356,2357,2360,2361],{"name":24,"slug":25,"type":16},{"name":2320,"slug":2321,"type":16},{"name":2358,"slug":2359,"type":16},"PostgreSQL","postgresql",{"name":2323,"slug":2324,"type":16},{"name":2326,"slug":2327,"type":16},"2026-07-12T08:36:46.530743",{"slug":2364,"name":2365,"fn":2311,"description":2312,"org":2366,"tags":2367,"stars":2305,"repoUrl":2306,"updatedAt":2372},"distributed-sql","distributed sql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2368,2369,2370,2371],{"name":24,"slug":25,"type":16},{"name":2320,"slug":2321,"type":16},{"name":2323,"slug":2324,"type":16},{"name":2326,"slug":2327,"type":16},"2026-07-12T08:36:48.104182",{"slug":2374,"name":2374,"fn":2311,"description":2312,"org":2375,"tags":2376,"stars":2305,"repoUrl":2306,"updatedAt":2382},"dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2377,2378,2379,2380,2381],{"name":24,"slug":25,"type":16},{"name":2320,"slug":2321,"type":16},{"name":18,"slug":19,"type":16},{"name":2323,"slug":2324,"type":16},{"name":2326,"slug":2327,"type":16},"2026-07-12T08:36:36.374512",{"slug":2384,"name":2384,"fn":2385,"description":2386,"org":2387,"tags":2388,"stars":2399,"repoUrl":2400,"updatedAt":2401},"cost-efficiency-analyzer","analyze cost efficiency and expenses","Analyzes cost structure, cost efficiency, and expense management from P&L data. Use when the user asks about costs, expenses, COGS, operating expenses, cost ratios, cost control, spending efficiency, margin compression from cost side, or wants to understand where money is going. Also use for \"are we spending too much\", \"cost breakdown\", \"expense analysis\", or \"how efficient are our operations\". NOT for revenue or top-line analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2389,2392,2395,2396],{"name":2390,"slug":2391,"type":16},"Accounting","accounting",{"name":2393,"slug":2394,"type":16},"Analytics","analytics",{"name":2254,"slug":2255,"type":16},{"name":2397,"slug":2398,"type":16},"Finance","finance",3176,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fagentcore-samples","2026-07-12T08:40:03.29555",{"slug":2403,"name":2403,"fn":2404,"description":2405,"org":2406,"tags":2407,"stars":2399,"repoUrl":2400,"updatedAt":2416},"executive-financial-briefing","generate executive financial briefings","Generates a concise executive-level financial briefing or summary suitable for a CEO, CFO, or board presentation. Use when the user asks for a summary, briefing, executive summary, board update, financial overview, financial health check, or \"how is the business doing\". Covers the full P&L picture in one page. Also use for \"give me the highlights\", \"what do I need to know\", or \"quick financial update\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2408,2409,2410,2413],{"name":24,"slug":25,"type":16},{"name":2397,"slug":2398,"type":16},{"name":2411,"slug":2412,"type":16},"Management","management",{"name":2414,"slug":2415,"type":16},"Reporting","reporting","2026-07-12T08:40:02.066471",{"slug":2418,"name":2418,"fn":2419,"description":2420,"org":2421,"tags":2422,"stars":2399,"repoUrl":2400,"updatedAt":2431},"multi-quarter-trend-analysis","analyze multi-quarter financial trends","Analyzes financial trends across multiple quarters by comparing P&L metrics over time. Use when the user wants to see trends, patterns, trajectories, or directional movement across 3 or more quarters. Also use for \"how are we trending\", \"show me the trend\", \"track performance over time\", \"quarter over quarter comparison across all quarters\", or any multi-period longitudinal analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2423,2424,2425,2428],{"name":2393,"slug":2394,"type":16},{"name":2397,"slug":2398,"type":16},{"name":2426,"slug":2427,"type":16},"Financial Statements","financial-statements",{"name":2429,"slug":2430,"type":16},"Variance Analysis","variance-analysis","2026-07-12T08:40:00.79141",{"slug":2433,"name":2433,"fn":2434,"description":2435,"org":2436,"tags":2437,"stars":2399,"repoUrl":2400,"updatedAt":2446},"pdf","process and manipulate PDF documents","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2438,2441,2444],{"name":2439,"slug":2440,"type":16},"Automation","automation",{"name":2442,"slug":2443,"type":16},"Documents","documents",{"name":2445,"slug":2433,"type":16},"PDF","2026-07-12T08:41:44.135656",{"slug":2448,"name":2448,"fn":2449,"description":2450,"org":2451,"tags":2452,"stars":2399,"repoUrl":2400,"updatedAt":2461},"quarterly-kpi-calculator","calculate quarterly financial KPIs","Calculates quarterly financial KPIs from P&L data. P&L figures can be provided directly by the user or fetched from the financial data MCP server. Use when the user wants KPI calculations such as Gross Margin %, EBITDA Margin %, Operating Expense Ratio, or Revenue Growth % QoQ. Also use for quarterly performance review, P&L analysis, or interpreting financial ratios against benchmarks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2453,2454,2457,2458],{"name":2390,"slug":2391,"type":16},{"name":2455,"slug":2456,"type":16},"Data Analysis","data-analysis",{"name":2397,"slug":2398,"type":16},{"name":2459,"slug":2460,"type":16},"KPI","kpi","2026-07-12T08:39:59.54971",150]