Skip to content

Cloud DB cookbook — page index Community

Status: 10/10 provider pages as of 2026-05-22.

A side-by-side catalog of every Querycop cookbook page in this directory. The full per-provider walkthroughs live behind the links below; the matrices on this page exist so you can pick the right page (and spot the differences between providers) without reading all ten.

For the cookbook’s conventions, page format, and maintenance contract, see README.md.

PageProvider
alloydb.mdGoogle AlloyDB for PostgreSQL
azure-postgresql.mdAzure Database for PostgreSQL — Flexible Server
cloud-sql-postgresql.mdGoogle Cloud SQL for PostgreSQL
cockroach-cloud.mdCockroachDB Cloud (Basic / Standard / Advanced)
neon.mdNeon serverless PostgreSQL
planetscale.mdPlanetScale (Vitess-on-MySQL)
rds-mysql.mdAWS RDS for MySQL + Aurora MySQL
rds-postgresql.mdAWS RDS for PostgreSQL + Aurora PostgreSQL
supabase.mdSupabase (direct + Supavisor pooler)
timescale-cloud.mdTimescale Cloud (managed TimescaleDB)

The order pages landed in main — a useful guide for which providers were validated first and against what Querycop version.

TierPageLanded in
Sample (P0 format ratification)rds-postgresql.mdPR #93
P0cloud-sql-postgresql.mdPR #94
P0neon.mdPR #94
P0supabase.mdPR #94
P1alloydb.mdPR #95
P1rds-mysql.mdPR #95
P1planetscale.mdPR #95
P2azure-postgresql.mdPR #96
P2cockroach-cloud.mdPR #96
P2timescale-cloud.mdPR #96

What auth patterns each page covers, and what BACKEND_TLS_MODE the cookbook default uses. The full env-var TL;DR tables live at the top of each page.

PageAuth patternsTLS defaultWhy verify-ca / verify-full
rds-postgresql.mdPassword + IAM (aws rds generate-db-auth-token)verify-fullRDS cert SAN matches public DNS
rds-mysql.mdPassword + IAM (same AWS tooling, MySQL AWSAuthenticationPlugin)verify-fullRDS cert SAN matches public DNS
cloud-sql-postgresql.mdPassword + IAM (gcloud sql generate-login-token)verify-ca (default); verify-full via dnsNames recipePer-instance cert SAN ≠ IP; dnsNames field populated only for PSC / cluster-DNS instances
alloydb.mdPassword + IAM (gcloud auth print-access-token OAuth2)verify-ca (default); verify-full via matching DNS recipePer-cluster cert SAN ≠ IP; requires a matching DNS name (Service Directory / Private DNS / PSC DNS)
azure-postgresql.mdPassword + Microsoft Entra ID (az account get-access-token --resource-type oss-rdbms)verify-fullPublicly-trusted root chain (DigiCert G2 / Microsoft RSA 2017); cert SAN matches *.postgres.database.azure.com
supabase.mdPassword (direct + Supavisor pooler)verify-fullPer-project cert SAN matches the project hostname
neon.mdPassword (direct + PgBouncer pooler)verify-fullLet’s Encrypt cert SAN matches the SNI-routed hostname
planetscale.mdBranch password (per-branch dashboard-generated)verify-fullLet’s Encrypt cert SAN matches *.connect.psdb.cloud
cockroach-cloud.mdSQL-user password (Basic / Standard / Advanced)verify-fullPer-cluster cert SAN matches the dashboard FQDN; tenant routing is hostname-encoded
timescale-cloud.mdPasswordverify-fullLet’s Encrypt cert SAN matches the per-service hostname

What backend port to dial and where the CA bundle comes from. The non-5432 ports and the per-cluster / per-project bundle sources are the most common first-setup misfires.

PageBackend portBACKEND_TLS_CA_FILE source
rds-postgresql.md5432AWS global bundle (truststore.pki.rds.amazonaws.com/global/global-bundle.pem)
rds-mysql.md3306AWS global bundle (same file as RDS PG)
cloud-sql-postgresql.md5432Per-instance, via gcloud sql instances describe ... serverCaCert.cert
alloydb.md5432Per-cluster, via Cloud Console download or REST GenerateClientCertificateResponse.caCert
azure-postgresql.md5432OS root bundle (publicly-trusted chain)
supabase.md5432 (direct) / 6543 transaction / 5432 session (pooler)Per-project, downloaded from dashboard
neon.md5432OS root bundle (Let’s Encrypt)
planetscale.md3306OS root bundle (Let’s Encrypt)
cockroach-cloud.md26257Per-cluster, downloaded from dashboard
timescale-cloud.mdper-service custom portOS root bundle (Let’s Encrypt)

