Photo par Cristina Gottardi

Définir les secrets et les variables d'environnement dans Azure Container Apps avec Terraform

Sécurisez vos identifiants

Créé par Damien Aicheh le 09/05/2023 · 9 mins

Dans ce tutoriel, vous finaliserez la définition terraform que vous avez effectuée dans le tutoriel précédent* * pour vos conteneurs frontend et backend utilisant Terraform. Le code source est disponible dans ce répetoire **Github.

Ce tutoriel fait partie d’une série complète de tutoriels sur l’utilisation d’Azure Container Apps avec Terraform.

Utiliser des secrets

Dans les deux conteneurs apps, vous devez spécifier un mot de passe pour accéder au Azure Container Registry afin de récupérer les images Docker. Pour ce faire, vous devez définir l’attribut password_secret_name du bloc registry dans la ressource azurerm_container_app.

Ainsi, dans vos fichiers container-api.tf et container-web.tf, vous devez déclarer un secret pour stocker le mot de passe administrateur d’Azure Container Registry juste avant le bloc registry :

secret {
  name  = "container-registry-password"
  value = azurerm_container_registry.this.admin_password
}

Comme vous pouvez le voir, le secret est défini avec le nom container-registry-password. Vous pouvez maintenant utiliser ce nom comme référence pour le consommer dans le bloc registry.

registry {
  server               = azurerm_container_registry.this.login_server
  username             = azurerm_container_registry.this.admin_username
  password_secret_name = "container-registry-password"
}

Définir les variables d’environnement

Dans le conteneur backend, vous devez définir la variable d’environnement MONGODB_URI pour vous connecter à la base de données Azure Cosmos Db. Pour ce faire, vous devez définir un attribut env dans l’attribut container de votre ressource azurerm_container_app.

N’oubliez pas que vous ne voulez pas exposer la connection string en clair, vous utiliserez un secret pour la stocker et la référencer dans la variable d’environnement.

Ainsi, dans votre fichier container-api.tf, vous ajouterez un secret :

secret {
  name  = "mongodb-connection-string"
  value = azurerm_cosmosdb_account.this.connection_strings[0]
}

et l’attribut env au bloc container de votre conteneur :

env {
  name        = "MONGODB_URI"
  secret_name = "mongodb-connection-string"
}

Dans le conteneur frontend, vous devez définir la variable d’environnement API pour vous connecter au conteneur backend, il vous suffit donc de référencer le FQDN du conteneur backend. Dans le fichier container-web.tf, vous aurez ce code dans votre bloc container :

env {
  name  = "API"
  value = format("https://%s", azurerm_container_app.api.latest_revision_fqdn)
}

Résumer

Ainsi, votre fichier container-api.tf devrait ressembler à ceci :

resource "azurerm_container_app" "api" {
  name                         = format("ca-api-%s", local.resource_suffix_kebabcase)
  container_app_environment_id = azurerm_container_app_environment.this.id
  resource_group_name          = azurerm_resource_group.this.name
  revision_mode                = "Single"

  lifecycle {
    ignore_changes = [
      template.0.container[0].image
    ]
  }

  secret {
    name  = "container-registry-password"
    value = azurerm_container_registry.this.admin_password
  }

  secret {
    name  = "mongodb-connection-string"
    value = azurerm_cosmosdb_account.this.connection_strings[0]
  }

  registry {
    server               = azurerm_container_registry.this.login_server
    username             = azurerm_container_registry.this.admin_username
    password_secret_name = "container-registry-password"
  }

  ingress {
    external_enabled = true
    target_port      = 3000
    traffic_weight {
      percentage      = 100
      latest_revision = true
    }
  }

  template {
    container {
      name   = format("ca-api")
      image  = "crdevwefrt01.azurecr.io/fruits-backend:1.0.0"
      cpu    = 0.25
      memory = "0.5Gi"
      
      env {
        name        = "MONGODB_URI"
        secret_name = "mongodb-connection-string"
      }
    }

    min_replicas = 0
  }
}

Et votre fichier container-web.tf devrait ressembler à ceci :

resource "azurerm_container_app" "web" {
  name                         = format("ca-web-%s", local.resource_suffix_kebabcase)
  container_app_environment_id = azurerm_container_app_environment.this.id
  resource_group_name          = azurerm_resource_group.this.name
  revision_mode                = "Single"

  secret {
    name  = "container-registry-password"
    value = azurerm_container_registry.this.admin_password
  }

  registry {
    server               = azurerm_container_registry.this.login_server
    username             = azurerm_container_registry.this.admin_username
    password_secret_name = "container-registry-password"
  }

  lifecycle {
    ignore_changes = [
      template.0.container[0].image
    ]
  }

  ingress {
    external_enabled = true
    target_port      = 8080
    traffic_weight {
      percentage      = 100
      latest_revision = true
    }
  }

  template {
    container {
      name   = format("ca-web")
      image  = "crdevwefrt01.azurecr.io/fruits-frontend:1.0.0"
      cpu    = 0.25
      memory = "0.5Gi"
      
      env {
        name  = "API"
        value = format("https://%s", azurerm_container_app.api.latest_revision_fqdn)
      }
    }

    min_replicas = 0
  }
}

Lancer Terraform

Il est maintenant temps de déployer les Container Apps et la base Cosmos Db que vous avez définies dans le tutoriel précédent. Exécutez simplement la commande Terraform plan et appliquez-la :

terraform plan --out=plan.out

Enfin:

terraform apply plan.out

Testez l’application

Pour tester l’application, rendez-vous sur le portail Azure, dans votre groupe de ressources, recherchez le conteneur frontend et dans l’onglet Overview cliquez sur le lien Application url.

Web Container Url

Cela prendra quelques secondes pour apparaître car, rappelez-vous que vous avez défini le nombre de réplicas pour les container apps à 0.

Si tout est ok, vous verrez l’application :

Web Container Url

Évaluez les fruits, puis accédez à votre base de données Cosmos Db, et dans l’onglet Data Explorer, vous verrez la base de donnée ratingdb. Ouvrez là et vous verrez une collection de ratings.

Touche finale

Félicitations ! Vos conteneur Apps et votre Azure Cosmos Db sont en cours d’exécution. L’application est maintenant opérationnelle. Vous trouverez le code source complet dans ce répertoire Github.

Et après?

Dans le prochain tutoriel de cette série, nous nous concentrerons sur l’ajout de Grafana pour monitorer votre environnement.

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !