fix(functions): lower global maxInstances 20→5 to fit the Cloud Run CPU quota
2nd-gen deploy failed with "Quota exceeded for total allowable CPU per project per region": each function is a Cloud Run service and the regional CPU-allocation quota is charged as the sum of (maxInstances × vCPU) across all functions. At maxInstances 20 × ~34 v2 functions = ~680 vCPU, over this new project's default (~560). Dropping to 5 → 170 vCPU, well under. 5 instances × ~80 concurrent requests still serves ~400 in flight — fine pre-launch. For production, request a Cloud Run CPU quota increase and raise this back up. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
30eaa0cd61
commit
9b62957052
|
|
@ -9,13 +9,18 @@ const v2_1 = require("firebase-functions/v2");
|
||||||
* no region override (di/SecurityModule.kt, data/remote/FirestoreAnswerDataSource.kt), so the
|
* no region override (di/SecurityModule.kt, data/remote/FirestoreAnswerDataSource.kt), so the
|
||||||
* callables MUST live in us-central1 or every install breaks. Do not change without also
|
* callables MUST live in us-central1 or every install breaks. Do not change without also
|
||||||
* pinning the client.
|
* pinning the client.
|
||||||
* maxInstances: a runaway-bill guardrail, not a throughput target (v2 serves ~80 concurrent
|
* maxInstances: a runaway-bill guardrail AND a Cloud Run quota constraint. Each 2nd-gen function
|
||||||
* requests per instance, so 20 instances is ample at current scale). Revisit at launch.
|
* is a Cloud Run service, and the project's regional "total CPU allocation" quota is charged as
|
||||||
|
* the SUM of (maxInstances x vCPU) across every function. With ~34 v2 functions and a new
|
||||||
|
* project's default quota (~560 vCPU in us-central1), this must stay low or deploys fail with
|
||||||
|
* "Quota exceeded for total allowable CPU per project per region". 5 x 34 = 170, well under.
|
||||||
|
* For production: request a Cloud Run CPU quota increase (console → IAM & Admin → Quotas) and
|
||||||
|
* raise this. ~80 concurrent requests per instance means 5 instances still serves ~400 in flight.
|
||||||
*
|
*
|
||||||
* This module is imported FIRST in index.ts so these options are set before any v2 function is
|
* This module is imported FIRST in index.ts so these options are set before any v2 function is
|
||||||
* defined. It has no effect on the one v1 holdout (onUserDelete), which keeps its own defaults.
|
* defined. It has no effect on the one v1 holdout (onUserDelete), which keeps its own defaults.
|
||||||
*/
|
*/
|
||||||
(0, v2_1.setGlobalOptions)({ region: 'us-central1', maxInstances: 20 });
|
(0, v2_1.setGlobalOptions)({ region: 'us-central1', maxInstances: 5 });
|
||||||
/** Region constant for any per-function override that ever needs to pin it explicitly. */
|
/** Region constant for any per-function override that ever needs to pin it explicitly. */
|
||||||
exports.REGION = 'us-central1';
|
exports.REGION = 'us-central1';
|
||||||
//# sourceMappingURL=options.js.map
|
//# sourceMappingURL=options.js.map
|
||||||
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";;;AAAA,8CAAwD;AAExD;;;;;;;;;;;;GAYG;AACH,IAAA,qBAAgB,EAAC,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;AAE7D,0FAA0F;AAC7E,QAAA,MAAM,GAAG,aAAa,CAAA"}
|
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":";;;AAAA,8CAAwD;AAExD;;;;;;;;;;;;;;;;;GAiBG;AACH,IAAA,qBAAgB,EAAC,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAA;AAE5D,0FAA0F;AAC7E,QAAA,MAAM,GAAG,aAAa,CAAA"}
|
||||||
|
|
@ -7,13 +7,18 @@ import { setGlobalOptions } from 'firebase-functions/v2'
|
||||||
* no region override (di/SecurityModule.kt, data/remote/FirestoreAnswerDataSource.kt), so the
|
* no region override (di/SecurityModule.kt, data/remote/FirestoreAnswerDataSource.kt), so the
|
||||||
* callables MUST live in us-central1 or every install breaks. Do not change without also
|
* callables MUST live in us-central1 or every install breaks. Do not change without also
|
||||||
* pinning the client.
|
* pinning the client.
|
||||||
* maxInstances: a runaway-bill guardrail, not a throughput target (v2 serves ~80 concurrent
|
* maxInstances: a runaway-bill guardrail AND a Cloud Run quota constraint. Each 2nd-gen function
|
||||||
* requests per instance, so 20 instances is ample at current scale). Revisit at launch.
|
* is a Cloud Run service, and the project's regional "total CPU allocation" quota is charged as
|
||||||
|
* the SUM of (maxInstances x vCPU) across every function. With ~34 v2 functions and a new
|
||||||
|
* project's default quota (~560 vCPU in us-central1), this must stay low or deploys fail with
|
||||||
|
* "Quota exceeded for total allowable CPU per project per region". 5 x 34 = 170, well under.
|
||||||
|
* For production: request a Cloud Run CPU quota increase (console → IAM & Admin → Quotas) and
|
||||||
|
* raise this. ~80 concurrent requests per instance means 5 instances still serves ~400 in flight.
|
||||||
*
|
*
|
||||||
* This module is imported FIRST in index.ts so these options are set before any v2 function is
|
* This module is imported FIRST in index.ts so these options are set before any v2 function is
|
||||||
* defined. It has no effect on the one v1 holdout (onUserDelete), which keeps its own defaults.
|
* defined. It has no effect on the one v1 holdout (onUserDelete), which keeps its own defaults.
|
||||||
*/
|
*/
|
||||||
setGlobalOptions({ region: 'us-central1', maxInstances: 20 })
|
setGlobalOptions({ region: 'us-central1', maxInstances: 5 })
|
||||||
|
|
||||||
/** Region constant for any per-function override that ever needs to pin it explicitly. */
|
/** Region constant for any per-function override that ever needs to pin it explicitly. */
|
||||||
export const REGION = 'us-central1'
|
export const REGION = 'us-central1'
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue