Architecture
POSTs to the same Cloud Run URL with a different Action. The handler downloads its inputs from GCS into the container’s filesystem, runs the matching OSS primitive, uploads the output back to GCS, and returns a small JSON result. The workflow accumulates every step’s result and returns { Plan, Chunks, Assemble }.
Why Cloud Run is simpler than Lambda here
Cloud Run runs a container image, so the Chrome story collapses to aDockerfile line. There’s no 250 MB ZIP ceiling, no @sparticuz/chromium runtime decompression, and no packaging probe — the image installs the same pinned chrome-headless-shell build the production renderer uses. Cloud Run gen2 also gives more headroom than Lambda: up to a 60-minute request timeout and 32 GiB of memory.
Deploy
The Terraform module atpackages/gcp-cloud-run/terraform provisions the GCS bucket, the Cloud Run service, the Cloud Workflows definition, two least-privilege service accounts, and a runaway-request alert.
render_bucket_name, service_url, workflow_name, and region. Pass those into the SDK.
The target GCP project must have billing enabled — Cloud Run, Cloud Workflows, Artifact Registry, and Cloud Build are all billed services.
Render
data-composition-variables on the composition and pass config.variables. The Cloud Workflows execution argument is capped at 512 KiB, so pass media as URL references the composition resolves at render time rather than inlining base64.
End-to-end smoke
examples/gcp-cloud-run/scripts/smoke.sh builds the image, applies the Terraform module, renders a fixture composition through the workflow at one or more chunk sizes, PSNR-compares each output against the in-process baseline, and tears the stack down.
Supported formats
Same as the distributed pipeline everywhere:mp4 (H.264 / H.265), webm (VP9), mov (ProRes), and png-sequence. HDR mp4 is not supported in distributed mode.