AWS App Runner Management Skill
Analyze and manage AWS App Runner services, deployments, and scaling configurations.
MANDATORY: Discovery-First Pattern
Always list services before querying specific resources.
Phase 1: Discovery
#!/bin/bash
export AWS_PAGER=""
echo "=== App Runner Services ==="
aws apprunner list-services --output text \
--query 'ServiceSummaryList[].[ServiceName,ServiceArn,Status,ServiceUrl]'
echo ""
echo "=== Service Details ==="
for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do
aws apprunner describe-service --service-arn "$arn" --output text \
--query 'Service.[ServiceName,Status,SourceConfiguration.ImageRepository.ImageIdentifier,InstanceConfiguration.Cpu,InstanceConfiguration.Memory]' &
done
wait
echo ""
echo "=== Auto Scaling Configurations ==="
aws apprunner list-auto-scaling-configurations --output text \
--query 'AutoScalingConfigurationSummaryList[].[AutoScalingConfigurationName,AutoScalingConfigurationRevision,Status]'
Phase 2: Analysis
#!/bin/bash
export AWS_PAGER=""
echo "=== Service Health ==="
for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do
{
name=$(aws apprunner describe-service --service-arn "$arn" --output text --query 'Service.ServiceName')
status=$(aws apprunner describe-service --service-arn "$arn" --output text --query 'Service.Status')
printf "%s\t%s\n" "$name" "$status"
} &
done
wait
echo ""
echo "=== Recent Operations ==="
for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do
aws apprunner list-operations --service-arn "$arn" --output text \
--query "OperationSummaryList[:3].[\"$(echo $arn | awk -F/ '{print $NF}')\",Type,Status,StartedAt,EndedAt]" &
done
wait
echo ""
echo "=== Custom Domains ==="
for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do
aws apprunner describe-custom-domains --service-arn "$arn" --output text \
--query "CustomDomains[].[DomainName,Status,CertificateValidationRecords[0].Value]" 2>/dev/null &
done
wait
echo ""
echo "=== VPC Connectors ==="
aws apprunner list-vpc-connectors --output text \
--query 'VpcConnectors[].[VpcConnectorName,Status,Subnets[0],SecurityGroups[0]]' 2>/dev/null
Output Format
- Target ≤50 lines per output
- Use
--output text --query for all commands
- Tab-delimited fields: ServiceName, Status, Source, CPU, Memory
- Aggregate deployment operations by status
- Never dump full service configuration -- extract key fields only
Anti-Hallucination Rules
- NEVER assume resource names — always discover via CLI/API in Phase 1 before referencing in Phase 2.
- NEVER fabricate metric names or dimensions — verify against the service documentation or
--help output.
- NEVER mix CLI commands between service versions — confirm which version/API you are targeting.
- ALWAYS use the discovery → verify → analyze chain — every resource referenced must have been discovered first.
- ALWAYS handle empty results gracefully — an empty response is valid data, not an error to retry.
Counter-Rationalizations
| Shortcut |
Counter |
Why |
| "I'll skip discovery and check known resources" |
Always run Phase 1 discovery first |
Resource names change, new resources appear — assumed names cause errors |
| "The user only asked for a quick check" |
Follow the full discovery → analysis flow |
Quick checks miss critical issues; structured analysis catches silent failures |
| "Default configuration is probably fine" |
Audit configuration explicitly |
Defaults often leave logging, security, and optimization features disabled |
| "Metrics aren't needed for this" |
Always check relevant metrics when available |
API/CLI responses show current state; metrics reveal trends and intermittent issues |
| "I don't have access to that" |
Try the command and report the actual error |
Assumed permission failures prevent useful investigation; actual errors are informative |
Common Pitfalls
- Service ARN required: Most describe/update operations need the full ARN, not just service name
- Source types: Services can use image registry or code repository -- check
SourceConfiguration type
- Auto-scaling revisions: Each config change creates a new revision -- check
LatestRevision vs active
- VPC connector: Required for accessing private resources -- check
EgressConfiguration settings
- Paused services: Paused services don't incur compute charges but retain configuration -- check
Status
- Deployment triggers: Auto-deploy can be enabled per service -- check
AutoDeploymentsEnabled
1---2name: managing-aws-app-runner3description: Use when working with Aws App Runner — aWS App Runner service management and health analysis. Covers service inventory, deployment status, auto-scaling configurations, custom domain associations, VPC connector settings, and observability configurations. Use when inspecting App Runner services, debugging deployment failures, reviewing scaling behavior, or auditing service configurations.4---56# AWS App Runner Management Skill78Analyze and manage AWS App Runner services, deployments, and scaling configurations.910## MANDATORY: Discovery-First Pattern1112**Always list services before querying specific resources.**1314### Phase 1: Discovery1516```bash17#!/bin/bash18export AWS_PAGER=""1920echo "=== App Runner Services ==="21aws apprunner list-services --output text \22 --query 'ServiceSummaryList[].[ServiceName,ServiceArn,Status,ServiceUrl]'2324echo ""25echo "=== Service Details ==="26for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do27 aws apprunner describe-service --service-arn "$arn" --output text \28 --query 'Service.[ServiceName,Status,SourceConfiguration.ImageRepository.ImageIdentifier,InstanceConfiguration.Cpu,InstanceConfiguration.Memory]' &29done30wait3132echo ""33echo "=== Auto Scaling Configurations ==="34aws apprunner list-auto-scaling-configurations --output text \35 --query 'AutoScalingConfigurationSummaryList[].[AutoScalingConfigurationName,AutoScalingConfigurationRevision,Status]'36```3738### Phase 2: Analysis3940```bash41#!/bin/bash42export AWS_PAGER=""4344echo "=== Service Health ==="45for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do46 {47 name=$(aws apprunner describe-service --service-arn "$arn" --output text --query 'Service.ServiceName')48 status=$(aws apprunner describe-service --service-arn "$arn" --output text --query 'Service.Status')49 printf "%s\t%s\n" "$name" "$status"50 } &51done52wait5354echo ""55echo "=== Recent Operations ==="56for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do57 aws apprunner list-operations --service-arn "$arn" --output text \58 --query "OperationSummaryList[:3].[\"$(echo $arn | awk -F/ '{print $NF}')\",Type,Status,StartedAt,EndedAt]" &59done60wait6162echo ""63echo "=== Custom Domains ==="64for arn in $(aws apprunner list-services --output text --query 'ServiceSummaryList[].ServiceArn'); do65 aws apprunner describe-custom-domains --service-arn "$arn" --output text \66 --query "CustomDomains[].[DomainName,Status,CertificateValidationRecords[0].Value]" 2>/dev/null &67done68wait6970echo ""71echo "=== VPC Connectors ==="72aws apprunner list-vpc-connectors --output text \73 --query 'VpcConnectors[].[VpcConnectorName,Status,Subnets[0],SecurityGroups[0]]' 2>/dev/null74```7576## Output Format7778- Target ≤50 lines per output79- Use `--output text --query` for all commands80- Tab-delimited fields: ServiceName, Status, Source, CPU, Memory81- Aggregate deployment operations by status82- Never dump full service configuration -- extract key fields only8384## Anti-Hallucination Rules85861. **NEVER assume resource names** — always discover via CLI/API in Phase 1 before referencing in Phase 2.872. **NEVER fabricate metric names or dimensions** — verify against the service documentation or `--help` output.883. **NEVER mix CLI commands between service versions** — confirm which version/API you are targeting.894. **ALWAYS use the discovery → verify → analyze chain** — every resource referenced must have been discovered first.905. **ALWAYS handle empty results gracefully** — an empty response is valid data, not an error to retry.9192## Counter-Rationalizations9394| Shortcut | Counter | Why |95|----------|---------|-----|96| "I'll skip discovery and check known resources" | Always run Phase 1 discovery first | Resource names change, new resources appear — assumed names cause errors |97| "The user only asked for a quick check" | Follow the full discovery → analysis flow | Quick checks miss critical issues; structured analysis catches silent failures |98| "Default configuration is probably fine" | Audit configuration explicitly | Defaults often leave logging, security, and optimization features disabled |99| "Metrics aren't needed for this" | Always check relevant metrics when available | API/CLI responses show current state; metrics reveal trends and intermittent issues |100| "I don't have access to that" | Try the command and report the actual error | Assumed permission failures prevent useful investigation; actual errors are informative |101102## Common Pitfalls103104- **Service ARN required**: Most describe/update operations need the full ARN, not just service name105- **Source types**: Services can use image registry or code repository -- check `SourceConfiguration` type106- **Auto-scaling revisions**: Each config change creates a new revision -- check `LatestRevision` vs active107- **VPC connector**: Required for accessing private resources -- check `EgressConfiguration` settings108- **Paused services**: Paused services don't incur compute charges but retain configuration -- check `Status`109- **Deployment triggers**: Auto-deploy can be enabled per service -- check `AutoDeploymentsEnabled`