Azure Container Apps permet à votre application de stocker de façon sécurisée des valeurs de configuration sensibles. Une fois les secrets définis au niveau de l'application, les valeurs sécurisées sont disponibles pour les révisions dans vos applications conteneurs. En outre, vous pouvez faire référence à des valeurs garanties dans les règles de mise à l'échelle. Pour plus d’informations sur l’utilisation des secrets avec Dapr, reportez-vous à Intégration de Dapr.
- Les secrets sont délimités à une application, en dehors de toute révision spécifique d’une application.
- De nouvelles révisions ne sont pas générées par l’ajout, la suppression ou la modification de secrets.
- Chaque révision d’application peut référencer un ou plusieurs secrets.
- Plusieurs révisions peuvent référencer le ou les mêmes secrets.
Un secret mis à jour ou supprimé n’affecte pas automatiquement les révisions existantes dans votre application. Lors de la mise à jour ou de la suppression d’un secret, vous pouvez répondre à ces changements de l’une des deux manières suivantes :
- Déployer une nouvelle révision.
- Redémarrer une révision existante.
Avant de supprimer un secret, déployez une nouvelle révision qui ne fait plus référence à l’ancien secret. Désactivez ensuite toutes les révisions qui font référence au secret.
Définition de secrets
Les secrets sont définis comme un ensemble de paires nom/valeur. La valeur de chaque secret est spécifiée directement ou comme référence à un secret stocké dans Azure Key Vault.
Stocker une valeur de secret dans Container Apps
Lorsque vous définissez des secrets par l'intermédiaire du portail, ou via différentes options de ligne de commande.
Accédez à la page de votre application conteneur dans le portail Azure.
Sous la section Paramètres, sélectionnez Secrets.
Sélectionnez Ajouter.
Dans le volet contextuel Ajouter un secret, entrez les informations suivantes :
-
Nom : Nom du secret.
-
Type : sélectionnez Container Apps Secret.
-
Valeur : Valeur du secret.
Sélectionnez Ajouter.
Les secrets sont définis au niveau de l’application dans la section resources.properties.configuration.secrets
.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"value": "<MY-CONNECTION-STRING-VALUE>"
}],
}
}
}
Ici, une chaîne de connexion à un compte de stockage de file d’attente est déclarée dans le tableau secrets
. Dans cet exemple, remplacez <MY-CONNECTION-STRING-VALUE>
par la valeur de votre chaîne de connexion.
Lorsque vous créez une application conteneur, les secrets sont définis à l’aide du paramètre --secrets
.
- Le paramètre accepte un jeu de paires nom/valeur délimité par des espaces.
- Un signe égal (
=
) délimite chaque paire.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--secrets "queue-connection-string=<CONNECTION_STRING>"
Ici, une chaîne de connexion à un compte de stockage de file d’attente est déclarée dans le paramètre --secrets
. Remplacez <CONNECTION_STRING>
par la valeur de votre chaîne de connexion.
Quand vous créez une application conteneur, les secrets sont définis comme un ou plusieurs objets Secret passés dans le paramètre ConfigurationSecrets
.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$TemplateObj = New-AzContainerAppTemplateObject -Name queuereader -Image demos/queuereader:v1
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$ContainerAppArgs = @{
Name = 'my-resource-group'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
Ici, une chaîne de connexion à un compte de stockage de file d’attente est déclarée. La valeur de queue-connection-string
provient d’une variable d’environnement nommée $QueueConnectionString
.
Référencer des secrets à partir de Key Vault
Lorsque vous définissez un secret, vous créez une référence à un secret stocké dans Azure Key Vault. Container Apps récupère automatiquement la valeur secrète de Key Vault et la rend disponible comme secret dans votre application conteneur.
Pour référencer un secret à partir de Key Vault, vous devez au préalable activer l'identité managée dans votre application conteneur et octroyer à l'identité l'accès aux secrets de Key Vault.
Pour activer l’identité managée dans votre application conteneur, consultez Identités managées.
Pour accorder l’accès aux secrets Key Vault, créez une stratégie d’accès dans Key Vault pour l’identité managée que vous avez créée. Activez l’autorisation de secret « Get » sur cette stratégie.
Accédez à la page de votre application conteneur dans le portail Azure.
Sous la section Paramètres, sélectionnez Identité.
Dans l’onglet Affectée par le système, définissez État sur Activé.
Remarque
Vous pouvez également utiliser une identité managée attribuée par l'utilisateur, qui peut être réutilisée sur plusieurs ressources et persiste indépendamment du cycle de vie de l’application. Pour l’utiliser, sélectionnez l’onglet Affecté par l’utilisateur et choisissez une identité existante.
Sélectionnez Enregistrer pour activer l’identité managée affectée par le système.
Une fenêtre contextuelle s’affiche pour confirmer que vous souhaitez activer l’identité managée affectée par le système et inscrire votre application conteneur avec Microsoft Entra ID. Sélectionnez Oui.
Sous la section Paramètres, sélectionnez Secrets.
Sélectionnez Ajouter.
Dans le volet contextuel Ajouter un secret, entrez les informations suivantes :
-
Nom : Nom du secret.
-
Type : Sélectionnez Référence Key Vault.
-
URL du secret Key Vault : URI de votre secret dans Key Vault. Cette URI a le format suivant :
https://<YOUR_KEY_VAULT_NAME>.vault.azure.net/secrets/<YOUR_SECRET_NAME>/<32_DIGIT_HEX_ID>
-
Identité : sélectionnez Système affecté.
Sélectionnez Ajouter.
Les secrets sont définis au niveau de l’application dans la section resources.properties.configuration.secrets
.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "<KEY_VAULT_SECRET_URI>",
"identity": "system"
}],
}
}
}
Ici, une chaîne de connexion à un compte de stockage de file d’attente est déclarée dans le tableau secrets
. Sa valeur est automatiquement récupérée dans Key Vault à l’aide de l’identité spécifiée. Pour utiliser une identité managée utilisateur, remplacez system
par l’ID de ressource de l’identité.
Remplacez <KEY_VAULT_SECRET_URI>
par l’URI de votre secret dans Key Vault.
Lorsque vous créez une application conteneur, les secrets sont définis à l’aide du paramètre --secrets
.
- Le paramètre accepte un jeu de paires nom/valeur délimité par des espaces.
- Un signe égal (
=
) délimite chaque paire.
- Pour spécifier une référence Key Vault, utilisez le format
<SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>
. Par exemple : queue-connection-string=keyvaultref:https://mykeyvault.vault.azure.net/secrets/queuereader,identityref:/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity
.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>"
Ici, une chaîne de connexion à un compte de stockage de file d’attente est déclarée dans le paramètre --secrets
. Remplacez <KEY_VAULT_SECRET_URI>
par l’URI de votre secret dans Key Vault. Remplacez <USER_ASSIGNED_IDENTITY_ID>
par l’ID de ressource de l’identité affectée par l’utilisateur.
Remarque
L’identité affectée par l’utilisateur doit avoir l’accès pour lire le secret dans Key Vault. L’identité affectée par le système ne peut pas être utilisée avec la commande create, car elle n’est disponible qu’après la création de l’application conteneur.
Les références Key Vault des secrets ne sont pas prises en charge dans PowerShell.
URI de secret Key Vault et rotation des secrets
L’URI d’un secret Key Vault doit être dans l’un des formats suivants :
-
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
: Référencer une version spécifique d’un secret.
-
https://myvault.vault.azure.net/secrets/mysecret
: Référencer la version la plus récente d’un secret.
Si aucune version n’est spécifiée dans l’URI, l’application utilise la dernière version qui existe dans le coffre de clés. Lorsque des versions plus récentes deviennent disponibles, l’application récupère automatiquement la dernière version dans les 30 minutes. Toutes les révisions actives qui référencent le secret dans une variable d’environnement sont automatiquement redémarrées pour récupérer la nouvelle valeur.
Pour contrôler totalement la version à utiliser d’un secret, spécifiez la version dans l’URI.
Référencement des secrets dans des variables d’environnement
Après avoir déclaré des secrets au niveau de l’application, comme décrit dans la section définition des secrets, vous pouvez les référencer dans des variables d’environnement lorsque vous créez une révision dans votre application conteneur. Lorsqu’une variable d’environnement fait référence à un secret, sa valeur est remplie avec la valeur définie dans le secret.
Exemple
L’exemple suivant montre une application qui déclare une chaîne de connexion au niveau de l’application. Cette connexion est référencée dans une variable d’environnement de conteneur et dans une règle d’échelle.
Une fois que vous avez défini un secret dans votre application conteneur, vous pouvez le référencer dans une variable d’environnement lorsque vous créez une révision.
Accédez à la page de votre application conteneur dans le portail Azure.
Dans la section Application, sélectionnez Révisions et réplicas.
Dans la page Révisions et réplicas , sélectionnez Créer une nouvelle révision.
Dans la page Créer et déployer une nouvelle révision, sous l’onglet Conteneur, sous la section Image conteneur, sélectionnez un conteneur.
Sélectionnez Modifier.
Dans le volet de contexte Modifier un conteneur, sélectionnez l’onglet Variables d’environnement.
Sélectionnez Ajouter.
Saisissez les informations suivantes :
-
Nom : Nom de la variable d’environnement.
-
Source : Sélectionnez Référencer un secret.
-
Valeur : sélectionnez le secret que vous avez défini précédemment.
Cliquez sur Enregistrer.
Dans la page Créer et déployer une nouvelle révision, sélectionnez Créer pour créer la nouvelle révision.
Dans cet exemple, la chaîne de connexion d’application est déclarée comme queue-connection-string
et devient disponible ailleurs dans les sections de configuration.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": { ⬅️
"type": "String" ⬅️
} ⬅️
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-03-01",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [ ⬅️
{ ⬅️
"name": "queue-connection-string", ⬅️
"keyVaultUrl": "[parameters('key_vault_secret_uri')", ⬅️
"identity": "system" ⬅️
}] ⬅️
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"env": [
{
"name": "QueueName",
"value": "myqueue"
},
{
"name": "ConnectionString", ⬅️
"secretRef": "queue-connection-string" ⬅️
}
]
}
],
"scale": {
"minReplicas": 0,
"maxReplicas": 10,
"rules": [
{
"name": "myqueuerule",
"azureQueue": {
"queueName": "demoqueue",
"queueLength": 100,
"auth": [
{
"secretRef": "queue-connection-string", ⬅️
"triggerParameter": "connection" ⬅️
}
]
}
}
]
}
}
}
}]
}
Ici, la variable d’environnement nommée connection-string
obtient sa valeur du secret queue-connection-string
au niveau de l’application. En outre, la configuration d’authentification de la règle de mise à l’échelle de Stockage File d’attente Azure utilise le secret queue-connection-string
pour définir sa connexion.
Pour éviter de valider des valeurs de secret dans le contrôle de code source avec votre modèle ARM, transmettez les valeurs de secret en tant que paramètres de modèle ARM.
Dans cet exemple, vous créez une application de conteneur en utilisant Azure CLI avec un secret référencé dans une variable d’environnement. Pour référencer un secret dans une variable d’environnement dans Azure CLI, définissez sa valeur sur secretref:
, suivi du nom du secret.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" \
--env-vars "QueueName=myqueue" "ConnectionString=secretref:queue-connection-string"
Ici, la variable d’environnement nommée connection-string
obtient sa valeur du secret queue-connection-string
au niveau de l’application.
Les références Key Vault des secrets ne sont pas prises en charge dans PowerShell.
Dans cet exemple, vous créez un conteneur en utilisant Azure PowerShell avec un secret référencé dans une variable d’environnement. Pour référencer le secret dans une variable d’environnement avec PowerShell, définissez sa valeur sur secretref:
, suivi du nom du secret.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$EnvVarObjQueue = New-AzContainerAppEnvironmentVarObject -Name QueueName -Value myqueue
$EnvVarObjConn = New-AzContainerAppEnvironmentVarObject -Name ConnectionString -SecretRef queue-connection-string -Value secretref
$TemplateObj = New-AzContainerAppTemplateObject -Name myQueueApp -Image demos/myQueueApp:v1 -Env $EnvVarObjQueue, $EnvVarObjConn
$ContainerAppArgs = @{
Name = 'myQueueApp'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
Ici, la variable d’environnement nommée ConnectionString
obtient sa valeur du secret $QueueConnectionString
au niveau de l’application.
Montage de secrets dans un volume
Après avoir déclaré des secrets au niveau de l’application, comme décrit dans la section définition des secrets, vous pouvez les référencer dans des montages de volume lorsque vous créez une révision dans votre application conteneur. Lorsque vous montez des secrets dans un volume, chaque secret est monté en tant que fichier dans le volume. Le nom de fichier est le nom du secret, et le contenu du fichier est la valeur du secret. Vous pouvez charger tous les secrets dans un montage de volume, ou vous pouvez charger des secrets spécifiques.
Exemple
Une fois que vous avez défini un secret dans votre application conteneur, vous pouvez le référencer dans un montage de volume lorsque vous créez une révision.
Accédez à la page de votre application conteneur dans le portail Azure.
Dans la section Application, sélectionnez Révisions et réplicas.
Dans la page Révisions et réplicas , sélectionnez Créer une nouvelle révision.
Dans la page Créer et déployer une nouvelle révision, sous l’onglet Conteneur, sous la section Image conteneur, sélectionnez un conteneur.
Sélectionnez Modifier.
Dans le volet contextuel Modifier un conteneur, sélectionnez l’onglet Montages de volume.
Sélectionnez Créer un volume.
Dans le volet contextuel Ajouter un volume, entrez les informations suivantes :
-
Type de volume : Sélectionnez
Secret
.
-
Nom :
mysecrets
-
Monter tous les secrets : activé
Remarque
Si vous souhaitez charger des secrets spécifiques, désactivez Monter tous les secrets et sélectionnez les secrets que vous souhaitez charger.
Sélectionnez Ajouter.
Dans le volet de contexte Modifier un conteneur, sous Nom du volume, sélectionnez mysecrets.
Sous Chemin de montage, entrez /mnt/secrets
.
Cliquez sur Enregistrer.
Dans la page Créer et déployer une nouvelle révision, sélectionnez Créer pour créer la nouvelle révision avec le montage du volume.
Dans cet exemple, deux secrets sont déclarés au niveau de l’application. Ces secrets sont montés dans un volume nommé mysecrets
de type Secret
. Le volume est monté au niveau du chemin /mnt/secrets
. L’application peut ensuite référencer les secrets dans le montage de volume.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": {
"type": "Securestring"
},
"api-key": {
"type": "Securestring"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-11-01-preview",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret"
}
]
}
}
}]
}
Pour charger des secrets spécifiques et spécifier leur chemin dans le volume monté, vous définissez les secrets dans le tableau secrets
de l’objet volume. L’exemple suivant montre comment charger uniquement le secret queue-connection-string
dans le montage du volume mysecrets
avec le nom de fichier connection-string.txt
.
{
"properties": {
...
"configuration": {
...
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret",
"secrets": [
{
"secretRef": "queue-connection-string",
"path": "connection-string.txt"
}
]
}
]
}
...
}
...
}
Dans votre application, vous pouvez lire le secret à partir d’un fichier qui se trouve dans /mnt/secrets/connection-string.txt
.
Dans cet exemple, deux secrets sont déclarés au niveau de l’application. Ces secrets sont montés dans un volume nommé mysecrets
de type Secret
. Le volume est monté au niveau du chemin /mnt/secrets
. L’application peut ensuite lire les secrets en tant que fichiers dans le montage de volume.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" "api-key=$API_KEY" \
--secret-volume-mount "/mnt/secrets"
Pour charger des secrets spécifiques et indiquer leur chemin dans le volume monté, définissez votre application à l’aide de YAML.
Le montage de secrets en tant que volume n’est pas pris en charge dans PowerShell.
Étapes suivantes