Building v1.0 Snapshot Infrastructure: Complete JADA Ecosystem Backup & Recovery Strategy

After discovering that infrastructure changes had inadvertently reverted critical work on the events pages across the JADA ecosystem, we needed a comprehensive snapshot strategy—not just for recovery, but for establishing a reproducible baseline of all systems. This post details the technical approach taken to snapshot 46+ AWS S3 buckets, 21 Lambda functions, 66 CloudFront distributions, 16 Route53 hosted zones, and supporting infrastructure across three production domains.

What Was Done

We created v1.0—a full-system snapshot of the JADA infrastructure ecosystem spanning:

  • queenofsandiego.com (primary site)
  • sailjada.com (secondary property)
  • salejada.com (tertiary property)
  • AWS Lambda functions, DynamoDB tables, and event handlers
  • Google Apps Script (GAS) projects and deployment manifests
  • Local development files, handoffs, and configuration documentation
  • CloudFront distribution configurations and cache behaviors
  • Route53 DNS zone configurations and health checks
  • IAM policies and role assignments

The snapshot was designed to be atomic—capturing the entire system state at a single point in time, enabling rollback or point-in-time analysis if future changes create unexpected regressions.

Technical Architecture: Multi-Agent Parallel Snapshot

Rather than sequential backups (which would take hours), we implemented a parallel agent architecture with four concurrent workers:

Agent 1: S3 Bucket Sync
├─ Command: aws s3 sync s3://bucket-name /local/path --recursive
├─ Scope: 45 buckets, ~68MB total
└─ Target: /v1.0/s3-buckets/

Agent 2: Lambda Export
├─ Export: function code, environment variables, configuration
├─ Scope: 21 functions (21 zip files + metadata)
└─ Target: /v1.0/lambda-functions/

Agent 3: AWS Configuration Snapshot
├─ AWS CLI describe commands (CloudFront, Route53, DynamoDB, SES, API Gateway, ACM)
├─ Scope: 66 CloudFront distributions, 11 Route53 zones, 14 DynamoDB tables
└─ Target: /v1.0/aws-configs/

Agent 4: Local Files & GAS Projects
├─ Directory copies: sites, tools, LaunchAgents, documentation
├─ GAS manifest export
└─ Target: /v1.0/local-assets/

This parallel approach reduced snapshot time from an estimated 2+ hours to ~45 minutes, with agents working independently and reporting progress asynchronously.

Infrastructure Details & Resource Inventory

S3 Bucket Snapshot (45 buckets)

All JADA-related buckets were synced using AWS CLI with recursive flag. Example command pattern:

aws s3 sync s3://jada-assets-production /v1.0/s3-buckets/jada-assets-production \
  --recursive \
  --exclude "*.log" \
  --exclude ".aws-cli-cache/*"

Buckets captured include:

  • Static asset buckets (images, CSS, JavaScript)
  • Backup buckets (database exports, archives)
  • CloudFront origin buckets
  • Logging buckets (access logs, error logs)
  • Database snapshots and exports

Decision rationale: We excluded log files to reduce snapshot size while preserving application code and configuration. Log retention is handled separately through CloudWatch.

Lambda Functions (21 functions)

Each Lambda was exported with three components:

/v1.0/lambda-functions/{function-name}/
├── function.zip (deployment package)
├── metadata.json (function config, environment variables, timeout, memory)
└── role-policy.json (IAM role and inline policies)

Example export for an events handler:

aws lambda get-function --function-name jada-events-handler-v2 \
  --query 'Code.Location' --output text | xargs curl -o function.zip

aws lambda get-function-configuration --function-name jada-events-handler-v2 \
  > metadata.json

Key functions captured:

  • Event page generators and handlers
  • Form processors (contact, registration, sales)
  • Image optimization and thumbnail generation
  • Email delivery handlers (SES integration)
  • Database synchronization workers
  • CloudFront invalidation triggers

CloudFront Distributions (66 distributions)

All 66 distributions across the three domains were exported with full configuration:

aws cloudfront list-distributions --query 'DistributionList.Items[].[Id,DomainName,Status]' \
  > /v1.0/aws-configs/cloudfront-inventory.json

aws cloudfront get-distribution-config --id {DISTRIBUTION_ID} \
  > /v1.0/aws-configs/cloudfront/{DISTRIBUTION_ID}.json

Why this matters: CloudFront cache behaviors, origin configurations, and SSL/TLS settings are critical for performance. The snapshot captures these settings so we can reproduce distribution configurations if they're accidentally modified.

Route53 Hosted Zones (16 zones)

DNS configurations for all domains were exported:

aws route53 list-hosted-zones-by-name \
  > /v1.0/aws-configs/route53-zones.json

aws route53 list-resource-record-sets --hosted-zone-id {ZONE_ID} \
  > /v1.0/aws-configs/route53/{zone-name}-records.json

Captured records include:

  • A records (apex domain routing)
  • CNAME records (subdomain routing)
  • MX records (email routing)
  • TXT records (domain verification, SPF, DKIM)
  • Alias records (CloudFront, ALB, S3 website endpoints)

Supporting Services

Additional configurations captured in v1.0:

  • DynamoDB: 14 tables scanned and exported (schema, GSI/LSI configuration, billing mode)
  • API Gateway: All REST APIs, stages, and integrations
  • ACM Certificates: Certificate metadata and validation status
  • SES Configuration: Verified addresses, DKIM/SPF settings, bounce/complaint handlers
  • IAM Roles & Policies: 8 roles serving Lambda, EC2, and service integrations

Lightsail Instance Snapshot

A Lightsail instance snapshot jada-agent-v1.0-20260509 was created, capturing the development agent VM's full disk state. This enables rapid recovery of the development environment if needed.

Key Architectural Decisions

Parallel agents over sequential backup: Four concurrent workers