Files
terraform-cloudflare-tunnel…/main.tf
T
hcornet f8201d9d06
Terraform Apply / Terraform Apply (push) Successful in 2m26s
New update
2026-07-31 12:57:49 +02:00

90 lines
4.1 KiB
Terraform

# =============================================================================
# VAULT DATA SOURCES
# =============================================================================
data "vault_generic_secret" "cloudflare" {
path = var.vault_cloudflare_path
}
data "vault_generic_secret" "authentik" {
path = var.vault_authentik_path
}
# Secrets Azure Entra ID — lus uniquement si la brique IdP Azure est activée.
# ACTION EXTERNE : créer le secret "secret/azure" dans Vault avec les clés
# client_id_cloudflare / secret_cloudflare / directory_id, puis passer
# azure_idp_enabled = true dans variables.auto.tfvars
data "vault_generic_secret" "azure" {
count = var.azure_idp_enabled ? 1 : 0
path = var.vault_azure_path
}
# Secrets Google OAuth — lus uniquement si la brique IdP Google est activée.
# ACTION EXTERNE : créer un client OAuth dans Google Cloud Console, déposer
# le secret "secret/google" dans Vault (clés client_id_cloudflare /
# secret_cloudflare), puis google_idp_enabled = true dans le tfvars.
data "vault_generic_secret" "google" {
count = var.google_idp_enabled ? 1 : 0
path = var.vault_google_path
}
# =============================================================================
# LOCALS
# =============================================================================
locals {
# Secrets Cloudflare depuis Vault
# NOTE : zone_id_org est l'identifiant hexadécimal de la zone (utilisé par
# les ressources DNS). Le NOM de domaine, lui, vient de var.cloudflare_zone.
# Ne jamais mélanger les deux : un hostname se construit avec le nom,
# jamais avec l'ID.
cloudflare_api_token = data.vault_generic_secret.cloudflare.data["api_token"]
cloudflare_account_id = data.vault_generic_secret.cloudflare.data["account_id"]
cloudflare_zone_id = data.vault_generic_secret.cloudflare.data["zone_id_org"]
cloudflare_email = data.vault_generic_secret.cloudflare.data["email"]
authentik_oidc_client_id_cloudflare = data.vault_generic_secret.authentik.data["client_id_cloudflare"]
authentik_oidc_secret_cloudflare = data.vault_generic_secret.authentik.data["secret_cloudflare"]
# Secrets Azure Entra ID depuis Vault (brique IdP Azure, optionnelle)
azure_oidc_client_id_cloudflare = var.azure_idp_enabled ? data.vault_generic_secret.azure[0].data["client_id_cloudflare"] : ""
azure_oidc_secret_cloudflare = var.azure_idp_enabled ? data.vault_generic_secret.azure[0].data["secret_cloudflare"] : ""
azure_directory_id = var.azure_idp_enabled ? data.vault_generic_secret.azure[0].data["directory_id"] : ""
# Secrets Google OAuth depuis Vault (brique IdP Google, optionnelle)
google_oidc_client_id_cloudflare = var.google_idp_enabled ? data.vault_generic_secret.google[0].data["client_id_cloudflare"] : ""
google_oidc_secret_cloudflare = var.google_idp_enabled ? data.vault_generic_secret.google[0].data["secret_cloudflare"] : ""
# Liste d'IdP Google utilisable dans les allowed_idps des applications
# (vide si la brique est désactivée -> le bouton Google disparaît)
google_idp_ids = var.google_idp_enabled ? [cloudflare_zero_trust_access_identity_provider.gmail[0].id] : []
# Construction des ingress rules pour toutes les applications
# CORRECTIF : le hostname est construit avec le NOM de la zone
# (var.cloudflare_zone = "tips-of-mine.org") et non plus avec l'ID de zone.
# Avec l'ancien code, les hostnames d'ingress ne correspondaient jamais aux
# enregistrements DNS créés dans Networks-Routes-cidr.tf.
ingress_rules = concat(
[
for app_name, app_config in var.applications : {
hostname = "${app_config.subdomain}.${var.cloudflare_zone}"
service = app_config.origin_url
origin_request = {
no_tls_verify = app_config.no_tls_verify
# Configuration Access si activée
access = app_config.access_enabled ? {
team_name = app_config.access_team_name
aud_tag = app_config.access_aud_tags
required = true
} : null
}
}
],
# Règle catch-all en dernier
[{
service = "http_status:404"
}]
)
}