Migrate from GCP

Most GCP production estates use four services in earnest: Compute Engine, Cloud Functions / Cloud Run, Cloud Storage, and Cloud SQL. Each maps onto a Joule Cloud equivalent. The migration shape is the same as migrate from AWS; this page covers the GCP-specific deltas.

Service map

GCPJoule CloudNotes
Compute Engine VMComputeContainerize; deploy via invisible.hcl.
Cloud RunCompute (scale-to-zero) or FunctionsCloud Run's container model maps cleanly onto Compute with scale_min=0.
Cloud FunctionsFunctionsSame handler shape; runtime list slightly different.
Cloud StorageObject StoreGCS uses XML/JSON APIs; we expose the S3 API. Migration via gsutil + aws-cli or rclone.
Cloud SQL (Postgres)JouleDBPostgres wire-compatible.
BigQueryJouleDB columnar surfaceLimited SQL parity at launch. Bring schema + data; verify queries against the analytical surface.
Pub/SubFunctions + queue triggerLight queue at launch.
Vertex AI inferenceInferenceOpenAI-shape; replace Vertex SDK calls with OpenAI SDK pointed at our endpoint.

Cloud Storage → Object Store

GCS doesn't natively speak S3 but most clients do. Use rclone as the bridge:

# Configure rclone: one remote for GCS, one for Joule Cloud
rclone copy gcs:/my-bucket jc:/my-bucket --transfers 32 --checksum --progress

For applications, swap the GCS SDK for boto3 (Python) / @aws-sdk/client-s3 (Node) pointed at our endpoint. See Migrate from AWS S3 for the SDK config snippets — the client code is identical.

Cloud Run → Compute

Cloud Run's "deploy a container, scale to zero, billed by request" model is exactly what Compute with scale { min = 0 } provides.

workload "myservice" {
  image = "gcr.io/my-project/myservice:abc123"
  region = "auto"
  cpu = "1 vCPU"
  memory = "512 MB"
  scale {
    min = 0
    max = 100
    on_metric = "requests_per_sec > 50"
  }
}

route "myservice.example.com" {
  to = workload.myservice
}

Cloud Run's per-request billing becomes per-joule billing. For request-heavy / low-compute services, similar cost. For CPU-heavy services, you'll typically pay less because Cloud Run rounds up to 100ms allocation; we measure the actual joules.

Cloud Functions → Functions

Handler signature differs slightly. GCP's Cloud Functions (gen 2, the modern one) use HTTP-style handlers; ours are Request / Response.

// GCP gen2
- functions.http("hello", (req, res) => {
-   res.json({ hello: req.body.name });
- });

// Joule Cloud Functions
+ export default async function (req) {
+   const body = await req.json();
+   return Response.json({ hello: body.name });
+ }

Cloud SQL → JouleDB

# Cloud SQL dump
gcloud sql export sql my-instance gs://my-bucket/backup.sql --database=main
gsutil cp gs://my-bucket/backup.sql ./backup.sql

# create JouleDB
jc db create main --region eu-fi --size 100GB

# restore
psql "postgresql://jc_…@db.greenjoules.cloud:5432/main" < backup.sql

What's different from GCP's model

Why bother

For the typical Cloud Run + Cloud SQL + Cloud Storage stack, customers report 25-45% lower monthly bills (with the same redundancy posture), plus per-request joule + carbon attribution for ESG reporting that GCP's aggregated estimates can't match.