Créer un contrôleur d’entrée Application Gateway dans Azure Kubernetes Service à l’aide de Terraform
Article testé avec les versions de fournisseur Terraform et Terraform suivantes :
Terraform permet la définition, l’aperçu et le déploiement d’une infrastructure cloud. Terraform vous permet de créer des fichiers de configuration à l’aide de la syntaxe HCL. La syntaxe HCL vous permet de spécifier un fournisseur de services cloud, tel qu’Azure, et les éléments qui composent votre infrastructure cloud. Après avoir créé vos fichiers de configuration, vous créez un plan d’exécution qui vous permet d’afficher un aperçu de vos modifications d’infrastructure avant leur déploiement. Une fois que vous avez vérifié les modifications, vous appliquez le plan d’exécution pour déployer l’infrastructure.
Azure Kubernetes Service (AKS) gère votre environnement Kubernetes hébergé. AKS permet de déployer et de gérer rapidement et facilement des applications conteneurisées sans expertise d’orchestration de conteneurs. De même, AKS vous évite la contrainte de mettre les applications hors connexion pour les tâches opérationnelles et de maintenance. À l’aide d’AKS, vous pouvez effectuer des tâches telles que l’approvisionnement, la mise à niveau et la mise à l’échelle des ressources à la demande.
Un contrôleur d’entrée Application Gateway (AGIC) fournit différentes fonctionnalités pour les services Kubernetes. le proxy inversé, le routage configurable du trafic et l’arrêt TLS. Les ressources d’entrée Kubernetes sont utilisées pour configurer les règles d’entrée pour des services Kubernetes individuels. Un contrôleur d’entrée permet à une seule adresse IP d’acheminer le trafic vers plusieurs services dans un cluster Kubernetes. Toutes ces fonctionnalités sont fournies par Azure Application Gateway, ce qui en fait un contrôleur d’entrée idéal pour Kubernetes sur Azure.
Dans cet article, vous apprendrez à :
- Créer un cluster Kubernetes à l’aide d’AKS avec Application Gateway comme contrôleur d’entrée
- Définir un cluster Kubernetes
- Créer une ressource Application Gateway
- Créer un cluster Kubernetes
- Tester la disponibilité d’un cluster Kubernetes
Notes
L’exemple de code de cet article se trouve dans le GitHub Microsoft Terraform.
1. Configurer votre environnement
- Abonnement Azure : Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
Configurer Terraform : si ce n’est déjà fait, configurez Terraform à l’aide de l’une des options suivantes :
Principal de service Azure : la démonstration nécessite un principal de service qui peut attribuer des rôles. Si vous disposez déjà d’un principal de service qui peut attribuer des rôles, vous pouvez utiliser ce principal de service. Si vous devez créer un principal de service, vous avez deux options :
- Spécifiez le rôle « Propriétaire » lorsque vous créez un principal de service. Comme pratique recommandée, vous devez accorder le moindre privilège nécessaire pour effectuer un travail donné. Par conséquent, utilisez uniquement le rôle « Propriétaire » si le principal de service est destiné à être utilisé dans cette capacité.
- Créez un rôle personnalisé et spécifiez ce rôle lorsque vous créez un principal de service.
Vous aurez besoin des valeurs de principal de service suivantes pour le code de démonstration :
appId
,displayName
, ,password
tenant
.ID d’objet du principal du service : Exécutez la commande
az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":objectId}" --output table
pour obtenir l’ID d’objet du principal de service.Paire de clés SSH : utilisez l’un des articles suivants :
Installer Helm : Helm est le gestionnaire de package Kubernetes.
Installez GNU wget : vérifiez que vous avez accès à wget en exécutant
wget
n’importe quelle ligne de commande sans aucun paramètre. Vous pouvez installer wget à partir du site web wget de GNU officiel.
2. Configurer le stockage Azure pour stocker l’état de Terraform
Terraform suit l’état en local via le fichier terraform.tfstate
. Ce modèle fonctionne bien dans un environnement comptant une seule personne. Cependant, dans un environnement à plusieurs personnes plus pratique, vous devez suivre l’état sur le serveur en utilisant le stockage Azure. Dans cette section, vous allez apprendre à récupérer les informations de compte de stockage nécessaires et à créer un conteneur de stockage. Les informations d’état de Terraform sont ensuite stockées dans ce conteneur.
Utilisez l’une des options suivantes pour créer un compte de stockage Azure :
Accédez au portail Azure.
Sous Services Azure, sélectionnez Comptes de stockage. (Si l’option Comptes de stockage n’est pas visible dans la page principale, sélectionnez Plus de services pour la localiser.)
Dans la page Comptes de stockage , dans la page Comptes de stockage, sélectionnez le compte de stockage dans lequel Terraform stockera les informations d’état.
Dans la page Compte de stockage , dans le menu de gauche, dans la section Sécurité + mise en réseau , sélectionnez Clés d’accès.
Dans la page Clés d’accès , sélectionnez Afficher les clés pour afficher les valeurs de clé.
Recherchez la touchekey1 sur la page et sélectionnez l’icône à droite pour copier la valeur de la clé dans le Presse-papiers.
À partir d’une invite de ligne de commande, exécutez az storage container create. Cette commande crée un conteneur dans votre compte de stockage Azure. Remplacez les espaces réservés par les valeurs appropriées pour votre compte de stockage Azure.
az storage container create -n tfstate \ --account-name <storage_account_name> \ --account-key <storage_account_key>
Une fois la commande terminée, elle affiche un bloc JSON avec la clé « created » et la valeur true. Vous pouvez également exécuter az storage container list pour vérifier que le conteneur a bien été créé.
az storage container list \ --account-name <storage_account_name> \ --account-key <storage_account_key>
3. Implémenter le code Terraform
Créez un répertoire dans lequel tester l’exemple de code Terraform et définissez-le comme répertoire actuel.
Créez un fichier nommé
providers.tf
et insérez le code suivant.terraform { required_version = ">=0.12" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } } backend "azurerm" { resource_group_name = "<storage_account_resource_group>" storage_account_name = "<storage_account_name>" container_name = "tfstate" key = "codelab.microsoft.tfstate" } } provider "azurerm" { features {} }
Points essentiels :
- Définissez
resource_group_name
sur le groupe de ressources du compte de stockage. - Définissez
storage_account_name
sur le nom du compte de stockage.
- Définissez
Créez un fichier nommé
main.tf
et insérez le code suivant :resource "random_pet" "rg-name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { name = random_pet.rg-name.id location = var.resource_group_location } # Locals block for hardcoded names locals { backend_address_pool_name = "${azurerm_virtual_network.test.name}-beap" frontend_port_name = "${azurerm_virtual_network.test.name}-feport" frontend_ip_configuration_name = "${azurerm_virtual_network.test.name}-feip" http_setting_name = "${azurerm_virtual_network.test.name}-be-htst" listener_name = "${azurerm_virtual_network.test.name}-httplstn" request_routing_rule_name = "${azurerm_virtual_network.test.name}-rqrt" app_gateway_subnet_name = "appgwsubnet" } # User Assigned Identities resource "azurerm_user_assigned_identity" "testIdentity" { resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location name = "identity1" tags = var.tags } resource "azurerm_virtual_network" "test" { name = var.virtual_network_name location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name address_space = [var.virtual_network_address_prefix] subnet { name = var.aks_subnet_name address_prefix = var.aks_subnet_address_prefix } subnet { name = "appgwsubnet" address_prefix = var.app_gateway_subnet_address_prefix } tags = var.tags } data "azurerm_subnet" "kubesubnet" { name = var.aks_subnet_name virtual_network_name = azurerm_virtual_network.test.name resource_group_name = azurerm_resource_group.rg.name depends_on = [azurerm_virtual_network.test] } data "azurerm_subnet" "appgwsubnet" { name = "appgwsubnet" virtual_network_name = azurerm_virtual_network.test.name resource_group_name = azurerm_resource_group.rg.name depends_on = [azurerm_virtual_network.test] } # Public Ip resource "azurerm_public_ip" "test" { name = "publicIp1" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Static" sku = "Standard" tags = var.tags } resource "azurerm_application_gateway" "network" { name = var.app_gateway_name resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location sku { name = var.app_gateway_sku tier = "Standard_v2" capacity = 2 } gateway_ip_configuration { name = "appGatewayIpConfig" subnet_id = data.azurerm_subnet.appgwsubnet.id } frontend_port { name = local.frontend_port_name port = 80 } frontend_port { name = "httpsPort" port = 443 } frontend_ip_configuration { name = local.frontend_ip_configuration_name public_ip_address_id = azurerm_public_ip.test.id } backend_address_pool { name = local.backend_address_pool_name } backend_http_settings { name = local.http_setting_name cookie_based_affinity = "Disabled" port = 80 protocol = "Http" request_timeout = 1 } http_listener { name = local.listener_name frontend_ip_configuration_name = local.frontend_ip_configuration_name frontend_port_name = local.frontend_port_name protocol = "Http" } request_routing_rule { name = local.request_routing_rule_name rule_type = "Basic" http_listener_name = local.listener_name backend_address_pool_name = local.backend_address_pool_name backend_http_settings_name = local.http_setting_name } tags = var.tags depends_on = [azurerm_virtual_network.test, azurerm_public_ip.test] } resource "azurerm_role_assignment" "ra1" { scope = data.azurerm_subnet.kubesubnet.id role_definition_name = "Network Contributor" principal_id = var.aks_service_principal_object_id depends_on = [azurerm_virtual_network.test] } resource "azurerm_role_assignment" "ra2" { scope = azurerm_user_assigned_identity.testIdentity.id role_definition_name = "Managed Identity Operator" principal_id = var.aks_service_principal_object_id depends_on = [azurerm_user_assigned_identity.testIdentity] } resource "azurerm_role_assignment" "ra3" { scope = azurerm_application_gateway.network.id role_definition_name = "Contributor" principal_id = azurerm_user_assigned_identity.testIdentity.principal_id depends_on = [azurerm_user_assigned_identity.testIdentity, azurerm_application_gateway.network] } resource "azurerm_role_assignment" "ra4" { scope = azurerm_resource_group.rg.id role_definition_name = "Reader" principal_id = azurerm_user_assigned_identity.testIdentity.principal_id depends_on = [azurerm_user_assigned_identity.testIdentity, azurerm_application_gateway.network] } resource "azurerm_kubernetes_cluster" "k8s" { name = var.aks_name location = azurerm_resource_group.rg.location dns_prefix = var.aks_dns_prefix resource_group_name = azurerm_resource_group.rg.name http_application_routing_enabled = false linux_profile { admin_username = var.vm_user_name ssh_key { key_data = file(var.public_ssh_key_path) } } default_node_pool { name = "agentpool" node_count = var.aks_agent_count vm_size = var.aks_agent_vm_size os_disk_size_gb = var.aks_agent_os_disk_size vnet_subnet_id = data.azurerm_subnet.kubesubnet.id } service_principal { client_id = var.aks_service_principal_app_id client_secret = var.aks_service_principal_client_secret } network_profile { network_plugin = "azure" dns_service_ip = var.aks_dns_service_ip docker_bridge_cidr = var.aks_docker_bridge_cidr service_cidr = var.aks_service_cidr } role_based_access_control { enabled = var.aks_enable_rbac } depends_on = [azurerm_virtual_network.test, azurerm_application_gateway.network] tags = var.tags }
Créez un fichier nommé
variables.tf
et insérez le code suivant :variable "resource_group_name_prefix" { default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "resource_group_location" { default = "eastus" description = "Location of the resource group." } variable "aks_service_principal_app_id" { description = "Application ID/Client ID of the service principal. Used by AKS to manage AKS related resources on Azure like vms, subnets." } variable "aks_service_principal_client_secret" { description = "Secret of the service principal. Used by AKS to manage Azure." } variable "aks_service_principal_object_id" { description = "Object ID of the service principal." } variable "virtual_network_name" { description = "Virtual network name" default = "aksVirtualNetwork" } variable "virtual_network_address_prefix" { description = "VNET address prefix" default = "192.168.0.0/16" } variable "aks_subnet_name" { description = "Subnet Name." default = "kubesubnet" } variable "aks_subnet_address_prefix" { description = "Subnet address prefix." default = "192.168.0.0/24" } variable "app_gateway_subnet_address_prefix" { description = "Subnet server IP address." default = "192.168.1.0/24" } variable "app_gateway_name" { description = "Name of the Application Gateway" default = "ApplicationGateway1" } variable "app_gateway_sku" { description = "Name of the Application Gateway SKU" default = "Standard_v2" } variable "app_gateway_tier" { description = "Tier of the Application Gateway tier" default = "Standard_v2" } variable "aks_name" { description = "AKS cluster name" default = "aks-cluster1" } variable "aks_dns_prefix" { description = "Optional DNS prefix to use with hosted Kubernetes API server FQDN." default = "aks" } variable "aks_agent_os_disk_size" { description = "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 applies the default disk size for that agentVMSize." default = 40 } variable "aks_agent_count" { description = "The number of agent nodes for the cluster." default = 3 } variable "aks_agent_vm_size" { description = "VM size" default = "Standard_D3_v2" } variable "kubernetes_version" { description = "Kubernetes version" default = "1.11.5" } variable "aks_service_cidr" { description = "CIDR notation IP range from which to assign service cluster IPs" default = "10.0.0.0/16" } variable "aks_dns_service_ip" { description = "DNS server IP address" default = "10.0.0.10" } variable "aks_docker_bridge_cidr" { description = "CIDR notation IP for Docker bridge." default = "172.17.0.1/16" } variable "aks_enable_rbac" { description = "Enable RBAC on the AKS cluster. Defaults to false." default = "false" } variable "vm_user_name" { description = "User name for the VM" default = "vmuser1" } variable "public_ssh_key_path" { description = "Public key path for SSH." default = "~/.ssh/id_rsa.pub" } variable "tags" { type = map(string) default = { source = "terraform" } }
Créez un fichier nommé
output.tf
et insérez le code suivant.output "resource_group_name" { value = azurerm_resource_group.rg.name } output "client_key" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_key } output "client_certificate" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_certificate } output "cluster_ca_certificate" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.cluster_ca_certificate } output "cluster_username" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.username } output "cluster_password" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.password } output "kube_config" { value = azurerm_kubernetes_cluster.k8s.kube_config_raw sensitive = true } output "host" { value = azurerm_kubernetes_cluster.k8s.kube_config.0.host } output "identity_resource_id" { value = azurerm_user_assigned_identity.testIdentity.id } output "identity_client_id" { value = azurerm_user_assigned_identity.testIdentity.client_id } output "application_ip_address" { value = azurerm_public_ip.test.ip_address }
Créez un fichier nommé
terraform.tfvars
et insérez le code suivant.aks_service_principal_app_id = "<service_principal_app_id>" aks_service_principal_client_secret = "<service_principal_password>" aks_service_principal_object_id = "<service_principal_object_id>"
Points essentiels :
- Définissez
aks_service_principal_app_id
sur la valeur du principalappId
de service. - Définissez
aks_service_principal_client_secret
sur la valeur du principalpassword
de service. - Définissez
aks_service_principal_object_id
sur l’ID d’objet du principal de service. (La commande Azure CLI permettant d’obtenir cette valeur se trouve dans la section Configurer votre environnement .)
- Définissez
4. Initialiser Terraform
Exécutez terraform init pour initialiser le déploiement Terraform. Cette commande télécharge le fournisseur Azure à utiliser pour la gestion de vos ressources Azure.
terraform init -upgrade
Points essentiels :
- Le
-upgrade
paramètre met à niveau les plug-ins de fournisseur nécessaires vers la version la plus récente qui est conforme aux contraintes de version de la configuration.
5. Créer un plan d’exécution Terraform
Exécutez terraform plan pour créer un plan d’exécution.
terraform plan -out main.tfplan
Points essentiels :
- La commande
terraform plan
crée un plan d’exécution, mais ne l’exécute pas. Au lieu de cela, elle détermine les actions nécessaires pour créer la configuration spécifiée dans vos fichiers de configuration. Ce modèle vous permet de vérifier si le plan d’exécution répond à vos attentes avant d’apporter des modifications aux ressources réelles. - Le paramètre facultatif
-out
vous permet de spécifier un fichier de sortie pour le plan. L’utilisation du paramètre-out
garantit que le plan que vous avez examiné correspond exactement à ce qui est appliqué. - Pour en savoir plus sur la persistance des plans d’exécution et de la sécurité, consultez la section d’avertissement de sécurité.
6. Appliquer un plan d’exécution Terraform
Exécutez terraform apply pour appliquer le plan d’exécution à votre infrastructure cloud.
terraform apply main.tfplan
Points essentiels :
- La commande
terraform apply
ci-dessus part du principe que vous avez préalablement exécutéterraform plan -out main.tfplan
. - Si vous avez spécifié un autre nom de fichier pour le paramètre
-out
, utilisez ce même nom dans l’appel àterraform apply
. - Si vous n’avez pas utilisé le paramètre
-out
, appelezterraform apply
sans aucun paramètre.
7. Vérifier les résultats : Tester le cluster Kubernetes
Les outils Kubernetes peuvent être utilisés pour vérifier le cluster nouvellement créé.
Exécutez az aks get-credentials pour obtenir la configuration Kubernetes et accéder aux informations d’identification à partir d’Azure.
az aks get-credentials --name <aks_cluster_name> \ --resource-group <resource_group_name> \ --overwrite-existing
Points essentiels :
- Remplacez l’espace
<aks_cluster_name>
réservé par laaks_name
valeur dudefault
bloc (à partir duvariables.tf
fichier). - Remplacez l’espace
<resource_group_name>
réservé par le nom du groupe de ressources généré de manière aléatoire. Obtenez le nom du groupe de ressources en exécutantecho "$(terraform output resource_group_name)"
.
- Remplacez l’espace
Vérifiez l’intégrité du cluster.
kubectl get nodes
Points essentiels :
- Les détails de vos nœuds Worker sont affichés avec l’état Prêt.
8. Installer Azure AD Pod Identity
Azure Active Directory Pod Identity offre un accès à base de jeton à Azure Resource Manager.
Azure AD Pod Identity ajoute les composants suivants à votre cluster Kubernetes :
- Définitions CRD Kubernetes :
AzureIdentity
,AzureAssignedIdentity
,AzureIdentityBinding
- Composant MIC (Managed Identity Controller)
- Composant NMI (Node Managed Identity)
Pour installer Azure AD Pod Identity sur votre cluster, vous devez savoir si RBAC est activé ou désactivé. RBAC est désactivé par défaut pour cette démonstration. L’activation ou la désactivation du RBAC s’effectue dans le variables.tf
fichier via la aks_enable_rbac
valeur du default
bloc.
Si RBAC est activé, exécutez la commande suivante :
kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment-rbac.yaml
Si RBAC est désactivé, exécutez la commande suivante :
kubectl create -f https://raw.githubusercontent.com/Azure/aad-pod-identity/master/deploy/infra/deployment.yaml
9. Installer Helm
Utilisez Helm pour installer le application-gateway-kubernetes-ingress
package :
Exécutez les commandes helm suivantes pour ajouter le dépôt Helm AGIC.
helm repo add application-gateway-kubernetes-ingress https://appgwingress.blob.core.windows.net/ingress-azure-helm-package/
Mettez à jour le dépôt Helm AGIC.
helm repo update
10. Installer AGIC Helm Chart
Téléchargez
helm-config.yaml
pour configurer AGIC. (Si vous n’avez pas accès àwget
, consultez la section Configurer votre environnement .)wget https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/sample-helm-config.yaml -O helm-config.yaml
Ouvrez le fichier
helm-config.yaml
dans un éditeur de texte.Entrez des valeurs pour les clés de niveau supérieur.
verbosityLevel
: spécifiez le niveau de détail de l’infrastructure de journalisation AGIC. Pour plus d’informations sur les niveaux de journalisation, consultez la section Niveaux de journalisation du document d’entrée Application Gateway Kubernetes.
Entrez les valeurs du
appgw
bloc.appgw.subscriptionId
: spécifiez l’ID d’abonnement Azure utilisé pour créer la passerelle App Gateway.appgw.resourceGroup
: spécifiez le nom du groupe de ressources généré de manière aléatoire. Obtenir le nom du groupe de ressources en exécutantecho "$(terraform output resource_group_name)"
appgw.name
: spécifiez le nom du Application Gateway. Cette valeur est définie dans levariables.tf
fichier via laapp_gateway_name
valeur dudefault
bloc.appgw.shared
: cet indicateur booléen est défini par défaut surfalse
. Définissez-la surtrue
si vous avez besoin d’une passerelle d’application partagée.
Entrez les valeurs du
kubernetes
bloc.kubernetes.watchNamespace
: spécifiez l’espace de noms que doit observer AGIC. L’espace de noms peut être une valeur de chaîne unique ou une liste d’espaces de noms séparés par des virgules. Si vous laissez cette variable commentée ou si vous la définissez sur une chaîne vide ou vide, le contrôleur d’entrée observe tous les espaces de noms accessibles.
Entrez les valeurs du
armAuth
bloc.Si vous spécifiez
armAuth.type
commeaadPodIdentity
:armAuth.identityResourceID
: obtenez l’ID de ressource d’identité en exécutantecho "$(terraform output identity_resource_id)"
.armAuth.identityClientId
: obtenez l’ID client d’identité en exécutantecho "$(terraform output identity_client_id)"
.
Si vous spécifiez
armAuth.type
commeservicePrincipal
, consultez Utilisation d’un principal de service.
Installez le package de contrôleur d’entrée Application Gateway :
helm install -f helm-config.yaml application-gateway-kubernetes-ingress/ingress-azure --generate-name
Pour obtenir les valeurs de clé de votre identité, vous pouvez exécuter az identity show .
az identity show -g <resource_group_name> -n <identity_name>
Points essentiels :
- Remplacez l’espace
<resource_group_name>
réservé par le nom du groupe de ressources généré de manière aléatoire. Obtenez le nom du groupe de ressources en exécutantecho "$(terraform output resource_group_name)"
. - Remplacez l’espace
<identity_name>
réservé par le nom d’identité de cette démonstration. Le nom d’identitéidentity1
est défini par défaut dans lemain.tf
fichier. - Toutes les identités d’un abonnement donné peuvent être en exécutant
az identity list
.
- Remplacez l’espace
11. Installer un exemple d’application
Une fois que vous avez installé App Gateway, AKS et AGIC, vous pouvez installer un exemple d’application.
Utilisez la commande curl pour télécharger le fichier YAML :
curl https://raw.githubusercontent.com/Azure/application-gateway-kubernetes-ingress/master/docs/examples/aspnetapp.yaml -o aspnetapp.yaml
Appliquez le fichier YAML :
kubectl apply -f aspnetapp.yaml
12. Vérifier les résultats : Tester l’exemple d’application
Exécutez la commande Terraform suivante pour obtenir l’adresse IP de l’application.
echo "$(terraform output application_ip_address)"
À l’aide d’un navigateur, accédez à l’adresse IP indiquée à l’étape précédente.
13. Nettoyer les ressources
Supprimer des ressources App Gateway, AKS et AGIC
Quand vous n’avez plus besoin des ressources créées par le biais de Terraform, effectuez les étapes suivantes :
Exécutez le plan Terraform et spécifiez l’indicateur
destroy
.terraform plan -destroy -out main.destroy.tfplan
Points essentiels :
- La commande
terraform plan
crée un plan d’exécution, mais ne l’exécute pas. Au lieu de cela, elle détermine les actions nécessaires pour créer la configuration spécifiée dans vos fichiers de configuration. Ce modèle vous permet de vérifier si le plan d’exécution répond à vos attentes avant d’apporter des modifications aux ressources réelles. - Le paramètre facultatif
-out
vous permet de spécifier un fichier de sortie pour le plan. L’utilisation du paramètre-out
garantit que le plan que vous avez examiné correspond exactement à ce qui est appliqué. - Pour en savoir plus sur la persistance des plans d’exécution et de la sécurité, consultez la section d’avertissement de sécurité.
- La commande
Exécutez terraform apply pour appliquer le plan d’exécution.
terraform apply main.destroy.tfplan
Supprimer un compte de stockage
Attention
Supprimez uniquement le groupe de ressources contenant le compte de stockage que vous avez utilisé dans cette démonstration si vous n’utilisez pas l’un ou l’autre pour autre chose.
Exécutez az group delete pour supprimer le groupe de ressources (et son compte de stockage que vous avez utilisé dans cette démonstration).
az group delete --name <storage_resource_group_name> --yes
Points essentiels :
- Remplacez l’espace
storage_resource_group_name
réservé par laresource_group_name
valeur dans leproviders.tf
fichier.
Suppression de principal de service
Attention
Supprimez uniquement le principal de service que vous avez utilisé dans cette démonstration si vous ne l’utilisez pas pour autre chose.
az ad sp delete --id <service_principal_object_id>
Résoudre les problèmes liés à Terraform sur Azure
Si vous recevez une « erreur 403 » lors de l’application du plan d’exécution Terraform pendant l’attribution de rôle, cela signifie généralement que votre rôle de principal de service n’inclut pas l’autorisation d’attribuer des rôles dans Azure RBAC. Pour plus d’informations sur les rôles intégrés, consultez Rôles intégrés Azure. Les options suivantes vous permettent de résoudre l’erreur :
- Créez le principal de service avec le rôle « Propriétaire ». Comme pratique recommandée, vous devez accorder le privilège minimum nécessaire pour effectuer un travail donné. Par conséquent, utilisez uniquement le rôle « Propriétaire » si le principal de service est destiné à être utilisé dans cette capacité.
- Créez un rôle personnalisé basé sur le rôle souhaité, par exemple Contributeur. Selon le rôle de base que vous utilisez, ajoutez l’action
Microsoft.Authorization/*/Write
auActions
bloc ou supprimez-laNotActions
du bloc. Pour plus d’informations sur les rôles personnalisés, consultez Rôles personnalisés Azure.
Résoudre les problèmes courants liés à l’utilisation de Terraform sur Azure