Support — Costory

Configuration post-déploiement (obligatoire)

Le déploiement Marketplace crée la Function App, Cosmos DB, Azure AI Foundry, etc. dans un Resource Group managé. Il ne peut pas attribuer de rôles RBAC au niveau souscription (limitation des Azure Managed Applications : l'Appliance Resource Provider qui exécute le déploiement n'a aucun droit hors du RG managé).

Vous devez donc, après le déploiement, accorder à la Managed Identity de la Function App les rôles nécessaires sur chaque souscription à scanner. Sans cette étape, aucun rapport ne sera généré (l'API Cost Management renverra 403 sur chaque appel).

Express install — 1 commande dans Cloud Shell (recommandé)

Pré-requis : un compte ayant Owner (ou User Access Administrator) sur la souscription de déploiement.

  1. Ouvrir Azure Cloud Shell en mode PowerShell (sélecteur en haut à gauche).
  2. S'assurer d'être positionné sur la souscription où Costory est déployé : Get-AzContext (ou Set-AzContext -SubscriptionId <id> pour changer).
  3. Coller et exécuter :
iex (irm https://marketplace.3sr.fr/costory/scripts/Install-Costory.ps1)

Pour le plan Premium (active aussi Defender for Cloud Standard tier — facturation Microsoft additionnelle) :

iwr https://marketplace.3sr.fr/costory/scripts/Install-Costory.ps1 -OutFile installer.ps1
./installer.ps1 -EnableDefender

Le script Install-Costory.ps1 auto-détecte votre déploiement Costory dans la souscription courante, récupère l'Object ID de la Managed Identity et la liste des souscriptions à scanner depuis les paramètres de la Managed App, puis applique les rôles. Si vous avez plusieurs déploiements Costory dans la même souscription, passez -ManagedAppName <nom>. Pour voir le détail des actions sans rien appliquer, ajoutez -DryRun.

Le script est idempotent : ré-exécutable sans risque (les role assignments déjà présents sont sautés).

Procédure manuelle (si Cloud Shell n'est pas disponible)

Le wrapper ci-dessus appelle le script bas-niveau Set-CostorySubscriptionRoles.ps1 avec les bons paramètres. Vous pouvez l'invoquer directement depuis votre poste si vous préférez :

  1. Récupérer l'Object ID de la Managed Identity : Azure portal → Function App déployée par Costory → Identity → copier le Object (principal) ID. Ou bien depuis la page Managed Application → Parameters and Outputs → output functionAppPrincipalId.
  2. Télécharger le script : Set-CostorySubscriptionRoles.ps1.
  3. Pré-requis modules : Az.Accounts, Az.Resources, Az.Security ; rôle Owner sur les souscriptions cibles (et Security Admin en plus si -EnableDefender).
  4. Lancer :
# Plan Free ou Standard — une seule souscription
.\Set-CostorySubscriptionRoles.ps1 `
  -FunctionAppMsiPrincipalId '<Object ID MI>' `
  -SubscriptionIds '<sub-id-déploiement>'

# Plan Standard — souscription de déploiement + 2 souscriptions additionnelles à scanner
.\Set-CostorySubscriptionRoles.ps1 `
  -FunctionAppMsiPrincipalId '<Object ID MI>' `
  -SubscriptionIds '<sub-id-déploiement>','<sub-id-2>','<sub-id-3>'

# Plan Premium — active aussi Defender for Cloud Standard tier
.\Set-CostorySubscriptionRoles.ps1 `
  -FunctionAppMsiPrincipalId '<Object ID MI>' `
  -SubscriptionIds '<sub-id-déploiement>' `
  -EnableDefender

Vérification

  1. Azure portal → Subscription → Access control (IAM) → onglet Role assignments → filtrer sur l'Object ID de la MI → vous voyez Cost Management Reader et Reader.
  2. Attendre le prochain run quotidien de CollectDailyCosts (ou le déclencher manuellement depuis le portail Function App). Application Insights → custom events → l'événement CostoryCollectSucceeded doit apparaître.

Contact

Service Level Agreement (SLA)

PlanDélai de réponseLanguesHeures
FreeBest effort, sans SLAENHeures ouvrables FR
Standard< 24h ouvrablesFR / EN9h-18h CET, lun-ven
Premium< 4h ouvrablesFR / EN9h-19h CET, lun-sam

Périmètre du support

Hors périmètre

FAQ

Comment scanner d'autres souscriptions que celle de déploiement ?

Le même script Set-CostorySubscriptionRoles.ps1 utilisé pour la configuration post-déploiement initiale : ré-exécutez-le avec la liste élargie de -SubscriptionIds. Le script est idempotent (les souscriptions déjà configurées sont sautées). Voir la section Configuration post-déploiement ci-dessus.

Côté Marketplace, n'oubliez pas d'ajouter aussi les nouveaux Subscription IDs dans le paramètre Souscriptions à scanner de l'application (Azure portal → Managed Application → Parameters and outputs) pour que la Function App les requête effectivement.

Comment redéployer après suppression accidentelle ?

Le Resource Group managé est protégé par Azure Managed Applications et ne peut pas être modifié directement. Pour redéployer Costory : depuis le portail Azure, ouvrez la Managed Application, cliquez « Delete » (= cela supprime également les ressources du Resource Group managé), puis réinstallez Costory depuis le Microsoft Marketplace avec le nom souhaité. Voir aussi la section Réinstallation avec le même nom ci-dessous.

Que se passe-t-il si Microsoft Cost Management API renvoie une erreur ?

Le run quotidien CollectDailyCosts retry 3 fois avec backoff exponentiel. En cas d'échec persistant > 24h, un custom event CostoryCollectFailed est émis dans Application Insights et un email d'alerte est envoyé via Action Group.

Mon offre Marketplace montre que la subscription expire — que faire ?

Renouvelez via le portail Marketplace (Microsoft gère). Le Software continuera de fonctionner pendant la grace period (30 jours typiquement). Au-delà, les ressources Azure du RG managé restent mais le Software cessera de produire des rapports.

Comment télécharger un rapport antérieur ?

Les rapports PDF sont envoyés en pièce jointe de chaque email mensuel — vous pouvez les archiver depuis votre boîte mail. Le SAS URL inclus dans l'email reste valide 30 jours pour téléchargement direct. Si vous avez besoin de récupérer un rapport ancien indisponible, contactez support@3sr.fr avec votre identifiant de souscription Marketplace.

Le plan Premium active Defender for Cloud — quels coûts cela représente-t-il ?

Defender for Cloud Standard tier facture séparément par Microsoft : ~15 USD/serveur/mois (VirtualMachines) + variable selon volume StorageAccounts. Cette facturation est indépendante de votre plan Costory. L'activation Defender se fait via Set-CostorySubscriptionRoles.ps1 -EnableDefender lors de la configuration post-déploiement (et non automatiquement par le Marketplace), donc vous gardez le contrôle sur le moment où la facturation Defender démarre. Voir la grille tarifaire Microsoft Defender for Cloud.

J'ai déployé Premium mais Defender n'apparaît pas activé — pourquoi ?

Contrairement aux plans Marketplace classiques, l'activation Defender n'est pas faite par le déploiement Marketplace (limitation Managed Apps — voir Configuration post-déploiement). Vous devez exécuter Set-CostorySubscriptionRoles.ps1 -EnableDefender séparément, avec un compte ayant Security Admin sur la souscription. Si vous n'avez pas ce rôle, demandez à un admin de votre tenant de relancer le script — ou désactivez la fonctionnalité Defender en restant sur le plan Standard.

Le rapport mensuel n'est pas reçu par email — où chercher ?

Vérifier dans cet ordre :

  1. Le mail mensuel arrive le 1er ou 2 de chaque mois pour le mois précédent — vérifiez votre dossier Spam / Quarantaine (expéditeur : Costory Reports <DoNotReply@*.azurecomm.net>)
  2. Vérifiez que la fiche Marketplace de votre Costory est toujours active (= subscription Marketplace non expirée)
  3. Si toujours rien après 24h le 3 du mois : contactez support@3sr.fr en indiquant le nom de votre Resource Group managé.

Où signaler un bug de sécurité ?

Privément à security@3sr.fr. Réponse sous 24h tous jours. PGP key disponible sur demande.

Pas reçu le mail de bienvenue après l'installation ?

À l'installation, Costory doit envoyer 3 mails automatiquement (depuis la version 0.0.47) :

  1. Mail #1 — "Bienvenue, initialisation en cours" (immédiat post-deploy)
  2. Mail #2 — "Données collectées" (~5 min après, fin du backfill 12 mois)
  3. Mail #3 — "Premier rapport mensuel" (PDF en pièce jointe, suit le mail #2)

Si après 30 minutes vous n'avez reçu aucun mail : le service tente automatiquement plusieurs fois de relancer l'initialisation dans les 3 heures suivantes. Si après 3 heures vous n'avez toujours rien : contactez support@3sr.fr en indiquant le nom de votre Resource Group managé (commence par rg- ou similaire). Notre équipe interviendra sous 1 jour ouvré pour diagnostiquer et relancer l'initialisation.

Retrouver le nom de votre Resource Group managé

Si vous avez oublié le nom du Resource Group créé lors de l'installation Costory, vous pouvez le retrouver de 2 façons :

  1. Depuis le portail Azure : Subscriptions → votre subscription → Resource Groups → filtrer par tag devOpsRepo: Costory
  2. Via Azure Cloud Shell ou az CLI :
az group list --query "[?tags.devOpsRepo=='Costory'].{name:name,location:location}" -o table

Note : le Resource Group managé Costory porte le nom que vous avez choisi lors de l'installation, généralement préfixé rg- (par exemple rg-costory-prod). Le nom du Resource Group interne géré par 3SR porte le même nom suffixé -managed.

Réinstallation avec le même nom (purge ressources soft-deleted)

Azure conserve certaines ressources en soft-delete pendant 7 à 90 jours après suppression du Resource Group managé. C'est notamment le cas pour :

Conséquence : si vous redéployez Costory avec le même nom dans la même région avant expiration du soft-delete, le déploiement échoue avec une erreur du type ConflictError: The resource <nom> already exists in soft-deleted state.

Procédure de purge (Cloud Shell PowerShell)

Pré-requis : compte avec rôle Contributor ou supérieur sur la souscription de déploiement. Adapter <sub-id> et <region> (ex francecentral).

0. Retrouver le nom du Resource Group supprimé (si oublié)

Le filtre par tag ci-dessus ne fonctionne plus une fois le Resource Group supprimé. Retrouvez le nom via le journal d'activité de la souscription : le resourceId retourné contient le chemin complet .../resourceGroups/<nom-du-rg>/....

# Retrouver les operations recentes sur les ressources Costory (90 jours max)
az monitor activity-log list --offset 90d \
  --query "[?contains(resourceId, 'cog-3sr-costory')].resourceId" -o tsv

1. Purger Cognitive Services (= Azure AI Foundry)

# Lister les Cognitive Services soft-deleted dans la region
az cognitiveservices account list-deleted --query "[?location=='<region>'].{name:name, kind:kind, deletionDate:properties.deletionDate}" -o table

# Purger un compte specifique (definitif, irreversible)
az cognitiveservices account purge \
  --name <nom-du-compte> \
  --location <region> \
  --resource-group <rg-managed-original>

2. Purger Function App (= nom verrouillé jusqu'à la fin du soft-delete)

Les Function App sur Linux Consumption Plan (Y1) gardent le nom global verrouillé pendant ~7 jours. Il n'existe pas de commande az functionapp purge publique — la solution est de :

3. Purger Key Vault (si applicable)

# Lister les Key Vault soft-deleted
az keyvault list-deleted --query "[?properties.location=='<region>'].{name:name, deletionDate:properties.deletionDate}" -o table

# Purger un Key Vault (definitif)
az keyvault purge --name <nom-kv> --location <region>

4. Verifier qu'il ne reste rien et redeployer

# Re-lister apres purge — doit etre vide pour les noms en cause
az cognitiveservices account list-deleted --query "[?location=='<region>'].name" -o tsv
az keyvault list-deleted --query "[?properties.location=='<region>'].name" -o tsv

Vous pouvez ensuite relancer le déploiement Costory depuis Marketplace avec le même nom (Function App exclu — cf. point 2 ci-dessus).

⚠ La purge est définitive et irréversible. Vérifiez bien le nom avant. En cas de doute, contactez support@3sr.fr.

Documentation supplémentaire

Dernière mise à jour : 2026-05-13