Cloud Integration
Deploy Utah applications to cloud platforms.
Overview
Utah applications can be deployed to various cloud platforms including Azure, AWS, Google Cloud, and others.
AWS Deployment
Lambda Functions
Deploy Utah scripts as AWS Lambda functions:
#!/usr/bin/env utah
script.description("AWS Lambda handler for Utah applications");
// AWS Lambda handler
function lambdaHandler(event: object, context: object): object {
  let result: object = processEvent(event);
  return {
    "statusCode": 200,
    "body": json.stringify(result)
  };
}
function processEvent(event: object): object {
  // Process the Lambda event
  return { "message": "Hello from Utah!" };
}
EC2 Instances
Deploy on EC2 with user data script:
#!/bin/bash
# Install Utah
curl -fsSL https://get.utah.sh | sh
# Deploy application
utah /app/deploy.shx
ECS Containers
Use Docker containers with ECS:
version: '3.8'
services:
  utah-app:
    image: myapp:latest
    cpu: 256
    memory: 512
    essential: true
    portMappings:
      - containerPort: 8080
        hostPort: 8080
Google Cloud Platform
Cloud Functions
Deploy as Google Cloud Functions:
#!/usr/bin/env utah
script.description("Google Cloud Function handler");
// Cloud Function entry point
function cloudFunction(req: object, res: object): void {
  let result: object = processRequest(req);
  // In actual implementation, this would use GCP response mechanisms
  console.log("Response: " + json.stringify(result));
}
function processRequest(req: object): object {
  return { "message": "Hello from Utah on GCP!" };
}
Compute Engine
Deploy on Compute Engine instances:
#!/usr/bin/env utah
script.description("GCE deployment script");
// GCE deployment script
function deployToGCE(): void {
  console.log("Deploying to Google Compute Engine...");
  let instanceName: string = "utah-app-instance";
  let zone: string = "us-central1-a";
  // Create instance
  let createCmd: string = "gcloud compute instances create ${instanceName} --zone=${zone} --machine-type=e2-micro --image-family=ubuntu-2004-lts --image-project=ubuntu-os-cloud";
  `$(${createCmd})`;
  console.log("Instance created successfully!");
}
deployToGCE();
Azure Deployment
Azure Functions
Deploy as Azure Functions:
#!/usr/bin/env utah
script.description("Azure Function handler");
// Azure Function handler
function azureFunction(context: object, req: object): void {
  let result: object = processAzureRequest(req);
  // In actual implementation, this would use Azure response mechanisms
  console.log("Response: " + json.stringify(result));
}
function processAzureRequest(req: object): object {
  return { "message": "Hello from Utah on Azure!" };
}
Azure Container Instances
Deploy using ACI:
#!/usr/bin/env utah
script.description("Deploy to Azure Container Instances");
// Deploy to Azure Container Instances
function deployToACI(): void {
  console.log("Deploying to Azure Container Instances...");
  let resourceGroup: string = "utah-app-rg";
  let containerName: string = "utah-app";
  let image: string = "myapp:latest";
  let deployCmd: string = "az container create --resource-group ${resourceGroup} --name ${containerName} --image ${image} --dns-name-label utah-app-unique --ports 8080";
  `$(${deployCmd})`;
  console.log("Container deployed successfully!");
}
deployToACI();
Best Practices
Environment Configuration
Use environment variables for configuration:
#!/usr/bin/env utah
script.description("Environment configuration for cloud deployment");
let port: string = env.get("PORT") || "8080";
let dbUrl: string = env.get("DATABASE_URL") || "localhost:5432";
let apiKey: string = env.get("API_KEY") || "";
if (apiKey == "") {
  console.log("API_KEY environment variable is required");
  exit(1);
}
console.log("Configuration loaded:");
console.log("Port: ${port}");
console.log("Database URL: ${dbUrl}");
console.log("API Key: [REDACTED]");
Health Checks
Implement health check endpoints:
#!/usr/bin/env utah
script.description("Health check implementation");
function healthCheck(): object {
  let checks: object[] = [
    checkDatabase(),
    checkExternalService(),
    checkFileSystem()
  ];
  let allHealthy: boolean = true;
  for (let check: object in checks) {
    let healthStatus: string = json.get(check, ".healthy");
    if (healthStatus != "true") {
      allHealthy = false;
    }
  }
  if (allHealthy) {
    return { "status": "healthy", "checks": checks };
  } else {
    return { "status": "unhealthy", "checks": checks };
  }
}
function checkDatabase(): object {
  // Database connectivity check
  return { "name": "database", "healthy": true };
}
function checkExternalService(): object {
  // External service check
  return { "name": "external-api", "healthy": true };
}
function checkFileSystem(): object {
  // File system check
  return { "name": "filesystem", "healthy": true };
}
Monitoring and Logging
Set up monitoring:
#!/usr/bin/env utah
script.description("Setup monitoring and logging");
function setupMonitoring(): void {
  // Configure logging
  let logLevel: string = env.get("LOG_LEVEL") || "info";
  console.log("Setting log level to: ${logLevel}");
  // Set up metrics collection
  let metricsEndpoint: string = env.get("METRICS_ENDPOINT") || "";
  if (metricsEndpoint != "") {
    console.log("Metrics will be sent to: ${metricsEndpoint}");
  }
  // Configure alerts
  let alertsEnabledStr: string = env.get("ALERTS_ENABLED") || "true";
  let alertsEnabled: boolean = alertsEnabledStr == "true";
  console.log("Alerts enabled: ${alertsEnabled}");
}
setupMonitoring();
CI/CD Integration
GitHub Actions
Example GitHub Actions workflow:
name: Deploy to Cloud
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup Utah
      run: curl -fsSL https://get.utah.sh | sh
    - name: Build
      run: utah compile src/main.shx
    - name: Deploy
      run: utah deploy/cloud.shx
      env:
        CLOUD_API_KEY: ${{ secrets.CLOUD_API_KEY }}
GitLab CI
Example GitLab CI configuration:
deploy:
  image: alpine:latest
  before_script:
    - apk add --no-cache bash curl
    - curl -fsSL https://get.utah.sh | sh
  script:
    - utah deploy/cloud.shx
  environment:
    name: production
    url: https://myapp.example.com
  only:
    - main