En este documento, se explica cómo inhabilitar automáticamente la facturación en un proyecto cuando tus costos alcanzan o superan el presupuesto del proyecto. Cuando inhabilitas la facturación en un proyecto, finalizas todos los Google Cloud servicios en el proyecto, incluidos los servicios del nivel gratuito. Para obtener una respuesta más detallada a las notificaciones de presupuesto, consulta Controla el uso de recursos con notificaciones.
Es posible que limites los costos porque tienes una cantidad máxima de dinero que puedes invertir en Google Cloud. En estos casos, cuando se alcanza el límite de tu presupuesto, es posible que quieras cerrar todos tus Google Cloud servicios y el uso para dejar de generar costos. Inhabilitar la facturación en tu proyecto es un método eficaz para dejar de generar costos en ese proyecto.
Limitaciones
Hay un retraso entre la generación de costos y la recepción de notificaciones de presupuesto, por lo que es posible que se generen costos adicionales por un uso que no llegó en el momento en que se detuvieron todos los servicios. Si sigues los pasos de este ejemplo, no se garantiza que no gastarás más que tu presupuesto. Si tienes una cantidad limitada de fondos, establece el presupuesto máximo por debajo de los fondos disponibles para tener en cuenta los retrasos de facturación.
No puedes inhabilitar la facturación en un proyecto que está bloqueado en una cuenta de facturación. Para obtener más información sobre cómo bloquear y desbloquear proyectos, consulta Protege el vínculo entre un proyecto y su cuenta de facturación.
Guion de ejemplo
Puedes usar el siguiente guion para realizar todos los pasos de este instructivo en un solo guion. Solo copia este guion en un archivo Bash, edita los parámetros de usuario cerca de la parte superior del archivo y ejecuta el guion.
Haz clic para expandir el guion
#!/bin/bash
# This script combines all the steps from the following documentation so they
# can be executed in a single command:
# https://docs.cloud.google.com/billing/docs/how-to/disable-billing-with-notifications#functions_cap_billing_dependencies-nodejs
# Step-by-step instructions:
# A) Edit the parameters under step 1 (Set User Parameters) below and then
# copy the contents of this file to your clipboard.
# B) Open Cloud Shell (or any bash terminal with gcloud installed) via the
# terminal icon in the top right of http://console.cloud.google.com
# C) Paste the contents into a new Bash file which you can do with the
# following commands:
# type "vi ./billing_caps.sh" to create a new file and open it for editing
# press 'i' to enter insert mode
# paste the contents of this file into the terminal (right-click + "paste")
# press 'ESC' to exit insert mode
# type ":wq" to save and exit
# type "chmod +x billing_caps.sh" to make the script executable
# C) Execute the script with the command "./billing_caps.sh"
# D) Monitor the terminal output for any errors that might require you to
# repeat one or more of the above steps. If no errors occur then you're done!
# 1. Set User Parameters
PROJECT_ID="your-project-id"
REGION="us-central1"
TOPIC_ID="billing-alerts-topic"
BILLING_ACCOUNT_ID="your-billing-account-id"
BUDGET_AMOUNT="100" # Example: $100
# 2. Enable Required APIs
gcloud services enable billingbudgets.googleapis.com \
cloudbilling.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
eventarc.googleapis.com \
run.googleapis.com \
pubsub.googleapis.com \
artifactregistry.googleapis.com \
--project="${PROJECT_ID}"
# 3. Create Pub/Sub Topic
gcloud pubsub topics create "${TOPIC_ID}" --project="${PROJECT_ID}"
# 4. Create Source Files for the Function
mkdir -p billing_function
cat <<'EOF' > billing_function/package.json
{
"name": "cloud-functions-billing",
"private": "true",
"version": "0.0.1",
"description": "Examples of integrating Cloud Functions with billing",
"main": "index.js",
"engines": {
"node": ">=18.0.0"
},
"author": "Ace Nassri ",
"license": "Apache-2.0",
"dependencies": {
"@google-cloud/billing": "^4.0.0"
},
"devDependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"c8": "^10.0.0",
"gaxios": "^6.0.0",
"mocha": "^10.0.0",
"promise-retry": "^2.0.0",
"proxyquire": "^2.1.0",
"sinon": "^18.0.0",
"wait-port": "^1.0.4"
}
}
EOF
cat <<'EOF' > billing_function/index.js
const {CloudBillingClient} = require('@google-cloud/billing');
const PROJECT_ID = process.env.GOOGLE_CLOUD_PROJECT;
const PROJECT_NAME = `projects/${PROJECT_ID}`;
const billing = new CloudBillingClient();
exports.stopBilling = async pubsubEvent => {
const pubsubData = JSON.parse(
Buffer.from(pubsubEvent.data, 'base64').toString()
);
if (pubsubData.costAmount <= pubsubData.budgetAmount) {
return `No action necessary. (Current cost: ${pubsubData.costAmount})`;
}
if (!PROJECT_ID) {
return 'No project specified';
}
const billingEnabled = await _isBillingEnabled(PROJECT_NAME);
if (billingEnabled) {
return _disableBillingForProject(PROJECT_NAME);
} else {
return 'Billing already disabled';
}
};
/**
* Determine whether billing is enabled for a project
* @param {string} projectName Name of project to check if billing is enabled
* @return {bool} Whether project has billing enabled or not
*/
const _isBillingEnabled = async projectName => {
try {
const [res] = await billing.getProjectBillingInfo({name: projectName});
return res.billingEnabled;
} catch (e) {
console.log(
'Unable to determine if billing is enabled on specified project, assuming billing is enabled'
);
return true;
}
};
/**
* Disable billing for a project by removing its billing account
* @param {string} projectName Name of project disable billing on
* @return {string} Text containing response from disabling billing
*/
const _disableBillingForProject = async projectName => {
const [res] = await billing.updateProjectBillingInfo({
name: projectName,
resource: {billingAccountName: ''}, // Disable billing
});
return `Billing disabled: ${JSON.stringify(res)}`;
};
EOF
# 5. Deploy the Cloud Run Function
# This uses the Gen 2 runtime as suggested by current standards
gcloud functions deploy stop-billing-function \
--gen2 \
--runtime=nodejs24 \
--region="${REGION}" \
--trigger-topic="${TOPIC_ID}" \
--entry-point=stopBilling \
--set-env-vars GOOGLE_CLOUD_PROJECT="${PROJECT_ID}" \
--source=./billing_function \
--project="${PROJECT_ID}"
# 6. Configure Service Account Permissions
# Get the service account associated with the function
SERVICE_ACCOUNT=$(gcloud functions describe stop-billing-function --region="${REGION}" --format="value(serviceConfig.serviceAccountEmail)" --project="${PROJECT_ID}")
# Grant the service account the "Billing Account Administrator" role on the
# billing account.
# Note: You must have 'Billing Account Administrator' rights to run this
gcloud billing accounts add-iam-policy-binding "${BILLING_ACCOUNT_ID}" \
--member="serviceAccount:${SERVICE_ACCOUNT}" \
--role="roles/billing.admin"
# 7. Create the Budget and Link to Topic
gcloud billing budgets create \
--billing-account="${BILLING_ACCOUNT_ID}" \
--display-name="Budget for ${PROJECT_ID}" \
--budget-amount="${BUDGET_AMOUNT}" \
--threshold-rule=percent=100 \
--notifications-rule-pubsub-topic="projects/${PROJECT_ID}/topics/${TOPIC_ID}"
echo "Setup complete. Billing will be disabled if costs exceed ${BUDGET_AMOUNT}."
Antes de comenzar
Antes de comenzar, debes completar las siguientes tareas:
- Habilita la API de Cloud Billing.
- Crea un presupuesto que tenga un solo proyecto.
- Configura notificaciones de presupuesto programáticas.
Configura una función de Cloud Run
Para inhabilitar la Facturación de Cloud en un proyecto, crea una función de Cloud Run y configúrala para llamar a la API de Cloud Billing.
- Completa los pasos que se describen en Crea una función de Cloud Run. Asegúrate de que el Tipo de activador esté configurado con el mismo tema de Pub/Sub que usará el presupuesto.
Agrega las siguientes dependencias:
Node.js
Copia lo siguiente en tu archivo
package.json:Python
Copia lo siguiente en tu archivo
requirements.txt:Copia el siguiente código en tu función de Cloud Run:
Node.js
Python
Establece el Punto de entrada en la función correcta para ejecutar:
Node.js
Establece el Punto de entrada en
stopBilling.Python
Establece el Punto de entrada en
stop_billing.Revisa la lista de variables de entorno que se configuran automáticamente para determinar si necesitas configurar de forma manual la GOOGLE_CLOUD_PROJECT variable para el proyecto en el que deseas inhabilitar la Facturación de Cloud.
Haz clic en IMPLEMENTAR.
Configura los permisos de la cuenta de servicio
Tu función de Cloud Run se ejecuta como una cuenta de servicio creada de manera automática . Para inhabilitar la facturación, debes otorgar permisos de cuenta de servicio a cualquier servicio en el proyecto que necesite modificar. Para ello, completa los siguientes pasos:
- Para identificar la cuenta de servicio correcta, visualiza los detalles de la función de Cloud Run. La cuenta de servicio se encuentra en la parte inferior de la página.
En la Google Cloud consola, ve a la página IAM para configurar los permisos correspondientes.
Para modificar los permisos de la cuenta de facturación, en la Google Cloud consola, ve a la página Administración de cuentas de Facturación, agrega la cuenta de servicio como principal en la cuenta de Facturación de Cloud y establece los permisos correspondientes de la cuenta de facturación.
Ir a la página Administración de cuentas en Facturación de Cloud
Obtén más información para configurar permisos para las cuentas de Facturación de Cloud.
Prueba que la Facturación de Cloud esté inhabilitada
Cuando el presupuesto envía una notificación, el proyecto especificado ya no tendrá una cuenta de Facturación de Cloud asociada. Para asegurarte de que tu función funcione como se espera, sigue los pasos que se indican en Prueba una función de Cloud Run.
Si la operación se realiza correctamente, el proyecto ya no podrá verse en la cuenta de Facturación de Cloud, y los recursos del proyecto estarán inhabilitados, incluida la función de Cloud Run si está en el mismo proyecto.
Para seguir usando Google Cloud recursos en el proyecto, en la Google Cloud consola, vuelve a habilitar la Facturación de Cloud de forma manual para el proyecto.
¿Qué sigue?
Revisa otros ejemplos de notificaciones programáticas para aprender a hacer lo siguiente:
- Escucha tus notificaciones
- Controla el uso de recursos con notificaciones
- Envía notificaciones a Slack