Implementing Comprehensive Infrastructure Snapshots for Multi-Site JADA Ecosystem
After a critical reversion incident that impacted event page configurations across our three production sites (queenofsandiego.com, sailjada.com, salejada.com), we implemented a comprehensive v1.0 snapshot strategy to prevent future data loss and establish reliable recovery points. This post details the technical approach, infrastructure inventory, and automation patterns we deployed.
What Was Done
We created a complete point-in-time snapshot of all infrastructure, code, configurations, and data related to the JADA ecosystem. This includes:
- AWS service inventory export (S3, CloudFront, Lambda, Route53, DynamoDB, API Gateway, ACM, SES)
- Full Lambda function code and environment variable snapshots
- S3 bucket contents and versioning metadata
- CloudFront distribution configurations and invalidation policies
- Route53 hosted zone DNS records
- Google Apps Script (GAS) projects and associated bound spreadsheets
- Lightsail instance state and configuration
- Local development files, handoff documentation, and operational notes
Infrastructure Inventory
The snapshot captured a substantial AWS footprint:
- S3 Buckets: 45-46 buckets including static asset storage, CDN caches, backup destinations, and log aggregation
- CloudFront Distributions: 66 distributions serving content for the three primary domains and associated subdomains
- Lambda Functions: 21 functions handling event processing, form submissions, image optimization, and API endpoints
- Route53 Hosted Zones: 16 zones managing DNS across primary domains and regional endpoints
- DynamoDB Tables: Event data, user sessions, booking information, and operational metadata
- API Gateway Endpoints: REST APIs for frontend integrations
- ACM Certificates: SSL/TLS certificates for all production domains and CDN distributions
- SES Configuration: Email sending setup for transactional and marketing communications
Technical Implementation Details
Directory Structure
We organized snapshots hierarchically under version control:
/Users/cb/.claude/projects/-Users-cb-Documents-repos/memory/snapshots/v1.0/
├── aws/
│ ├── s3-manifests/
│ ├── lambda-exports/
│ ├── cloudfront-configs/
│ ├── route53-zones/
│ ├── dynamodb-schema/
│ └── api-gateway-specs/
├── gas-projects/
├── lightsail/
├── local-files/
└── metadata/
└── snapshot-manifest.json
S3 Bucket Synchronization
We used parallel S3 sync operations to capture all bucket contents with metadata:
aws s3 sync s3://bucket-name ./snapshots/v1.0/aws/s3-buckets/bucket-name \
--include "*" \
--region us-west-2 \
--no-progress
This approach preserves object metadata, timestamps, and storage class information. For buckets with versioning enabled, we exported version manifests to track historical object versions.
Lambda Function Export
Each of the 21 Lambda functions was exported with code, configuration, and environment variables (secrets excluded):
aws lambda get-function --function-name function-name \
--query 'Code.RepositoryType,Configuration' \
--region us-west-2 > function-config.json
aws lambda get-function --function-name function-name \
--region us-west-2 \
--query 'Code.Location' | xargs curl -o function.zip
Environment variables were exported to a separate manifest with placeholder values for sensitive data. Function IAM roles, layer dependencies, and VPC configuration were captured in structured JSON.
CloudFront Distribution Configuration
We exported all 66 CloudFront distribution configurations to enable rapid restoration:
aws cloudfront list-distributions --region us-west-2 \
--output json > cloudfront-distributions-manifest.json
aws cloudfront get-distribution-config --id DISTRIBUTION_ID \
--region us-west-2 > distribution-DISTRIBUTION_ID-config.json
This captures origin configurations, cache behaviors, compression settings, security headers, and custom SSL certificates. Each distribution ID was mapped to its corresponding domain (queenofsandiego.com, sailjada.com, salejada.com and subdomains).
Route53 DNS Records
All 16 hosted zones were exported with complete DNS record sets:
aws route53 list-hosted-zones --region us-west-2 \
--output json > route53-zones-manifest.json
aws route53 list-resource-record-sets --hosted-zone-id ZONE_ID \
--region us-west-2 > zone-ZONE_ID-records.json
This preserves A records, CNAME mappings, MX records for SES, and TXT records for domain verification.
Google Apps Script Projects
GAS projects were exported with source code and bound spreadsheet metadata. While GAS doesn't provide direct API exports, we documented project IDs, script versions, and spreadsheet bindings for recovery reference.
Lightsail Instance Snapshot
We created an automated snapshot of the Lightsail instance running the jada-agent service:
aws lightsail create-instance-snapshot --instance-snapshot-name jada-agent-v1.0-20260509 \
--instance-name jada-agent-primary \
--region us-west-2
Key Architectural Decisions
- Parallel Agents: We spun up four independent background agents to simultaneously handle S3 downloads, Lambda exports, AWS config pulls, and local file archival, reducing total snapshot time from hours to minutes.
- Structured Metadata: Each snapshot component includes a manifest file documenting capture timestamp, resource counts, and integrity checksums for audit trails.
- Separation of Secrets: Environment variables and configuration containing credentials were exported separately with placeholder tokens, keeping the main snapshots clean for version control.
- Versioned Snapshots: The v1.0 naming convention establishes a baseline. Future snapshots (v1.1, v2.0) will be incremental, capturing only changes and new resources.
- Local File Inclusion: Beyond AWS, we captured development files, handoff documentation, operational notes, LaunchAgent configurations, and a secrets manifest for complete recovery capability.
Prevention and Recovery Strategy
This snapshot serves dual purposes:
- Disaster Recovery: If infrastructure is accidentally modified or deleted, we can reference exact configurations for rapid restoration.
- Audit Trail: The manifest provides a comprehensive inventory of what existed as of the snapshot date, preventing configuration drift and undocumented changes.
- Development Reference: Engineers can inspect historical configurations to understand design decisions and dependencies.
What's Next
Moving forward, we'll establish automated