The Pattern B IAM-auth BACKEND_TOKEN_CMD value for each provider that exposes one. Pages without a row don’t have an IAM-equivalent at the SQL wire layer.

PageBACKEND_TOKEN_CMD shapeToken lifetimeMints per
rds-postgresql.mdaws rds generate-db-auth-token --hostname "$QUERYCOP_BACKEND_HOST" --port 5432 --region <r> --username "$QUERYCOP_BACKEND_USER"15 min (mint → handshake window)connection
rds-mysql.mdSame aws rds generate-db-auth-token with --port 330615 minconnection
cloud-sql-postgresql.mdgcloud sql generate-login-token60 min (mint → handshake window)connection
alloydb.mdgcloud auth print-access-token (OAuth2 access token)60 minconnection
azure-postgresql.mdaz account get-access-token --resource-type oss-rdbms --query accessToken -o tsv60 minconnection

For all 5 IAM-supporting providers, the lifetime applies to the mint → handshake window only; once the server accepts the token during auth, it does not re-check during steady-state traffic. A successfully-authed connection stays alive for the TCP socket’s lifetime regardless of the token’s nominal expiry.

GATEKEEPER_BACKEND_POOLER is an observability-only topology hint: when set, Querycop logs a single startup line describing the pooler’s session-mode constraints. It does NOT inspect or filter client SQL. Leaving it unset (or none) preserves the previous silent behavior.

PageRecommended valueWhen the recipe applies
neon.mdpgbouncer-txnPointing Querycop at <endpoint-id>-pooler.…neon.tech (the PgBouncer-backed pooler endpoint). The direct endpoint stays unset.
supabase.mdpgbouncer-txn (port 6543) or pgbouncer-session (port 5432)Pointing Querycop at aws-0-<region>.pooler.supabase.com. Match the value to the port. The direct endpoint stays unset.
planetscale.mdvitessAlways — every PlanetScale connection rides Vitess.

All other pages leave the flag unset because their cookbook recipe points Querycop at a direct (non-pooled) endpoint by default.

The single most operator-disruptive footgun per page. Click through for the full Gotchas section on each page.

PageHeadline gotcha
rds-postgresql.mdIAM token 15-min lifetime applies to mint → handshake only, not connection lifetime
rds-mysql.mdClient needs --enable-cleartext-plugin so it sends the password packet Querycop rewrites with the IAM token
cloud-sql-postgresql.mdverify-full requires a DNS name from the instance’s dnsNames field — for vanilla public-IP instances, stay on verify-ca
alloydb.mdalloydb.iam_authentication=on is a per-instance flag (primary + each read-pool instance), and the principal needs roles/serviceusage.serviceUsageConsumer on top of roles/alloydb.databaseUser
azure-postgresql.mdEntra ID username format differs: UPN for user principals vs display name (NOT app ID / object ID) for service principals registered via pgaadauth_create_principal_with_oid
supabase.mdDirect endpoint resolves IPv6-only on the default plan; either enable the IPv4 add-on, use the Supavisor pooler (IPv4), or add IPv6 to the Querycop host network
neon.mdNeon routes by TLS SNIBACKEND_HOST must be the project-encoded hostname, never an IP literal; pooler endpoint trades session-bound features for connection density
planetscale.mdAuth is branch passwords (dashboard-generated per branch + role), NOT PlanetScale service tokens (those are control-plane / REST API credentials)
cockroach-cloud.mdTenant routing is encoded in the FQDN (no options=--cluster=... needed — that token is deprecated); port is 26257, not 5432
timescale-cloud.mdEach service is provisioned with its own custom port (not 5432); the port is stable for the service’s lifetime and must be in any egress-firewall allow-list
  • README.md — cookbook conventions, page format, maintenance contract
  • ../configuration.md — full Querycop env-var reference (the cookbook quotes §1.5 backend TLS and §1.6 BACKEND_TOKEN_CMD throughout)
  • ../known-limitations.md — MySQL protocol coverage gaps (cited from rds-mysql.md, planetscale.md)
  • ../rbac-policy-guide.md — RBAC policy authoring (cited from timescale-cloud.md)