Crea un log di flusso virtuale di rete usando Terraform

I log di flusso della rete virtuale registrano informazioni sul traffico IP che scorre attraverso una rete virtuale. In questo articolo, usi Terraform per creare un log del flusso di rete virtuale e un account di archiviazione dedicato per una rete virtuale esistente. Per altre informazioni, vedere Panoramica dei log dei flussi di rete virtuale.

La configurazione di Terraform utilizza l'istanza regionale Network Watcher che Azure crea automaticamente quando Network Watcher è abilitato. Crei il registro del flusso e l'account di archiviazione nel gruppo risorse Network Watcher.

Prerequisiti

  • Un account Azure con una sottoscrizione attiva. Creare un account gratuito.
  • Installare e configurare Terraform.
  • Una rete virtuale esistente. Per crearne una, vedi Creare una rete virtuale.
  • Network Watcher abilitato nella regione della rete virtuale. Network Watcher è abilitato di default a meno che tu non lo disabiliti esplicitamente.
  • Il provider di risorse Microsoft.Insights registrato nella sottoscrizione. Per maggiori informazioni, consulta Registra il fornitore Insights.
  • Permessi per creare un flow log e un account di archiviazione nel gruppo di risorse che contiene l'istanza regionale di Network Watcher.

Rivedi la configurazione di Terraform

Puoi trovare la configurazione di esempio per questo articolo nel repository GitHub di Azure Terraform.

La configurazione crea le seguenti risorse:

