Utiliser une IA pour générer du terraform

thumbernail IA

1. Les IA et le code

Les Assistants de codage IA sont des outils logiciels qui utilisent l'intelligence artificielle pour aider les développeurs à écrire du code plus rapidement et plus précisément.

Ils le font en générant du code en fonction des "prompts" ou en suggérant du code pour l'auto-complétion au fur et à mesure que vous écrivez du code en temps réel.

Avantages des assistants de codage IA :

Les assistants de codage IA offrent un certain nombre d'avantages aux développeurs, notamment :

  • Augmentation de la productivité : les assistants de codage IA peuvent aider à écrire du code plus rapidement et plus facilement.

  • Amélioration de la qualité et de la sécurité : Les assistants de codage IA peuvent aider à éviter les erreurs de codage.

  • Apprentissage rapide : Les assistants de codage IA peuvent vous aider à apprendre de nouveaux langages de programmation en fournissant des exemples de code et des explications.

2. Comparaison de d'IA spécialisée dans le code

Pour ce billet de blog, je n'ai pas pris un langage de programmation standard. J'ai pris le langage hcl.

  • Je me suis focalisé uniquement sur Terraform pour voir si les IA orientées code peuvent aider à la génération de code Terraform de bonne qualité et directement utilisable.

  • J'ai testé à la fois des extensions vscode et directement des IA génératives sur internet (bard, bing)

  • J'ai utilisé des assistants permettant d'avoir l'ensemble des fonctionnalités avec des formules gratuites.

  • Je n'ai pas pu utiliser des assistants open source (ex : fauxpilot) car je n'ai pas de GPU à disposition.

  • Je n'ai pas pris des assistants qui ne couvrent que quelques langages de programmation.

Voici la liste des IA testées

Extensions vscode :

Dans le navigateur :

Prompt utilisé pour la génération de code

Pour notre exemple de code, nous allons utiliser le prompt suivant :

C'est un prompt très simple. 😀

Create a terraform configuration for an aks cluster in north europe location
with private link and AD integration resource prefix must be awh, The azure terraform provider version is 3.80.0

4. Extensions vscode

Liste des fonctionnalités des assistants de codage IA utilisées :

Features Bito Codeium Cody AskCodi Github Copilot
Completions Code Oui Oui Oui Oui Oui
Chat AI Oui Oui Oui Oui Oui
Traduction Code Oui Oui Oui Oui Oui
Command Line Interface Oui Non Non Non Oui
Correction Code Oui Oui Oui Non Oui
Open Source Non Non Oui Non Non
Comprend votre code local dès le départ Oui Oui Non Non Oui
Navigation code Oui Oui Oui Non Oui
Amélioration code (propositions) Oui Non Oui Non Oui
Résumer les modifications récentes du code Oui Non Oui Non Non
Générer des notes de version Oui Non Non Non Non
Suivi des références Oui Oui Oui Non Non
Generation Documentation Oui Oui Oui Oui Oui
Genère les test unitaires Oui Oui Oui Oui Oui
Modèle d'IA personnalisé Oui Fonctionnalité payante (entreprise) Non Non Non
Accès hors ligne Non Fonctionnalité payante (entreprise) Non Non Non
Auto-hébergement Non Fonctionnalité payante (entreprise) Fonctionnalité payante (entreprise) Non Non
Confidentialité du code Oui Oui Oui Non Oui

4.1. Bito

Contrairement à Copilot, Bito fonctionne comme un chatbot dans VS Code. Il garde les traces des conversations.

4.2. Codeium

Codeium est un assistant de codage alimenté par des modèles et une infrastructure d'IA générative internes. Les modèles d'IA sont entrainés sur plus de 70 langages de programmation.

Il propose la saisie semi-automatique du code, la recherche intelligente (recherche de fichiers et de code dans un dossier de projet à l'aide de prompt en langage naturel) et le chat alimenté par l'IA.

4.3. Cody AI

CodyAI est un outil de pair-programmation IA similaire à GitHub Copilot.

Les principales fonctionnalités de CodyAI sont les suivantes :

Autocomplétion : CodyAI suggère des mots, des phrases et des blocs de code complets en fonction du contexte du fichier que vous modifiez. Vous pouvez accepter ou rejeter les suggestions de CodyAI. Conversion des commentaires de code en code exécutable : CodyAI peut convertir des commentaires de code en code exécutable. Cela peut être utile pour documenter votre code ou pour générer des prototypes rapidement.

La prise en charge de plusieurs langages de programmation : CodyAI prend en charge plus de 100 langages de programmation, y compris Python, JavaScript, Java, C++, Go, Rust, etc. La personnalisation : Vous pouvez personnaliser les suggestions de CodyAI en fonction de vos préférences. L'apprentissage : CodyAI apprend de vos interactions avec lui, ce qui lui permet de fournir des suggestions plus pertinentes au fil du temps. CodyAI est un outil puissant qui peut aider les développeurs à gagner du temps et à améliorer la qualité de leur code. Il est encore en développement, mais il a déjà le potentiel de concurrencer GitHub Copilot.

4.4. AskCodi

AskCodi est une alternative gratuite à GitHub Copilot pour VS Code. Il utilise OpenAI Codex pour effectuer de nombreuses tâches d'un assistant de code AI.

Par exemple, il peut être utilisé pour des suggestions de code, de la documentation logicielle, des explications de code, des tests, etc. Vous pouvez également utiliser sa fonction de chat pour démarrer une conversation avec votre programmeur AI.

AskCodi donne la priorité à la confidentialité du code. Il n’enregistre pas le code que vous lui transmettez ni le code qu’il génère.

4.5. Github Copilot

GitHub Copilot est un outil de pair-programmation IA qui fournit des suggestions d'autocomplétion pendant que vous codez. Il est alimenté par un modèle d'IA générative développé par GitHub, OpenAI et Microsoft.

Les principales fonctionnalités de GitHub Copilot sont les suivantes :

Autocomplétion : GitHub Copilot suggère des mots, des phrases et des blocs de code complets en fonction du contexte du fichier que vous modifiez. Vous pouvez accepter ou rejeter les suggestions de GitHub Copilot. Conversion des commentaires de code en code exécutable : GitHub Copilot peut convertir des commentaires de code en code exécutable. Cela peut être utile pour documenter votre code ou pour générer des prototypes rapidement. Saisie semi-automatique de bloc de code : GitHub Copilot peut vous aider à saisir des morceaux de code répétitifs, tels que des fonctions ou des méthodes. Génération de code : GitHub Copilot peut générer du code complet, à partir d'une simple description en langage naturel.

5. Navigateur

5.1. Bard

Bard est un grand modèle de langage chatbot développé par Google AI, entrainé sur un ensemble de données massif de texte et de code.

5.2. Bing

Bing New AI est une nouvelle expérience de recherche web propulsée par l'intelligence artificielle.

Elle a été lancée par Microsoft en février 2023.

5.3. Perplexity.ai

Perplexity AI est une plateforme d'intelligence artificielle qui permet aux utilisateurs de créer des chatbots, des assistants virtuels et d'autres applications conversationnelles.

5.4. Claude.ai

Claude.ai est un générateur de texte par IA développé par Anthropic, une entreprise spécialisée dans l'intelligence artificielle. Il est capable de générer du texte, en réponse à une requête posée par l'utilisateur.

6. Résultats

6.1. AsckCodi

Code généré par AskCodi :

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.80.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "aks" {
  name     = "awh-aks-rg"
  location = "northeurope"
}

resource "azurerm_virtual_network" "aks" {
  name                = "awh-aks-vnet"
  resource_group_name = azurerm_resource_group.aks.name
  location            = azurerm_resource_group.aks.location
  address_space       = ["10.0.0.0/16"]
}

resource "azurerm_subnet" "aks" {
  name                 = "aks-subnet"
  resource_group_name  = azurerm_resource_group.aks.name
  virtual_network_name = azurerm_virtual_network.aks.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_kubernetes_cluster" "aks" {
  name                = "awh-aks-cluster"
  location            = azurerm_resource_group.aks.location
  resource_group_name = azurerm_resource_group.aks.name
  dns_prefix          = "awh-aks"

  private_cluster_enabled = true

  private_dns_zone_id = azurerm_private_dns_zone.private_link.id

  admin_username = "azureuser"

  agent_pool_profile {
    name            = "default"
    count           = 1
    vm_size         = "Standard_D2s_v3"
    os_type         = "Linux"
    os_disk_size_gb = 30
  }

  service_principal {
    client_id     = var.client_id
    client_secret = var.client_secret
  }

  network_profile {
    network_plugin = "azure"
    network_policy = "calico"
  }

  addon_profile {
    azure_active_directory {
      enabled                           = true
      managed                           = true
      tenant_id                         = var.tenant_id
      admin_group_object_ids            = [var.admin_group_object_id]
      user_group_object_ids             = [var.user_group_object_id]
      cluster_manager_group_object_id   = var.cluster_manager_group_object_id
      azure_rbac_user_assignment_enabled = true
    }
  }
}

resource "azurerm_private_link_service" "private_link" {
  name                = "awh-aks-private-link"
  location            = azurerm_resource_group.aks.location
  resource_group_name = azurerm_resource_group.aks.name

  ip_configuration {
    name                          = "awh-aks-privatelink-ipconfig"
    subnet_id                     = azurerm_subnet.aks.id
    private_ip_address_allocation = "Static"
    private_ip_address            = "10.0.1.100"
  }

  visibility {
    private_endpoint_network_policies {
      enable_private_endpoint_dns_registration = true
      enable_private_link_service_network_acl  = true
    }
  }
}

resource "azurerm_private_endpoint" "private_link" {
  name                = "awh-aks-private-endpoint"
  location            = azurerm_resource_group.aks.location
  resource_group_name = azurerm_resource_group.aks.name

  subnet_id                            = azurerm_subnet.aks.id
  private_link_service_id               = azurerm_private_link_service.private_link.id
  private_endpoint_network_policies_ids = [azurerm_private_dns_zone.private_link_policy.id]

  private_service_connection {
    name                           = "awh-aks-private-endpoint-connection"
    private_connection_resource_id = azurerm_kubernetes_cluster.aks.id
    group_ids                      = []
  }
}

resource "azurerm_private_dns_zone" "private_link" {
  name                = "privatelink.kubernetes"
  resource_group_name = azurerm_resource_group.aks.name
  resolution_virtual_network_ids = [azurerm_virtual_network.aks.id]
}

resource "azurerm_private_dns_zone_virtual_network_link" "private_link_link" {
  name              = "privatelink-link"
  resource_group_name = azurerm_resource_group.aks.name

  private_dns_zone_id       = azurerm_private_dns_zone.private_link.id
  virtual_network_id = azurerm_virtual_network.aks.id
}

Résultats :

  • Configuration inutilisable

  • Le code généré n'est pas satisfaisant et comporte de nombreuses erreurs, défauts et oublis.

par exemple :

La ressource azurerm_kubernetes_cluster est incomplète, il manque la partie node_pool.

L'IA s'appuie sur un modèle de code Terraform qui date.

6.2 Bito

Code généré par Bito :

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.80.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "aks" {
  name     = "awh-aks"
  location = "northeurope"
}

resource "azurerm_virtual_network" "aks" {
  name                = "awh-aks-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.aks.location
  resource_group_name = azurerm_resource_group.aks.name
}

resource "azurerm_subnet" "aks" {
  name                 = "aks-subnet"
  resource_group_name  = azurerm_resource_group.aks.name
  virtual_network_name = azurerm_virtual_network.aks.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_kubernetes_cluster" "aks" {
  name                = "awh-aks-cluster"
  location            = azurerm_resource_group.aks.location
  resource_group_name = azurerm_resource_group.aks.name
  dns_prefix          = "awh-aks"

  private_cluster_enabled = true

  default_node_pool {
    name                = "default"
    node_count          = 1
    vm_size             = "Standard_D2_v2"
    type                = "VirtualMachineScaleSets"
    enable_auto_scaling = true
    min_count           = 1
    max_count           = 3
  }

  network_profile {
    network_plugin = "azure"
    network_policy = "azure"
  }

  addon_profile {
    azure_active_directory {
      enabled = true
    }
  }
}

Résultats :

  • Configuration inutilisable

  • Il manque les parties private link et AD. La section `addon_profile n'à rien à faire la.

  • Même chose que pour AsckCodi. Les modèles ne sont pas à la page.

Les réponses de l'IA sont les mêmes à chaque fois

6.3 CodeIum

# Configure Azure provider
provider "azurerm" {
  features {}
}

# Create a resource group
resource "azurerm_resource_group" "example" {
  name     = "awh-resource-group"
  location = "North Europe"
}

# Create a virtual network
resource "azurerm_virtual_network" "example" {
  name                = "awh-virtual-network"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

# Create a subnet
resource "azurerm_subnet" "example" {
  name                 = "awh-subnet"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

# Create an AKS cluster
resource "azurerm_kubernetes_cluster" "example" {
  name                = "awh-aks-cluster"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = "awhakscluster"

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_DS2_v2"
  }

  service_principal {
    client_id     = "YOUR_CLIENT_ID"
    client_secret = "YOUR_CLIENT_SECRET"
  }

  network_profile {
    network_plugin     = "azure"
    network_policy     = "calico"
    dns_service_ip     = "10.0.0.10"
    docker_bridge_cidr = "172.17.0.1/16"
    service_cidr       = "10.0.0.0/16"
  }

  addon_profile {
    azure_active_directory {
      enabled = true
      managed = true
    }
  }

  private_cluster_enabled = true
  private_dns_zone        = "privatelink.azure.com"
}

Résultats :

  • Configuration inutilisable
  • Les arguments private_dns_zone et addon_profile ne sont pas bons / bien placés

6.4. CodyAI

Code généré par CodyAI :

# Configure Azure provider
provider "azurerm" {
  features {}
}

# Create resource group
resource "azurerm_resource_group" "awh" {
  name     = "awh-rg"
  location = "North Europe"
}

# Create AD application
resource "azuread_application" "awh" {
  display_name = "awh-app"
}

# Create service principal
resource "azuread_service_principal" "awh" {
  application_id = azuread_application.awh.application_id
}

# Generate random password
resource "random_password" "awh" {
  length  = 16
  special = true
}

# Create service principal password
resource "azuread_service_principal_password" "awh" {
  service_principal_id = azuread_service_principal.awh.id
  value                = random_password.awh.result
  end_date_relative    = "17520h" # 2 years
}

# Create virtual network
resource "azurerm_virtual_network" "awh" {
  name                = "awh-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.awh.location
  resource_group_name = azurerm_resource_group.awh.name
}

# Create subnet
resource "azurerm_subnet" "awh" {
  name                 = "awh-subnet"
  resource_group_name  = azurerm_resource_group.awh.name
  virtual_network_name = azurerm_virtual_network.awh.name
  address_prefixes     = ["10.0.0.0/24"]
}

# Create AKS cluster
resource "azurerm_kubernetes_cluster" "awh" {
  name                = "awh-aks"
  location            = azurerm_resource_group.awh.location
  resource_group_name = azurerm_resource_group.awh.name

  dns_prefix = "awhaks"

  default_node_pool {
    name           = "default"
    node_count     = 1
    vm_size        = "Standard_D2_v2"
    vnet_subnet_id = azurerm_subnet.awh.id
  }

  private_cluster_enabled = true

  # Enable AD integration
  azure_active_directory_role_based_access_control {
    managed                = true
    admin_group_object_ids = [""]
    client_app_id          = azuread_application.awh.application_id
    server_app_id          = azuread_application.awh.application_id
    server_app_secret      = azuread_service_principal_password.awh.value
  }
}

Résultats :

A première vue tout est ok. Aucun Warning dans l'interface de VSCode.

La seule chose à modifier pour que ca marche :

Supprimer value dans la ressource car le mot de passe est généré dynamiquement.

# Create service principal password
resource "azuread_service_principal_password" "awh" {
  service_principal_id = azuread_service_principal.awh.id
  value                = random_password.awh.result
  end_date_relative    = "17520h" # 2 years
}

6.5. Github Copilot

Code généré par Github Copilot :

provider "azurerm" {
    features {}
}

resource "azurerm_resource_group" "aks" {
    name     = "awh-aks-rg"
    location = "northeurope"
}

resource "azurerm_virtual_network" "aks" {
    name                = "awh-aks-vnet"
    address_space       = ["10.0.0.0/16"]
    location            = azurerm_resource_group.aks.location
    resource_group_name = azurerm_resource_group.aks.name
}

resource "azurerm_subnet" "aks" {
    name                 = "aks-subnet"
    resource_group_name  = azurerm_resource_group.aks.name
    virtual_network_name = azurerm_virtual_network.aks.name
    address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_kubernetes_cluster" "aks" {
    name                = "awh-aks-cluster"
    location            = azurerm_resource_group.aks.location
    resource_group_name = azurerm_resource_group.aks.name
    dns_prefix          = "awh-aks-cluster"

    private_cluster_enabled = true

    network_profile {
        network_plugin = "azure"
        network_policy = "azure"
    }

    linux_profile {
        admin_username = "azureuser"
    }

    service_principal {
        client_id     = var.client_id
        client_secret = var.client_secret
    }

    depends_on = [
        azurerm_subnet.aks
    ]
}

resource "azurerm_kubernetes_service" "aks" {
    depends_on = [
        azurerm_kubernetes_cluster.aks
    ]

    name                = "awh-aks-service"
    location            = azurerm_resource_group.aks.location
    resource_group_name = azurerm_resource_group.aks.name
    depends_on          = [azurerm_kubernetes_cluster.aks]

    private_endpoint_connections {
        name                = "awh-aks-pec"
        private_endpoint_id = var.private_endpoint_id
        subnet_id           = azurerm_subnet.aks.id
    }
}

Résultats :

  • Configuration inutilisable
  • La ressource azurerm_kubernetes_cluster est incomplète. Il manque le paramètre default_node_pool.

6.6. Perplexity

Code généré par Perplexity :

provider "azurerm" {
  features {}
}

provider "azuread" {}

resource "azuread_application" "aks" {
  name = "aks"
}

resource "azuread_service_principal" "aks" {
  application_id = azuread_application.aks.application_id
}

resource "azuread_service_principal_password" "aks" {
  service_principal_id = azuread_service_principal.aks.id
  value                = "password"
  end_date             = "2024-01-01T01:02:03Z"
}

resource "azurerm_kubernetes_cluster" "aks" {
  name                = "aks"
  location            = "northeurope"
  resource_group_name = "rg"

  dns_prefix = "aks"

  service_cidr   = "10.0.0.0/16"
  dns_service_ip = "10.0.0.10"
  pod_cidr       = "10.244.0.0/16"

  linux_profile {
    admin_username = "azureuser"
    ssh_key {
      key_data = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7..."
    }
  }

  service_principal {
    client_id     = azuread_service_principal.aks.application_id
    client_secret = azuread_service_principal_password.aks.value
  }

  depends_on = [
    azuread_service_principal_password.aks
  ]
}
  • Configuration inutilisable
  • La ressource azurerm_kubernetes_cluster est incomplète. Il manque le paramètre default_node_pool.

6.7. Bard

Code généré par Bard :

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "aks-rg" {
  name     = "awh-aks-rg"
  location = "northcentralus"
}

resource "azurerm_private_dns_zone" "aks-private-dns" {
  name                = "awh-aks-private-dns"
  resource_group_name = azurerm_resource_group.aks-rg.name
}

resource "azurerm_private_dns_virtual_network_link" "aks-private-dns-link" {
  name                  = "awh-aks-private-dns-link"
  resource_group_name   = azurerm_resource_group.aks-rg.name
  private_dns_zone_name = azurerm_private_dns_zone.aks-private-dns.name
  subnet_id             = azurerm_virtual_network_subnet.aks-vnet-subnet.id
}

resource "azurerm_virtual_network" "aks-vnet" {
  name                = "awh-aks-vnet"
  location            = azurerm_resource_group.aks-rg.location
  resource_group_name = azurerm_resource_group.aks-rg.name

  address_prefixes = ["10.0.0.0/16"]
}

resource "azurerm_subnet" "aks-vnet-subnet" {
  name                 = "awh-aks-vnet-subnet"
  virtual_network_name = azurerm_virtual_network.aks-vnet.name
  resource_group_name  = azurerm_resource_group.aks-rg.name
  address_prefix       = "10.0.0.0/24"
}

resource "azurerm_kubernetes_cluster" "aks-cluster" {
  name                = "awh-aks-cluster"
  location            = azurerm_resource_group.aks-rg.location
  resource_group_name = azurerm_resource_group.aks-rg.name

  dns_prefix = "awh-aks"

  default_node_pool {
    name       = "awh-aks-node-pool"
    node_count = 3
    vm_size    = "Standard_D2s_v3"
  }

  private_link_subnet_ids = [azurerm_private_dns_virtual_network_link.aks-private-dns-link.subnet_id]
}

resource "azurerm_ad_service_principal" "aks-service-principal" {
  application_id = azurerm_client_application.aks-service-principal.application_id
}

resource "azurerm_kubernetes_cluster_role_binding" "aks-cluster-role-binding" {
  cluster_name                = azurerm_kubernetes_cluster.aks-cluster.name
  role_definition_id          = "5b888547-1782-4e28-8552-78266df53e59"
  service_principal_object_id = azurerm_ad_service_principal.aks-service-principal.object_id
}

Résultats :

  • Configuration inutilisable
  • Les ressources azurerm_virtual_network et azurerm_subnet sont incomplètes

6.8. Bing

Code généré par Bing :

# Define the required provider and version
provider "azurerm" {
  features {}
}

# Define the resource group
resource "azurerm_resource_group" "awh_rg" {
  name     = "awh-rg"
  location = "northeurope"
}

# Define the virtual network
resource "azurerm_virtual_network" "awh_vnet" {
  name                = "awh-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.awh_rg.location
  resource_group_name = azurerm_resource_group.awh_rg.name
}

# Define the subnet for the aks cluster
resource "azurerm_subnet" "awh_subnet" {
  name                 = "awh-subnet"
  resource_group_name  = azurerm_resource_group.awh_rg.name
  virtual_network_name = azurerm_virtual_network.awh_vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

# Define the private endpoint for the aks cluster
resource "azurerm_private_endpoint" "awh_pe" {
  name                = "awh-pe"
  location            = azurerm_resource_group.awh_rg.location
  resource_group_name = azurerm_resource_group.awh_rg.name
  subnet_id           = azurerm_subnet.awh_subnet.id

  private_service_connection {
    name                           = "awh-psc"
    private_connection_resource_id = azurerm_kubernetes_cluster.awh_aks.id
    is_manual_connection           = false
    subresource_names              = ["management"]
  }
}

# Define the AD service principal for the aks cluster
resource "azuread_service_principal" "awh_sp" {
  application_id = azuread_application.awh_app.application_id
}

# Define the AD application for the aks cluster
resource "azuread_application" "awh_app" {

  display_name = "awh-app"
}

# Define the AD service principal password for the aks cluster
resource "azuread_service_principal_password" "awh_spp" {
  service_principal_id = azuread_service_principal.awh_sp.id
  #value                = "your-password-here"
  end_date_relative = "8760h"
}

# Define the aks cluster
resource "azurerm_kubernetes_cluster" "awh_aks" {
  name                = "awh-aks"
  location            = azurerm_resource_group.awh_rg.location
  resource_group_name = azurerm_resource_group.awh_rg.name
  dns_prefix          = "awh-aks"

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_D2_v2"
  }

  identity {
    type = "SystemAssigned"
  }

  service_principal {
    client_id     = azuread_service_principal.awh_sp.application_id
    client_secret = azuread_service_principal_password.awh_spp.value
  }

  private_cluster_enabled = true
  private_dns_zone_id     = "System"
}

Résultats :

Tout est ok à première vue. Pour que ca passe au niveau du plan, comme pour CodyAI, il faut mettre en commentaire value dans la ressource azuread_service_principal_password

6.9. Claude

Code généré par Claude :

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.80.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "rg-awh"
  location = "northeurope"
}

resource "azurerm_virtual_network" "vnet" {
  name                = "vnet-awh"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  address_space       = ["10.0.0.0/16"]
}

resource "azurerm_subnet" "subnet" {
  name                 = "subnet-awh"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]

  delegation {
    name = "delegation"

    service_delegation {
      name    = "Microsoft.ContainerService/managedClusters"
      actions = ["Microsoft.Network/virtualNetworks/subnets/join/action", "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action"]
    }
  }
}

resource "azurerm_private_dns_zone" "dns_zone" {
  name                = "privatelink.northeurope.azmk8s.io"
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_role_assignment" "role_assignment" {
  scope                = azurerm_private_dns_zone.dns_zone.id
  role_definition_name = "Private DNS Zone Contributor"
  principal_id         = azurerm_kubernetes_cluster.aks.identity[0].principal_id
}

resource "azurerm_kubernetes_cluster" "aks" {
  name                = "aks-awh"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  dns_prefix          = "aks-awh"

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_D2_v2"
  }

  identity {
    type = "SystemAssigned"
  }

  private_cluster_enabled = true

  private_dns_zone_id = azurerm_private_dns_zone.dns_zone.id

  network_profile {
    network_plugin    = "azure"
    load_balancer_sku = "Standard"
  }

  azure_active_directory_role_based_access_control {
    managed                = true
    admin_group_object_ids = ["${azuread_group.aks_admin.id}"]
  }

  depends_on = [azurerm_role_assignment.role_assignment]
}

resource "azuread_group" "aks_admin" {
  display_name     = "aks-admins"
  security_enabled = true
}

Résultats:

  • Code généré de bonne facture
  • Corrections a effectuées au niveau du plan : enlever dans la resource "azure_active_directory_role_based_access_control" la dépendance qui génère une circularité avec la resource du cluster aks et changer Standard en standard.

7. Conclusions

Les grands gagnant des tests sont :

  • Bing
  • CodyAI
  • Claude

Les autres assistants sont sur des modèles qui ne sont pas à jour ou des codes non fonctionnels enfin pour terrform.

Je pense que pour des langages "classiques" tous les assistant tirent leur épingles du jeux.

Par contre pour des langages très actifs, souvent sujet à des évolutions rapides, les assistants ne sont pas adaptés.

8. Focus CodyAI

C'est un produit de chez sourcegraph

Encore en Beta

Cody est un assistant de codage basé sur l’IA développé par Sourcegraph.

Il est conçu pour aider les développeurs à écrire, corriger et maintenir leur code plus rapidement et plus efficacement.

Cody utilise des modèles de langage naturel (LLM) pour fournir des réponses précises et contextuelles aux questions techniques et pour compléter automatiquement le code dans n’importe quel langage de programmation, fichier de configuration ou documentation.

Il est également capable de générer des tests unitaires, d’optimiser le code pour les meilleures pratiques et de décrire les améliorations possible du code.

Cody est disponible pour IntelliJ, VS Code, Neovim, Emacs et d’autres éditeurs de code populaires.

8.1. Video pour présenter la création de ressources terraform



8.2. Exemple de "code smell" (améliorations)

Découvrez les technologies d'alter way