- Azure
- Azure Container Apps
- Terraform
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.
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"
}
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)
}
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
}
}
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
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
.
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 :
É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
.
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.
Dans le prochain tutoriel de cette série, nous nous concentrerons sur l’ajout de Grafana pour monitorer votre environnement.