- contact@insightxtract.com
One Terraform workflow, four clouds. Provision a production-grade, autoscaling InsightXtract on AWS, Azure, GCP, or OCI — each wired to that cloud’s managed compute, database, object store, and model.
The Terraform distribution is a root module plus one thin module per cloud. You pick the cloud with a single variable; the module provisions the network, the managed data services, the container platform, secrets, and the load balancer — then deploys the same InsightXtract images you ran under Compose.
aws / az / gcloud / oci).terraform.tfvars — the target cloud, region, sizing, and your model provider.terraform init && terraform apply. Outputs include the console URL and API endpoint.cloud = "aws" # aws | azure | gcp | oci region = "us-east-1" environment = "prod" # sizing api_min = 2 api_max = 6 worker_min = 2 worker_max = 20 # autoscale target for bursty submissions db_instance = "db.r6g.large" db_multi_az = true db_read_replicas = 1 # model — managed on-cloud, or bring your own key llm_provider = "bedrock" # bedrock | azure_openai | vertex | oci_genai | anthropic | openai | custom llm_model = "claude-sonnet-5"
terraform init terraform apply -auto-approve # outputs: # console_url = https://insightxtract.yourco.com # api_url = https://api.insightxtract.yourco.com/api
The module maps each dependency to the cloud’s managed service, uses workload identity (no long-lived keys), and stores secrets in the native vault.
| Compute | ECS Fargate services (API + workers) behind an ALB; or EKS if you standardize on Kubernetes. |
| Database | RDS for MySQL (or Aurora MySQL) — Multi-AZ, automated backups, read replicas. |
| Object store | S3 with lifecycle & versioning; access via IAM task role. |
| Model | Amazon Bedrock (Claude) via VPC endpoint — no key leaves the account. |
| Edge / secrets | CloudFront + ACM in front of the ALB; Secrets Manager for credentials. |
module "insightxtract" { source = "insightxtract/platform/aws" region = var.region environment = "prod" compute = "fargate" # or "eks" db_engine = "aurora-mysql" db_multi_az = true llm_provider = "bedrock" worker_autoscale = { min = 2, max = 20, target_queue_depth = 30 } }
| Compute | Azure Container Apps (API + workers) with KEDA autoscaling; or AKS. |
| Database | Azure Database for MySQL — Flexible Server, zone-redundant HA, read replicas. |
| Object store | Blob Storage with lifecycle tiers; access via Managed Identity. |
| Model | Azure OpenAI (or Anthropic via key) reached over a private endpoint. |
| Edge / secrets | Azure Front Door + managed certs; Key Vault for credentials. |
module "insightxtract" { source = "insightxtract/platform/azure" location = "eastus" compute = "container_apps" # or "aks" db_ha = "zone_redundant" llm_provider = "azure_openai" worker_autoscale = { min = 2, max = 20, target_queue_depth = 30 } }
| Compute | Cloud Run services (API + workers) with request/concurrency autoscaling; or GKE Autopilot. |
| Database | Cloud SQL for MySQL — HA (regional), automated backups, read replicas. |
| Object store | Cloud Storage with lifecycle; access via Workload Identity. |
| Model | Vertex AI (Claude on Vertex or Gemini) via private access. |
| Edge / secrets | Cloud Load Balancing + managed certs; Secret Manager. |
module "insightxtract" { source = "insightxtract/platform/gcp" project = var.project_id region = "us-central1" compute = "cloud_run" # or "gke_autopilot" db_ha = "regional" llm_provider = "vertex" worker_autoscale = { min = 2, max = 20, max_concurrency = 4 } }
| Compute | OKE (Container Engine for Kubernetes) with cluster autoscaler; or Container Instances for smaller footprints. |
| Database | MySQL HeatWave — HA, automatic backups, read replicas. |
| Object store | OCI Object Storage with lifecycle; access via Instance/Workload Principals. |
| Model | OCI Generative AI (Cohere/Llama) or Anthropic via key over a service gateway. |
| Edge / secrets | OCI Load Balancer + certs; OCI Vault for credentials. |
module "insightxtract" { source = "insightxtract/platform/oci" compartment_id = var.compartment_ocid region = "us-ashburn-1" compute = "oke" # or "container_instances" db_shape = "MySQL.HeatWave" llm_provider = "oci_genai" worker_autoscale = { min = 2, max = 20, target_cpu = 65 } }
The images never change. Whichever cloud you choose, it runs the same api, console, worker, and vector containers from Compose — so behavior is identical across environments, and you can move clouds without re-testing the application.
InsightXtract is built to scale the part that does the work — the extraction workers — independently of everything else, and to keep the durable tiers highly available.
Extraction is the compute-heavy, bursty workload: a batch of submissions arrives, workers spike, then drain. Workers are stateless and pull from a work queue, so the platform autoscaler adds replicas on queue depth (preferred) or CPU, up to worker_max, and scales back to worker_min when idle.
| Tier | How it scales | Signal |
|---|---|---|
| Workers | Horizontal replicas, autoscaled | Queue depth / CPU |
| API | Horizontal replicas behind the LB | Requests / CPU |
| Console | CDN + replicas | Static — effectively unlimited |
| Database | Vertical + read replicas; Multi-AZ failover | Connections / CPU / IOPS |
| Object store | Elastic (managed) | — |
| Model calls | Bounded by provider quota; per-worker WORKER_CONCURRENCY | Provider limits |
Tune throughput with two dials. worker_max sets how wide the fleet can burst; WORKER_CONCURRENCY sets parallel extractions per replica. Raise them together only as far as your model quota and database connections allow — the guides include sizing tables.
Bump the image tag and terraform apply. The platform does a rolling deploy — new replicas come up healthy before old ones drain — and database migrations are backward-compatible, so the API stays available throughout. Roll back by re-applying the previous tag.
/api/health) for LB and orchestrator probes.Want us to run the first deployment with you? We provide the Terraform distribution, a sizing worksheet for your volume, and a guided install. Talk to us →