Infrastructure as Code

ISV Sandbox
Vending Machine

Spin up fully-provisioned ISV environments (Databricks, Snowflake, Confluent) in minutes. Auto-cleanup when you're done. Zero manual teardown.

Deploy Now View Source
~5min
Provision Time
100%
Auto-Cleanup
1
ISVs Supported

Architecture Overview

A self-service platform that provisions, manages, and automatically tears down ISV environments on AWS

AWS Employee
SA / Specialist / CSM
GitLab CI/CD
Terraform Pipeline
Terraform
AWS + ISV Providers
ISV Environment
Databricks / Snowflake
TTL Cleanup
Auto-Destroy on Expiry

Modular Terraform

Pre-built, hardened modules per ISV. Parameterized for owner, TTL, cost center, and environment size.

Guardrails Built-in

SCPs, budget alerts, permission boundaries, and mandatory tagging ensure cost control and blast radius limits.

Automatic Cleanup

TTL-based expiry with EventBridge + Lambda. Get reminded before destruction. Extend with one click.

Cost Visibility

Per-environment cost tracking via tags. Daily cost reports. Budget thresholds with auto-notification.

Environment Lifecycle

From request to cleanup — fully automated, zero manual intervention

1

Request

Open MR with params (ISV, size, TTL)

2

Provision

CI/CD runs terraform apply

3

Use

Environment ready, credentials in Secrets Manager

4

Remind

Slack/email notification before expiry

5

Cleanup

terraform destroy on TTL expiry

LayerToolPurpose
IaC EngineTerraformProvision AWS infra + ISV resources via dual providers
CI/CDGitLab CIPipeline: plan, apply, tag, schedule destroy
StateS3 + DynamoDBTerraform remote state with locking
SecretsSecrets ManagerISV credentials and API tokens
SchedulingEventBridgeTTL expiry triggers and reminder notifications
NotificationsSNS + SlackExpiry reminders, cost alerts, provision confirmations
CostAWS BudgetsPer-environment budget caps with auto-alerts

ISV Catalog

Supported ISV environments — deploy any of these with a single merge request

Databricks
Live
Snowflake
Planned
Confluent
Planned
MongoDB Atlas
Planned
Elastic Cloud
Planned
Datadog
Planned

Getting Started

Deploy your first ISV sandbox in 3 steps

bash
# 1. Clone the repository
git clone git@gitlab.aws.dev:rohitvas/isv-sandbox-vending-machine.git
cd isv-sandbox-vending-machine

# 2. Create your environment config
cp environments/template.tfvars environments/my-demo.tfvars

# 3. Edit your config
isv_type       = "databricks"
owner_email    = "yourname@amazon.com"
ttl_hours      = 72
environment    = "demo"
cost_center    = "your-cost-center"

# 4. Push and create MR
git checkout -b deploy/my-demo
git add . && git commit -m "Deploy Databricks sandbox"
git push origin deploy/my-demo

Step 1: Clone & Configure

Clone the repo, copy the template tfvars, and fill in your ISV choice, TTL, and ownership details.

Step 2: Create Merge Request

Push your branch and open an MR. The pipeline runs terraform plan and shows what will be created.

Step 3: Merge & Deploy

Approve the MR, CI runs terraform apply, credentials appear in Secrets Manager. Done.

Project Structure

Clean, modular Terraform with clear separation of concerns

tree
isv-sandbox-vending-machine/
+-- modules/
|   +-- databricks/
|   |   +-- main.tf              # Workspace, clusters, Unity Catalog
|   |   +-- networking.tf        # VPC, subnets, security groups
|   |   +-- iam.tf               # Cross-account IAM roles
|   |   +-- storage.tf           # S3 buckets for DBFS root
|   |   +-- variables.tf
|   |   +-- outputs.tf
|   +-- cleanup/
|   |   +-- main.tf              # EventBridge rule + Lambda
|   |   +-- lambda/destroy.py    # Triggers terraform destroy
|   |   +-- variables.tf
|   +-- notifications/
|       +-- main.tf              # SNS + Slack webhook
|       +-- variables.tf
+-- environments/
|   +-- template.tfvars          # Copy this for new envs
|   +-- examples/
+-- .gitlab-ci.yml               # CI/CD pipeline definition
+-- main.tf                      # Root module composition
+-- providers.tf                 # AWS + Databricks providers
+-- backend.tf                   # S3 remote state config
+-- variables.tf                 # Input variables
+-- README.md