La configurazione utilizza anche la sorgente dati Network Watcher per fare riferimento all'istanza regionale esistente di Network Watcher.

  1. Crea una directory per testare la configurazione di esempio di Terraform e rendila la directory attuale.

  2. Creare un file denominato providers.tfe inserire il codice seguente:

    terraform {
      required_version = ">= 1.5.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 5.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.7"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Creare un file denominato main.tfe inserire il codice seguente:

    data "azurerm_network_watcher" "network_watcher" {
      name                = var.network_watcher_name
      resource_group_name = var.network_watcher_resource_group_name
    }
    
    resource "random_string" "storage_account_suffix" {
      length  = 8
      lower   = true
      numeric = true
      special = false
      upper   = false
    }
    
    resource "azurerm_storage_account" "flow_logs" {
      name                     = "flowlogs${random_string.storage_account_suffix.result}"
      resource_group_name      = data.azurerm_network_watcher.network_watcher.resource_group_name
      location                 = data.azurerm_network_watcher.network_watcher.location
      account_tier             = "Standard"
      account_kind             = "StorageV2"
      account_replication_type = var.storage_account_replication_type
    }
    
    resource "azurerm_network_watcher_flow_log" "vnet_flow_log" {
      name                 = var.flow_log_name
      network_watcher_name = data.azurerm_network_watcher.network_watcher.name
      resource_group_name  = data.azurerm_network_watcher.network_watcher.resource_group_name
      location             = data.azurerm_network_watcher.network_watcher.location
    
      target_resource_id = var.virtual_network_id
      storage_account_id = azurerm_storage_account.flow_logs.id
      enabled            = true
      version            = var.flow_log_version
    
      retention_policy {
        enabled = var.retention_days > 0
        days    = var.retention_days
      }
    }
    
  4. Creare un file denominato variables.tfe inserire il codice seguente:

    variable "network_watcher_name" {
      type        = string
      default     = "NetworkWatcher_eastus"
      description = "Name of the existing regional Network Watcher instance."
    }
    
    variable "network_watcher_resource_group_name" {
      type        = string
      default     = "NetworkWatcherRG"
      description = "Name of the resource group that contains the Network Watcher instance."
    }
    
    variable "virtual_network_id" {
      type        = string
      description = "Resource ID of the existing virtual network to monitor."
    
      validation {
        condition     = can(regex("(?i)^/subscriptions/[^/]+/resourceGroups/[^/]+/providers/Microsoft.Network/virtualNetworks/[^/]+$", var.virtual_network_id))
        error_message = "The virtual_network_id value must be a full Azure virtual network resource ID."
      }
    }
    
    variable "flow_log_name" {
      type        = string
      default     = "vnet-flow-log"
      description = "Name of the virtual network flow log."
    }
    
    variable "flow_log_version" {
      type        = number
      default     = 2
      description = "Flow log format version. Valid values are 1 and 2."
    
      validation {
        condition     = contains([1, 2], var.flow_log_version)
        error_message = "The flow_log_version value must be 1 or 2."
      }
    }
    
    variable "retention_days" {
      type        = number
      default     = 0
      description = "Number of days to retain flow log data. Use 0 to retain data indefinitely."
    
      validation {
        condition     = var.retention_days >= 0 && var.retention_days <= 365
        error_message = "The retention_days value must be between 0 and 365."
      }
    }
    
    variable "storage_account_replication_type" {
      type        = string
      default     = "LRS"
      description = "Replication type for the flow log storage account."
    
      validation {
        condition     = contains(["LRS", "GRS", "ZRS"], var.storage_account_replication_type)
        error_message = "The storage_account_replication_type value must be LRS, GRS, or ZRS."
      }
    }
    
  5. Creare un file denominato outputs.tfe inserire il codice seguente:

    output "flow_log_id" {
      description = "Resource ID of the virtual network flow log."
      value       = azurerm_network_watcher_flow_log.vnet_flow_log.id
    }
    
    output "flow_log_name" {
      description = "Name of the virtual network flow log."
      value       = azurerm_network_watcher_flow_log.vnet_flow_log.name
    }
    
    output "storage_account_name" {
      description = "Name of the storage account that contains the flow log data."
      value       = azurerm_storage_account.flow_logs.name
    }
    

Imposta i valori delle risorse esistenti

Creare un file denominato terraform.tfvars. Sostituisci i segnaposto con valori per la tua rete virtuale esistente e per l'istanza regionale di Network Watcher.

network_watcher_name                = "NetworkWatcher_eastus"
network_watcher_resource_group_name = "NetworkWatcherRG"
virtual_network_id                  = "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/<virtual-network-name>"

La rete virtuale e l'istanza di Network Watcher devono trovarsi nella stessa regione Azure. Se la tua istanza di Network Watcher utilizza un nome o un gruppo di risorse personalizzato, aggiorna entrambi i valori di Network Watcher.

Inizializza Terraform

Per inizializzare la distribuzione di Terraform, eseguire terraform init. Questo comando scarica il provider di Azure necessario per gestire le risorse Azure.

terraform init -upgrade

Punti principali:

  • Il parametro -upgrade aggiorna i plug-in del provider necessari alla versione più recente conforme ai vincoli di versione della configurazione.

Crea un piano di esecuzione di Terraform

Eseguire terraform plan per creare un piano di esecuzione.

terraform plan -out main.tfplan

Punti principali:

  • Il comando terraform plan crea un piano di esecuzione, ma non lo esegue. Determina invece le azioni necessarie per creare la configurazione specificata nei file di configurazione. Questo modello consente di verificare se il piano di esecuzione corrisponde alle aspettative prima di apportare modifiche alle risorse effettive.
  • Il parametro facoltativo -out consente di specificare un file di output per il piano. L'uso del -out parametro garantisce che il piano esaminato sia esattamente quello applicato.

Applicare il piano di esecuzione di Terraform

Esegui terraform apply per applicare il piano di esecuzione all'infrastruttura cloud.

terraform apply main.tfplan

Punti principali:

  • Il comando terraform apply di esempio presuppone che in precedenza sia stato eseguito terraform plan -out main.tfplan.
  • Se è stato specificato un nome file diverso per il parametro -out, usare lo stesso nome file nella chiamata a terraform apply.
  • Se non è stato usato il parametro -out, chiamare terraform apply senza parametri.

Verifica il registro del flusso

  1. Accedi al portale di Azure.

  2. Cercare e selezionare Network Watcher.

  3. In Log selezionare Log dei flussi.

  4. Conferma che il log del flusso sia abilitato e che la sua risorsa target sia la tua rete virtuale.

Puoi anche visualizzare i nomi del log del flusso e degli account di storage dagli output di Terraform:

terraform output flow_log_name
terraform output storage_account_name

Pulire le risorse

Quando le risorse create tramite Terraform non sono più necessarie, seguire questa procedura:

  1. Esegui terraform plan e specifica il flag destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Punti principali:

    • Il comando terraform plan crea un piano di esecuzione, ma non lo esegue. Determina invece le azioni necessarie per creare la configurazione specificata nei file di configurazione. Questo modello consente di verificare se il piano di esecuzione corrisponde alle aspettative prima di apportare modifiche alle risorse effettive.
    • Il parametro facoltativo -out consente di specificare un file di output per il piano. L'uso del -out parametro garantisce che il piano esaminato sia esattamente quello applicato.
  2. Eseguire terraform apply per applicare il piano di esecuzione.

    terraform apply main.destroy.tfplan
    

L'operazione di distruzione elimina il log del flusso e l'account di archiviazione creati da questa configurazione. Non elimina la rete virtuale esistente né l'istanza di Network Watcher.

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure