Partage via


Configurer une image conteneur pour exécuter des déploiements avec Terraform

Dans cet article, vous allez apprendre à créer des images conteneur personnalisées pour déployer vos définitions d’environnement dans Environnements de déploiement Azure (ADE). Vous apprenez à configurer une image personnalisée pour provisionner une infrastructure en utilisant le framework Infrastructure en tant que code (IaC) Terraform.

Une définition d’environnement comprend au moins deux fichiers : un fichier de modèle, comme main.tf, et un fichier manifeste nommé environment.yaml. Vous utilisez un conteneur pour déployer la définition d’environnement qui utilise Terraform.

Le modèle d’extensibilité ADE vous permet de créer des images conteneur personnalisées à utiliser avec vos définitions d’environnement. En utilisant le modèle d’extensibilité, vous pouvez créer vos propres images conteneur personnalisées et les stocker dans un registre de conteneurs comme DockerHub. Vous pouvez ensuite référencer ces images dans vos définitions d’environnement pour déployer vos environnements.

Prérequis

Créer une image conteneur Terraform personnalisée

La création d’une image conteneur personnalisée vous permet de personnaliser vos déploiements en fonction de vos besoins.

Une fois la personnalisation de l’image terminée, vous devez la générer et la transmettre (push) à votre registre de conteneurs.

Créer et personnaliser une image conteneur avec Docker

Dans cet exemple, vous apprenez à créer une image Docker pour utiliser des déploiements ADE et accéder à l’interface CLI ADE, en basant votre image sur une des images créées par ADE.

L’interface CLI ADE est un outil qui vous permet de créer des images personnalisées à partir d’images de base ADE. Vous pouvez utiliser l’interface CLI ADE pour personnaliser vos déploiements et vos suppressions en fonction de votre workflow. L’interface CLI ADE est préinstallée sur les exemples d’image. Pour en savoir plus sur l’interface CLI ADE, consultez les Informations de référence sur les images Runner personnalisées de l’interface CLI.

Pour créer une image configurée pour ADE, suivez ces étapes :

  1. Basez votre image sur un exemple d’image créé par ADE ou sur l’image de votre choix en utilisant l’instruction FROM.
  2. Installez les packages nécessaires pour votre image avec l’instruction RUN.
  3. Créez un dossier scripts au même niveau que votre fichier Dockerfile, stockez-y vos fichiers deploy.sh et delete.sh, et vérifiez que ces scripts sont découvrables et exécutables dans le conteneur que vous avez créé. Cette étape est nécessaire pour que votre déploiement fonctionne avec l’image de base ADE.

Sélectionner un exemple d’image conteneur avec l’instruction FROM

Ajoutez une instruction FROM dans un fichier DockerFile créé pour votre nouvelle image qui pointe vers un exemple d’image hébergé dans le Registre des artefacts Microsoft.

Voici un exemple d’instruction FROM, référençant l’exemple d’image de base :

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

Cette instruction extrait la dernière image de base publiée et en fait la base de votre image personnalisée.

Installer Terraform dans un fichier Dockerfile

Vous pouvez installer l’interface CLI Terraform dans un emplacement exécutable pour pouvoir l’utiliser dans vos scripts de déploiement et de suppression.

Voici un exemple de ce processus, qui installe la version 1.7.5 de l’interface CLI Terraform :

RUN wget -O terraform.zip https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip
RUN unzip terraform.zip && rm terraform.zip
RUN mv terraform /usr/bin/terraform

Conseil

Vous pouvez obtenir l’URL de téléchargement de votre version préférée de l’interface CLI Terraform à partir des publications Hashicorp.

Les exemples d’image ADE sont basés sur l’image Azure CLI, et ont les package de l’interface CLI ADE et JQ installés. Vous pouvez en savoir plus sur Azure CLI et le package JQ.

Pour installer les autres packages dont vous avez besoin dans votre image, utilisez l’instruction RUN.

Exécuter des scripts d’interpréteur de commandes d’opération

Dans les exemples d’image, les opérations sont déterminées et exécutées en fonction du nom de l’opération. Actuellement, les deux noms d’opération pris en charge sont deploy et delete.

Pour configurer votre image personnalisée afin qu’elle utilise cette structure, spécifiez un dossier au niveau de votre fichier Dockerfile nommé scripts, puis spécifiez deux fichiers, deploy.shet delete.sh. Le script d’interpréteur de commandes deploy s’exécute quand votre environnement est créé ou redéployé, et le script d’interpréteur de commandes delete s’exécute quand votre environnement est supprimé. Vous pouvez voir des exemples de scripts d’interpréteur de commandes dans le dépôt sous le dossier Runner-Images pour l’image ARM-BICEP.

Pour vérifier que ces scripts d’interpréteur de commandes sont exécutables, ajoutez les lignes suivantes à votre fichier Dockerfile :

COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;

Créer des scripts d’interpréteur de commandes d’opération pour utiliser l’interface CLI Terraform

Il y a trois étapes pour déployer l’infrastructure via Terraform :

  1. terraform init : initialise l’interface CLI Terraform pour effectuer des actions dans le répertoire de travail
  2. terraform plan : développe un plan basé sur les fichiers et variables entrants de l’infrastructure Terraform, ainsi que tous les fichiers d’état existants, et développe les étapes nécessaires pour créer ou mettre à jour l’infrastructure spécifiée dans les fichiers .tf
  3. terraform apply : applique le plan pour créer une infrastructure ou mettre à jour l’existante dans Azure

Pendant le point d’entrée de l’image de base, tous les fichiers d’état existants sont extraits dans le conteneur et le répertoire enregistré sous la variable d’environnement $ADE_STORAGE. Par ailleurs, tous les paramètres définis pour l’environnement actuel sont stockés sous la variable $ADE_OPERATION_PARAMETERS. Pour accéder au fichier d’état existant et définir vos variables dans un fichier .tfvars.json, exécutez les commandes suivantes :

EnvironmentState="$ADE_STORAGE/environment.tfstate"
EnvironmentPlan="/environment.tfplan"
EnvironmentVars="/environment.tfvars.json"

echo "$ADE_OPERATION_PARAMETERS" > $EnvironmentVars

Par ailleurs, pour utiliser les privilèges ADE et déployer l’infrastructure dans votre abonnement, votre script doit utiliser l’identité MSI (Managed Service Identity) pendant l’approvisionnement de l’infrastructure avec le fournisseur Terraform AzureRM. Si votre déploiement a besoin d’autorisations spéciales pour effectuer votre déploiement, comme des rôles particuliers, attribuez ces autorisations à l’identité du type d’environnement de projet utilisée pour le déploiement de votre environnement. Étant donné qu’ADE définit les variables d’environnement appropriées, comme le client, le locataire et les ID d’abonnement au sein du point d’entrée de l’image de base, exécutez les commandes suivantes pour que le fournisseur utilise l’identité MSI ADE :

export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID

Si vous avez d’autres variables à référencer dans votre modèle qui ne sont pas spécifiées dans les paramètres de votre environnement, définissez des variables d’environnement avec le préfixe TF_VAR. Une liste des variables d’environnement ADE fournies est mise à disposition pour la référence des variables CLI d’environnement de déploiement Azure. Voici un exemple de ces commandes :

export TF_VAR_resource_group_name=$ADE_RESOURCE_GROUP_NAME
export TF_VAR_ade_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_ade_subscription=$ADE_SUBSCRIPTION_ID
export TF_VAR_ade_location=$ADE_ENVIRONMENT_LOCATION
export TF_VAR_ade_environment_type=$ADE_ENVIRONMENT_TYPE

À présent, vous pouvez exécuter les étapes listées précédemment pour initialiser l’interface CLI Terraform, générer un plan pour l’infrastructure de provisionnement et appliquer un plan pendant votre script de déploiement :

terraform init
terraform plan -no-color -compact-warnings -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan

Pendant votre script de suppression, vous pouvez ajouter l’indicateur destroy à votre génération de plan afin de supprimer les ressources existantes, comme illustré dans l’exemple suivant :

terraform init
terraform plan -no-color -compact-warnings -destroy -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan

Enfin, pour que les sorties de votre déploiement soient chargées et accessibles quand vous accédez à votre environnement avec Azure CLI, convertissez l’objet de sortie de Terraform au format spécifié par ADE avec le package JQ. Définissez la valeur de la variable d'environnement $ADE_OUTPUTS, comme indiqué dans l’exemple suivant :

tfOutputs=$(terraform output -state=$EnvironmentState -json)
# Convert Terraform output format to ADE format.
tfOutputs=$(jq 'walk(if type == "object" then 
            if .type == "bool" then .type = "boolean" 
            elif .type == "list" then .type = "array" 
            elif .type == "map" then .type = "object" 
            elif .type == "set" then .type = "array" 
            elif (.type | type) == "array" then 
                if .type[0] == "tuple" then .type = "array" 
                elif .type[0] == "object" then .type = "object" 
                elif .type[0] == "set" then .type = "array" 
                else . 
                end 
            else . 
            end 
        else . 
        end)' <<< "$tfOutputs")

echo "{\"outputs\": $tfOutputs}" > $ADE_OUTPUTS

Rendre l’image personnalisée accessible à ADE

Vous devez générer votre image Docker et la transmettre (push) à votre registre de conteneurs pour la rendre disponible dans ADE. Vous pouvez générer votre image à l’aide de l’interface CLI Docker ou à l’aide d’un script fourni par ADE.

Sélectionnez l’onglet approprié pour en savoir plus sur chaque approche.

Avant de générer l’image à pousser dans votre registre, vérifiez que le moteur Docker est installé sur votre ordinateur. Ensuite, accédez au répertoire de votre fichier Dockerfile, puis exécutez la commande suivante :

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

Par exemple, si vous voulez enregistrer votre image sous un dépôt au sein de votre registre nommé customImage et le charger avec la version d’étiquette 1.0.0, vous exécutez :

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

Pousser l’image Docker dans un registre

Pour utiliser des images personnalisées, vous devez configurer un registre d’images accessible publiquement avec l’extraction d’image anonyme activée. De cette façon, le service Environnements de déploiement Azure peut accéder à votre image personnalisée pour l’exécuter dans notre conteneur.

Azure Container Registry est une offre Azure qui stocke des images conteneur et des artefacts similaires.

Pour créer un registre, ce que vous pouvez faire avec Azure CLI, le portail Azure, des commandes PowerShell, etc., suivez un des guides de démarrage rapide.

Pour configurer votre registre en activant l’extraction d’image anonyme, exécutez les commandes suivantes dans Azure CLI :

az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true

Quand vous êtes prêt à pousser votre image dans votre registre, exécutez la commande suivante :

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

Connecter l’image à votre définition d’environnement

Quand vous créez les définitions d’environnement pour utiliser votre image personnalisée dans leur déploiement, modifiez la propriété runner dans le fichier manifeste (environment.yaml ou manifest.yaml).

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

Accéder aux journaux d’opérations et aux détails d’erreur

ADE stocke les détails d’erreur d’un déploiement ayant échoué dans le fichier $ADE_ERROR_LOG dans le conteneur.

Pour résoudre les problèmes d’échec de déploiement :

  1. Connectez-vous au portail des développeurs.

  2. Identifiez l’environnement qui n’a pas pu être déployé, puis sélectionnez Voir les détails.

    Capture d’écran montrant les détails d’erreur du déploiement ayant échoué, en particulier un nom non valide pour un compte de stockage.

  3. Passez en revue les détails d’erreur dans la section Détails d’erreur.

    Capture d’écran montrant l’échec du déploiement d’un environnement avec le bouton Voir les détails affiché.

Par ailleurs, vous pouvez utiliser Azure CLI pour voir les détails d’erreur d’un environnement avec la commande suivante :

az devcenter dev environment show --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}

Pour voir les journaux d’opérations d’un déploiement ou d’une suppression d’environnement, utilisez Azure CLI pour récupérer la dernière opération de votre environnement, puis consultez cet ID d’opération dans les journaux.

# Get list of operations on the environment, choose the latest operation
az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}
# Using the latest operation ID, view the operation logs
az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}