GCP Billing Kill Switch
Since hyperscalers do not support an automated way to stop billing, this repo aims to provide a way to spin up such a feature using Terraform and GCP´s native services - to avoid waking up to an exceptionally high bill because you forgot to turn off a GCE instance...
The way it works is quite simple. GCP offers a service called "budgets", which can send mails or publish to a Pub/Sub topic once a defined threshold is reached. This mechanism is used to trigger a Cloud Function that will disable the project´s billing account.

Disclamer: Disabling billing on a project may result in data loss. The account can be manually reactivated but Google does not guarantee that all services remain in place. -- cf. Google Cloud, Disable billing for a project
Usage
Simply reference the GitHub release as a Terraform module and provide the required input parameters.
module "kill-switch" {
source = "github.com/TrisNol/gcp-billing-kill-switch?ref=v1.0.0"
project_id = var.project_id
region = var.region
billing_account = var.billing_account
storage_bucket = google_storage_bucket.bucket.name
}
Note that the storage bucket should already exist and that the account deploying the resources has to have the following additioal roles besides the ones required to actually deploy a cloud function:
- roles/billing.admin (to be granted on billing account level, not project)
- roles/security.admin (project level)
Requirements
| Name | Version |
|---|---|
| terraform | >= 1.0 |
| >= 4.57.0 |
Providers
| Name | Version |
|---|---|
| archive | 2.3.0 |
| 4.61.0 |
Modules
No modules.
Resources
| Name | Type |
|---|---|
| google_billing_account_iam_member.admin | resource |
| google_billing_budget.default | resource |
| google_cloudfunctions2_function.function | resource |
| google_pubsub_topic.budget_topic | resource |
| google_service_account.cloud_function_sa | resource |
| google_storage_bucket_object.object | resource |
| archive_file.archive_cloud_function | data source |
| google_billing_account.account | data source |
Inputs
| Name | Description | Type | Default | Required |
|---|---|---|---|---|
| billing_account | ID of the billing account to attach the budget to | string |
n/a | yes |
| budget | Max. monthly budget | number |
15 |
no |
| currency | Currency to be used for the budget | string |
"EUR" |
no |
| functions_sa_email | Email of a pre-defined service account with roles/billing.admin permission. Defaults to: null | string |
null |
no |
| project_id | n/a | string |
n/a | yes |
| region | Region to create resources in | string |
n/a | yes |
| storage_bucket | Name of the storage bucket where the central cloud function will be placed | string |
n/a | yes |
Outputs
| Name | Description |
|---|---|
| billing_budget_id | ID of the created billing budget |
| cloud_function_id | ID of the cloud function managing the billing account |