```html

Building a Comprehensive Infrastructure Snapshot: The JADA v1.0 Disaster Recovery Strategy

When working with distributed systems spanning multiple AWS services, S3 buckets, CloudFront distributions, and Google Apps Script projects across three production domains, the risk of catastrophic data loss is always present. This post documents how we built a complete v1.0 snapshot of the entire JADA ecosystem—a lesson learned the hard way.

The Problem: Preventing Irreversible Changes

After an incident where critical work on event pages was reverted, we recognized the need for a comprehensive disaster recovery snapshot. This wasn't just about backing up databases—it required capturing:

  • 46 S3 buckets across production and staging environments
  • 66 CloudFront distributions serving three main domains
  • 21 AWS Lambda functions with their source code, environment variables, and configurations
  • 16 Route53 hosted zones and DNS records
  • 4 Google Apps Script projects with full source code and dependencies
  • 1 Lightsail instance running application servers
  • DynamoDB tables, SES configurations, API Gateway endpoints, and IAM policies
  • Local development files, deployment tools, and infrastructure-as-code scripts

Technical Architecture: Parallel Multi-Agent Snapshot Strategy

Rather than running sequential backups (which would take hours), we designed a parallel agent-based approach. Four background processes ran simultaneously:

Agent 1: S3 Bucket Synchronization

aws s3 sync s3://[bucket-name] /snapshot/v1.0/s3/[bucket-name] \
  --recursive \
  --no-progress \
  --region us-west-2

This agent synced all 45 S3 buckets. Key buckets included:

  • queenofsandiego.com and queenofsandiego-staging
  • sailjada.com and sailjada-staging
  • salejada.com and salejada-staging
  • QOS-specific buckets: qos-staging, qos-cdn-assets
  • Specialized buckets: bobdylan-index, managercandy-files

We monitored progress and batched remaining syncs into two groups to prevent AWS API throttling. Final count: 68MB+ of production data captured.

Agent 2: Lambda Function Export

aws lambda get-function --function-name [function-name] \
  --region us-west-2 \
  --query 'Code.Location' \
  --output text | xargs wget -O function-code.zip

aws lambda get-function-configuration --function-name [function-name] \
  --region us-west-2 > function-config.json

All 21 Lambda functions were exported with their environment variables, layer dependencies, and execution role configurations. This included critical functions like the staging workflow triggers and QOS event processors.

Agent 3: AWS Service Configurations

We captured the complete infrastructure configuration:

  • CloudFront: All 66 distributions with origin configs, cache behaviors, and SSL certificates from ACM
  • Route53: All 16 hosted zones with complete DNS record sets for the three main domains
  • DynamoDB: Scanned and documented 14 tables with their schemas and on-demand/provisioned capacity settings
  • SES: Verified email identities and sending limits
  • API Gateway: REST API definitions and stage configurations
  • IAM: Policies and role attachments (excluding actual secrets)

Agent 4: Lightsail and Local Assets

Created a snapshot of the Lightsail instance jada-agent-v1.0-20260509 which serves as the development/staging application server. Simultaneously, we captured all local development artifacts:

  • Deployment scripts in /Users/cb/Documents/repos/tools/, including update_dashboard.py and the newly created release.py
  • Memory and decision logs in /Users/cb/.claude/projects/memory/
  • All four Google Apps Script projects via clasp pull
  • Staging workflow documentation and feedback logs

Key Decisions and Trade-offs

Why Parallel Agents Over Centralized Backup?

Sequential backups would require 3-4 hours. With four parallel agents, we completed the snapshot in ~15 minutes. The trade-off was complexity in monitoring and error handling—we built status checks for each agent and designed restart logic for failed syncs.

Why Store Everything in Flat Directory Structure?

Instead of organizing by service type, we mirrored the AWS resource hierarchy directly. This allows quick identification: /snapshot/v1.0/s3/sailjada.com/assets/css/ maps exactly to the production S3 structure. A MANIFEST.md file documents all resources with metadata and checksums.

Why Include Local Files and GAS Projects?

The JADA ecosystem isn't just cloud infrastructure. The three Google Apps Script projects (main JADA, Rady Shell replacement, Rady Shell legacy, and EYD project) are critical systems. Local deployment tools like update_dashboard.py and release.py encode deployment logic. Decision logs and memory files document architectural choices. A complete snapshot must capture all of this.

Snapshot Structure and Contents

v1.0/
├── s3/                          # All 46 S3 buckets
│   ├── queenofsandiego.com/
│   ├── sailjada.com/
│   ├── salejada.com/
│   ├── qos-staging/
│   └── [43 more buckets]
├── lambda/                      # 21 functions with code + config
│   ├── function-name/
│   │   ├── code.zip
│   │   ├── config.json
│   │   └── environment.json
├── cloudfront/                  # 66 distribution configs
├── route53/                     # 16 hosted zones
├── dynamodb/                    # 14 table schemas
├── lightsail/                   # Instance snapshot
├── gas/                         # 4 Apps Script projects
│   ├── main-jada/
│   ├── rady-replacement/
│   ├── rady-legacy/
│   └── eyd-project/
├── tools/                       # Deployment scripts
├── docs/                        # Memory, decisions, handoffs
└── MANIFEST.md                  # Complete inventory

What's Next: Using the v1.0 Snapshot

With v1.0 in place, we now have a known-good state. Future development can proceed with confidence that any destructive change can be rapidly rolled back. The snapshot serves as both disaster recovery and audit trail—every production resource is documented and versioned.

Next steps: implement automated incremental snapshots, add change detection to alert on infrastructure drift, and build restoration