Terraform: ID was missing the serverfarms element

Oggi, mentre stavo creando un nuovo ambiente su Azure, mi sono trovato nuovamente di fronte a un problema con Terraform. È stato uno di quei momenti che ti fanno “diventare matto” nel tentativo di trovare una soluzione. Sorprendentemente, la soluzione si è rivelata essere molto più semplice di quanto avessi immaginato.

Prima di entrare nel dettaglio del problema, credo sia utile fornire un quadro generale della situazione. Ecco cosa stavo cercando di fare:

  • Creare un nuovo ambiente cloud.
  • Utilizzare uno script IaC per la creazione di un micro servizio su Azure, uno script che avevo già utilizzato con successo in altri ambienti.
  • Lo script ha il compito di creare una Azure Function su un Service Plan esistente.

Ora sei pronto a ricevere l’errore che non ti aspetti?

ID was missing the serverfarms element

Dopo avere creato il nuovo file tfvars relativo al nuovo ambiente ho lanciato la pipeline di validate ed ho ottenuto questo messaggio del tutto inatteso.

🔴 Error: ID was missing the serverfarms element

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
╷
│ Error: ID was missing the `serverfarms` element
│ 
│   with [...],
│   on [...] line 8, in resource "azurerm_windows_function_app" "windows_function_app":
│    8:   service_plan_id            = var.app_service_plan_id
│ 
╵
Releasing state lock. This may take a few moments...

Il mio primo pensiero è stato il seguente: magari da quando ho creato questo micro servizio ho aggiornato il modulo sottostante e non funziona. Ipotesi smentita in meno di pochi secondi in quanto l’ho lanciato di recente per un aggiornamento in produzione. Quindi il problema è proprio nel mio codice/ configurazione odierna.

Siccome il problema era legato al Service Plan ID sono andato subito a verificare di averlo copiato correttamente dal portale Azure.

1
/subscriptions/<subscription-id>/resourceGroups/<resource-group-id>/providers/Microsoft.Web/serverFarms/<plan-id>

Al netto dei valori “offuscati” con le parentesi angolari il tutto era corretto. Dopo essermi giocato la vista ho risolto il problema in meno di un secondo. Dal confronto col file di variabili di un ambiente funzionante ecco svelato il motivo:

L’errore è causato in quanto l’ID contiene serverFarm mentre Terraform si aspetta serverfarm tutto minuscolo.

A questo punto hai due possibilità davanti a te:

  • ricordati di modificare il valore fornito da Azure
  • inserire nel modulo (o nel tuo codice) una replace per evitare di farlo a mano.

❌ Altra casistica dove il “copy & paste non controllato” si rivela il male assoluto.

Ti stai chiedendo come farla in terraform? Nel mio caso la modifica da fare al modulo sarebbe la seguente

1
service_plan_id = replace(var.app_service_plan_id, "serverFarms", "serverfarms")

🟢 A quel punto (come per magia) la pipeline di validate ed in seguito apply sono diventate green.

Terraform CookBook

HashiCorp Configuration Language (HCL) has changed how we define and provision data center infrastructure with the launch of Terraform - a top-tier product for building Infrastructure as Code (IaC). Terraform Cookbook shows you how to leverage Terraform to manage complex cloud infrastructure with ease.

This new edition has been updated to include real-world examples for provisioning Cloud infrastructure(mainly for Azure, but also a dedicated chapter for AWS and GCP) with Terraform. You’ll delve into manual and automated testing with Terraform configurations, creating and managing a balanced, efficient, reusable infrastructure with Terraform modules. You’ll learn how to automate the deployment of Terraform configuration with continuous integration and continuous delivery (CI/CD). Besides, several new chapters have been added that describe the use of Terraform for Docker and Kubernetes, and explain how to test Terraform configurations using different tools to check code and security compliance. A complete chapter is dedicated to mastering Terraform Cloud and the latest chapter covers troubleshooting common Terraform issues and provides solutions for frequently encountered errors.

By the end of this book, you’ll have developed the skills needed to get the most value out of Terraform and to effectively manage your infrastructure.

Terraform Cookbook - Second Edition: Provision, run, and scale cloud architecture with real-world examples using Terraform