bindings/xlb/terraform/recaptcha.tf (133 lines of code) (raw):
/**
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
provider "google" {
project = var.project_id
}
provider "google-beta" {
project = var.project_id
}
data "google_iam_policy" "noauth" {
binding {
role = "roles/run.invoker"
members = [
"allUsers",
]
}
}
resource "google_cloud_run_service" "edge" {
name = "recaptcha-edge"
location = var.region
template {
spec {
containers {
image = var.edge_container
env {
name = "PROJECT_NUMBER"
value = var.callout_config.project_number
}
env {
name = "API_KEY"
value = var.callout_config.api_key
}
env {
name = "ACTION_SITE_KEY"
value = var.callout_config.action_site_key
}
env {
name = "EXPRESS_SITE_KEY"
value = var.callout_config.express_site_key
}
env {
name = "SESSION_SITE_KEY"
value = var.callout_config.session_site_sey
}
env {
name = "CHALLENGE_PAGE_SITE_KEY"
value = var.callout_config.challenge_page_site_key
}
env {
name = "ENTERPRISE_SITE_KEY"
value = var.callout_config.enterprise_site_key
}
env {
name = "RECAPTCHA_ENDPOINT"
value = var.callout_config.recaptcha_endpoint
}
env {
name = "SESSION_JS_INSTALL_PATH"
value = var.callout_config.session_js_install_path
}
env {
name = "DEBUG"
value = var.callout_config.debug
}
}
}
}
traffic {
percent = 100
latest_revision = true
}
}
resource "google_cloud_run_service_iam_policy" "noauth" {
location = google_cloud_run_service.edge.location
project = google_cloud_run_service.edge.project
service = google_cloud_run_service.edge.name
policy_data = data.google_iam_policy.noauth.policy_data
}
resource "google_compute_region_network_endpoint_group" "serverless_neg" {
provider = google-beta
name = "serverless-neg"
network_endpoint_type = "SERVERLESS"
region = var.region
cloud_run {
service = google_cloud_run_service.edge.name
}
}
resource "google_compute_region_backend_service" "callouts_backend" {
name = "l7-recaptcha-callouts-backend"
region = var.region
load_balancing_scheme = var.load_balancing_scheme
port_name = null
backend {
group = google_compute_region_network_endpoint_group.serverless_neg.id
balancing_mode = "UTILIZATION"
capacity_scaler = 1.0
}
}
resource "google_network_services_lb_traffic_extension" "default" {
name = "recaptcha-traffic-ext"
description = "Implements reCAPTCHA Edge Compute capabilities"
location = var.region
load_balancing_scheme = var.load_balancing_scheme
forwarding_rules = [var.lb_frontend]
extension_chains {
name = "chain1"
match_condition {
cel_expression = var.extension_cel_match
}
extensions {
name = "recaptcha-edge"
authority = "recaptcha-edge"
service = google_compute_region_backend_service.callouts_backend.self_link
timeout = "0.5s"
fail_open = true
supported_events = ["REQUEST_HEADERS", "REQUEST_BODY", "RESPONSE_HEADERS", "RESPONSE_BODY"]
}
}
labels = {
}
}