Neste documento, explicamos como desativar automaticamente o faturamento em um projeto quando os custos atingem ou excedem o orçamento do projeto. Ao desativar o faturamento em um projeto, você encerra todos os serviços do Google Cloud no projeto, incluindo os serviços do nível sem custo financeiro. Para uma resposta mais detalhada às notificações de orçamento, consulte Controlar o uso de recursos com notificações.
Talvez seja útil limitar os custos caso haja um limite absoluto de gasto no Google Cloud. Nesses casos, quando o limite de orçamento é atingido, talvez você queira encerrar todos os serviços e o uso do Google Cloud para parar de gerar custos. Desativar o faturamento no projeto é um método eficiente para interromper os custos nele.
Limitações
Há um atraso entre a geração de custos e o recebimento de notificações de orçamento. Portanto, é possível que haja custos extras pelo uso que não chegou no momento em que todos os serviços foram interrompidos. Seguir as etapas neste exemplo não garante que você não gastará além do orçamento. Se você tiver uma quantia limitada de fundos, defina o orçamento máximo abaixo dos fundos disponíveis para considerar os atrasos no faturamento.
Não é possível desativar o faturamento em um projeto bloqueado para uma conta de faturamento. Para saber mais sobre como bloquear e desbloquear projetos, consulte Proteger o link entre um projeto e a conta de faturamento dele.
Script de exemplo
Use o script a seguir para executar todas as etapas deste tutorial em um único script. Basta copiar esse script em um arquivo Bash, editar os parâmetros do usuário na parte de cima do arquivo e executar o script.
Clique para abrir o script
#!/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 começar
Antes de começar, conclua as seguintes tarefas:
- Ative a API Cloud Billing
- Criar um orçamento com escopo para um único projeto
- Configurar notificações de orçamento programático
Configurar uma função do Cloud Run
Para desativar o Cloud Billing em um projeto, crie uma função do Cloud Run e configure-a para chamar a API Cloud Billing.
- Siga as etapas em Criar uma função do Cloud Run. Verifique se o Tipo de gatilho está definido como o mesmo tópico do Pub/Sub que o orçamento vai usar.
Adicione as seguintes dependências:
Node.js
Copie o seguinte para o arquivo
package.json:Python
Copie o seguinte para o arquivo
requirements.txt:Copie o código abaixo na função do Cloud Run:
Node.js
Python
Defina o Ponto de entrada como a função correta a ser executada:
Node.js
Defina o Ponto de entrada como
stopBilling.Python
Defina o Ponto de entrada como
stop_billing.Revise a lista de variáveis de ambiente definidas automaticamente para determinar se você precisa definir manualmente a variável GOOGLE_CLOUD_PROJECT para o projeto em que quer desativar o Cloud Billing.
Clique em IMPLANTAR.
Configurar permissões da conta de serviço
Sua função do Cloud Run é executada como uma conta de serviço criada automaticamente. Para desativar o faturamento, é preciso conceder à conta de serviço permissões para todos os serviços do projeto que ela precisa modificar. Para isso, siga estas etapas:
- Para identificar a conta de serviço correta, visualize os detalhes da sua função do Cloud Run. listada na parte inferior da página.
Acesse a página IAM no console do Google Cloud para definir as permissões apropriadas.
Para modificar as permissões da conta de faturamento, no console do Google Cloud , acesse a página Gerenciamento da conta do Cloud Billing, adicione a conta de serviço como um principal na conta do Cloud Billing e defina as permissões apropriadas da conta de faturamento.
Saiba como configurar permissões para contas do Cloud Billing.
Testar se o Cloud Billing está desativado
Quando o orçamento enviar uma notificação, o projeto especificado não terá mais uma conta do Cloud Billing associada a ele. Para garantir que a função funcione conforme o esperado, siga as etapas em Testar uma função do Cloud Run.
Se a operação for bem-sucedida, o projeto não estará mais visível na conta do Cloud Billing, e os recursos no projeto serão desativados, incluindo a função do Cloud Run, se ela estiver no mesmo projeto.
Para continuar usando os recursos do Google Cloud no projeto, no console doGoogle Cloud , reative manualmente o Cloud Billing para seu projeto.
A seguir
Confira outros exemplos de notificações programáticas para saber como fazer o seguinte:
- Ouvir suas notificações
- Controlar o uso de recursos com notificações
- Enviar notificações para o Slack