Skip to main content

Auto-hébergement et configuration d'Infracost.

· 5 min read
Chems Eddine Rachdi

Infracost qu'est ce que c'est ?

Infracost est un outil open-source qui permet d'estimer les coûts des infrastructures cloud . Il s'agit d'un utilitaire en ligne de commande qui s'intègre avec les outils d'infrastructure as Code tels que Terraform, AWS CloudFormation, etc. Il fournit une analyse détaillée des coûts associés à ces ressources.

L'outil utilise les informations des APIs des fournisseurs de services cloud pour calculer les coûts des ressources.

Pourquoi self host Infracost ?

Infracost offre trois options distinctes. Tout d'abord, il y a Infracost CI/CD, qui est entièrement gratuit, mais est limité à 1000 utilisations par mois. Ensuite, nous avons l'offre Infracost Cloud, qui propose un nombre illimité d'exécutions, mais à un coût de 50€ par utilisateur, ce qui peut représenter une dépense significative. Enfin, la troisième option consiste à self host Infracost, où les seuls frais à prendre en compte sont ceux associés à l'infrastructure sur laquelle il est déployé, tels que les coûts de la Web Application, de la base de données, etc. (github de l'API).

info

Le code source de cet article est disponible sur github.

Étapes d'hébergement

Pour mettre en place Infracost, nous devons commencer par créer un compte sur https://www.infracost.io.
Nous aurons besoin de l'api key de notre compte dans les étapes suivantes, ainsi que d'une self hosted api key que nous allons générer.

info

Api key : est utilisée pour télécharger la base de données d'infracost.
Self hosted api key : est utilisée pour authentifier les utilisateurs de notre organisation à notre instance d'infracost.

image

Récupération de l'api key

Vous pouvez vous rendre sur le site web d'Infracost, vous connecter à votre compte, puis récupérer l'api key dans l'onglet "Org Settings".

Création de la self hosted api key

Générer une self hosted api key de 32 caractères.

export SELF_HOSTED_INFRACOST_API_KEY=$(cat /dev/urandom | env LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
echo "SELF_HOSTED_INFRACOST_API_KEY=$SELF_HOSTED_INFRACOST_API_KEY"
info

Assurez vous d'exécuter les lignes de commande dans un terminal bash

Sauvegarder les clés api

Pour simplifier nous avons sauvegardé les clés api dans des variables Azure DevOps, mais il est préférable d'utiliser Azure KeyVault (ou un autre logiciel de gestion de secrets de votre choix).

INFRACOST_API_KEY = $INFRACOST_API_KEY # L'api key que nous avons récupéré depuis le site d'infracost
SELF_HOSTED_INFRACOST_API_KEY = $SELF_HOSTED_INFRACOST_API_KEY

Création d'une base de données PostgreSQL

resource "azurerm_postgresql_flexible_server" "psql-server" {
name = "infracost-psqlflexibleserver"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
version = "14"
administrator_login = var.administrator_login
administrator_password = var.administrator_password
storage_mb = 32768
sku_name = "B_Standard_B1ms"
lifecycle {
ignore_changes = [zone]
}
}

resource "azurerm_postgresql_flexible_server_firewall_rule" "fw-rule" {
name = "my-fw-rule"
server_id = azurerm_postgresql_flexible_server.psql-server.id
start_ip_address = "0.0.0.0"
end_ip_address = "255.255.255.255"
}

resource "azurerm_postgresql_flexible_server_database" "psql-db" {
name = "cloud_pricing"
server_id = azurerm_postgresql_flexible_server.psql-server.id
collation = "en_US.utf8"
charset = "utf8"
}
note

Dans cet article, on déploie initialement une base de données en mode public avec des règles de pare-feu permissives pour des raisons de simplicité. Cependant, il est conseillé d'opter pour un déploiement privé et des règles de pare-feu plus restrictives.

Création d'une Azure Application

resource "azurerm_service_plan" "sp" {
name = "sp-infracost"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
os_type = "Linux"
sku_name = "B2"
}

resource "azurerm_linux_web_app" "azapp" {
name = "azapp-infracost"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_service_plan.sp.location
service_plan_id = azurerm_service_plan.sp.id

app_settings = {
"INFRACOST_API_KEY" = var.infracost_api_key
"SELF_HOSTED_INFRACOST_API_KEY" = var.infracost_self_hosted_api_key
"POSTGRES_URI" = local.postgres_connection_string
}

site_config {
application_stack {
docker_image_name = "infracost/cloud-pricing-api:latest"
docker_registry_url = "https://index.docker.io"
}
app_command_line = "npm run start"
}
}

Par défaut, lorsque nous exécutons l'image Docker "infracost/cloud-pricing-api", l'API et la mise à jour de la base de données démarrent en même temps. Cependant, dans notre cas, nous avons décidé de lancer uniquement l'API lorsque nous créons l'application web Azure en utilisant la commande "npm run start". Ensuite, nous utilisons un script séparé pour mettre à jour notre base de données, ce qui nous donne un meilleur contrôle sur ces mises à jour, et cela évite que chaque redémarrage de la web application déclenche un téléchargement complet de la base de données.

Mise à jour de la base de données

Pour mettre à jour la base de données, nous avons besoin de notre api key, la postgres URI (postgres connection string), ainsi que de la self hosted api key.

Une fois que l'application web est déployée, nous exécutons un script pour mettre à jour la base de données toutes les semaines, ce script consiste à lancer la même image docker que notre API mais avec le job init, qui ne fait que mettre à jour la base de données sans lancer le serveur d'API. Le conteneur est automatiquement arrêté une fois cela fait puis détruit car nos agents de déploiements sont volatiles.

docker run -e POSTGRES_URI=$(POSTGRES_URI) -e INFRACOST_API_KEY=$(INFRACOST-API-KEY) -e SELF_HOSTED_INFRACOST_API_KEY=$(SELF_HOSTED_INFRACOST_API_KEY) infracost/cloud-pricing-api:latest npm run job:init -p 80:80

Résultat de la Configuration

Une fois que l'application web est déployée et que la base de données est à jour, vous serez automatiquement dirigé vers cette page lors de votre première visite (avec le lien de votre web app à la place de http://127.0.0.1:4000).

Success image

Après avoir saisi le token dans la barre prévue à cet effet et cliqué sur le bouton "Show stats", vous aurez accès à des informations telles que la date de la dernière mise à jour de la base de données et des statistiques détaillées concernant l'utilisation de l'API.

Vérification de la configuration

Afin de garantir que le déploiement a été réalisé avec succès, nous allons effectuer un test de l'API. Pour effectuer ce test localement avec la ligne de commande (CLI), veuillez exécuter les commandes suivantes :

infracost configure set pricing_api_endpoint azapp-infracost.azurewebsites.net # assurez vous de bien renseigner le default_hostname de votre web application
infracost configure set api_key $SELF_HOSTED_INFRACOST_API_KEY

infracost breakdown --path /path/to/code

Si votre application web est correctement déployée, vous devriez obtenir une estimation des coûts de votre code.

Pour les détails d'utilisation d'infracost veuillez vous diriger sur : Infracost