A Perimeter that Enforces rather than Rehearses
spec is the dry-run configuration and status is the enforced one - two blocks of the same shape, and a perimeter with only a spec is evaluated on every request, logs violations, and blocks nothing. Empty restricted_services is the other way to have none: the perimeter exists, covers the projects, and governs no API.
Verification
Static-verifiedPassed: validated and lint-clean (provider-schema-validated for AWS/Azure/GCP; Terraform-language lint elsewhere).
Conformance
- Static validation (fmt · validate · tflint)
- No applicable security policies for this provider
- Plan tests (mocked: validation rules · outputs)
Provenance
- SHA-256 checksum
- Signature (pending)
Functional
- Live test pending (no cloud run yet)
Last verified 2026-09-13 · how we verify
Use it from the registry
terraform · opentofumodule "service_perimeter" {
source = "www.iac-bazaar.com/iac-bazaar/gcp-service-perimeter/gcp"
version = "1.0.0"
}Needs a registry token from /account/tokens. The module itself is free; the account is what identifies you. Full setup: registry docs.
Cite it in your README
badge · attributionPaste this beside the module in the repository that uses it. The badge is rendered from this artifact's verification record, so it reads static-verified because the record says so, and the link lands on this page.
[](https://www.iac-bazaar.com/catalog/gcp-service-perimeter?utm_source=syndication&utm_medium=readme&utm_campaign=artifact)
Terraform module 1.0.0, static-verified on IaC Bazaar: [A Perimeter that Enforces rather than Rehearses](https://www.iac-bazaar.com/catalog/gcp-service-perimeter?utm_source=syndication&utm_medium=readme&utm_campaign=artifact)
```hcl
module "service_perimeter" {
source = "www.iac-bazaar.com/iac-bazaar/gcp-service-perimeter/gcp"
version = "1.0.0"
}
```Preview:
Inputs & outputs
Create a free account to read this module's contract
The declared contract - every input name, type, default and description, plus every output - is shown to signed-in accounts, not to anonymous visitors.
A free account sees the contract of every module in the catalogue. There is no subscription and nothing to buy - the modules are free to download, and they run under Vizier.
Documentation
gcp-service-perimeter
A VPC Service Controls perimeter that enforces rather than rehearses. Works with
Terraform and OpenTofu (>= 1.6), google provider >= 6.0, < 7.0.
spec is the dry run and status is the enforced configuration. They are
two separate blocks holding the same shape, and use_explicit_dry_run_spec
decides which one is real. A perimeter with only a spec appears in the
console, is evaluated on every request, writes violations to the audit log - and
blocks nothing at all. This is the most confusable control in Google Cloud,
because a dry-run perimeter is genuinely useful and looks identical to an
enforcing one everywhere except in which block is populated. This module writes
to one or the other, never both, so the difference is one variable.
A perimeter with no restricted_services protects nothing. The list names
the APIs the boundary applies to. Empty means the perimeter exists, contains the
projects, and governs no API - which reads in every inventory as "perimeter:
yes". A precondition refuses it.
Access levels are the hole you cut on purpose. An attached access level lets
callers matching it reach the restricted services from outside; one matching a
broad IP range defeats the perimeter while leaving it looking configured.
external_access_levels is an output for exactly that review.
Without vpc_accessible_services, workloads inside can reach any Google
API. The perimeter stops data leaving to projects outside it; it does not by
itself stop a compromised VM inside from calling an API you never intended to
expose.
This module does not model ingress and egress policies, and that matters. With none of them and no access levels, only resources inside the perimeter can reach the restricted services - correct, very restrictive, and it will stop your CI dead. A precondition makes you say you understand that before it applies.
Smaller things: the perimeter name accepts underscores only, unlike almost
everywhere else in Google Cloud; and protected_projects takes numeric project
numbers, not ids, with an API error that does not explain the difference -
so the module checks the shape first.
Verification
Static validation runs tofu fmt, init, validate, tflint and checkov.
This module has not yet had a live test, so it is published as statically
validated with its live test pending and does not carry the live-tested mark.
Usage code & full reference need an account
The complete copy-paste usage, the full input/output reference, and operational notes are free with an account - shown here and bundled in the download. Sign in and this section fills in.
- Usage
Related modules
gcp-firewall-policy
A global network firewall policy exists independently of any network; an association puts it in the path, and a policy with a hundred rules and none governs nobody while rendering as fully configured. enable_logging defaults to false on every rule, so a deny that fires leaves no evidence. Refuses a policy with no network, logs every rule unless told not to, and counts the disabled ones.
gcp-dlp
Sensitive Data Protection on a schedule: an inspection template naming the detectors and a weekly trigger over a bucket or a BigQuery table, sampling ten percent of each file, scanning only what changed since the last run, with findings written to your dataset without the matched values and a summary sent to Security Command Center. A full scan, billed per byte, is accepted by name.
gcp-recaptcha
A key with a testing score returns that score for every assessment, bots included - right for staging and, on a production key, a filter that filters nothing; allow_all_domains lets any site consume your assessments against your quota. Testing mode refused without acceptance, domains required on web keys, invisible scoring by default; only a backend assessment call turns a token into a decision.
gcp-secure-web-proxy
A gateway with no rules allows nothing, and a session matcher of true is an open proxy to the internet; the gateway needs a proxy-only subnet in the region that is yours to make; and without TLS inspection the proxy sees the SNI hostname and nothing inside. Rules built from a URL list of your hosts, allow-all accepted by name only, outputs that say what is allowed and that TLS is not inspected.
gcp-cloud-ids
Creating the endpoint creates no packet mirroring policy, so an endpoint with nothing mirrored is provisioned, billed by the hour, shown with a green check and has never seen a packet. The mirroring policy is created with it and refused when it mirrors nothing. Cloud IDS detects and never blocks; blocks_traffic is an output that is always false.
gcp-cloud-armor
A global Cloud Armor WAF policy with preconfigured OWASP SQLi and XSS rules enforcing by default, an optional per-client rate limit, and custom IP allow/deny rules - attachable to many backends.