# Coût Fargate vs App Runner : la même application, chiffrée des deux façons
<!-- meta: Coût Fargate vs App Runner pour la même application Next.js : prix catalogue, ALB, IPv4 publique, NAT inclus, et le seuil où Fargate gagne. -->

Nous exploitons trois applications Next.js sur AWS App Runner et avons rédigé [un bilan honnête après six mois](/fr/blog/aws-app-runner-review-six-months). La question qu'on nous pose le plus à propos de cet article ne porte pas sur les timeouts ou les health checks. C'est « App Runner n'est-il pas plus cher que Fargate ? »

Par heure-vCPU, oui, d'environ 58 %. Par mois, pour la plupart des petites équipes, non. La différence tient à ce que chaque service facture pendant que personne n'utilise l'application, et à la plomberie que Fargate exige alors qu'App Runner l'inclut. Voici la même application chiffrée des deux façons, au prix catalogue dans us-east-1, avec chaque ligne qui apparaît sur la facture.

## Les deux grilles tarifaires

| | App Runner | Fargate (Linux, x86) | Fargate (Linux, ARM) |
|---|---|---|---|
| vCPU | $0,064 par heure-vCPU, **uniquement pendant le traitement des requêtes** | $0,040478 par heure-vCPU, en continu | $0,03238 par heure-vCPU, en continu |
| Mémoire | $0,007 par Go-heure, en continu | $0,004446 par Go-heure, en continu | $0,00356 par Go-heure, en continu |
| Load balancer | Inclus | ALB : $0,0225/heure + $0,008 par LCU-heure | idem |
| Point d'entrée HTTPS, certificat TLS | Inclus | Certificat ACM sur l'ALB (gratuit) | idem |
| IPv4 publique | Non facturée | $0,005/heure par adresse (ALB et tâches) | idem |
| Savings Plans / Spot | Non | Compute Savings Plans, Fargate Spot | idem |

Les deux facturent à la seconde avec un minimum d'une minute. La ligne qui compte est la première. App Runner divise la vie d'une instance en deux états : **provisionnée** (elle existe, elle est chaude, elle attend) et **active** (elle traite au moins une requête). À l'état provisionné, vous ne payez que la mémoire. Fargate n'a pas un tel état : une tâche en cours d'exécution paie son vCPU et sa mémoire chaque seconde où elle existe, qu'elle serve mille requêtes ou aucune.

## L'application que nous avons chiffrée

Il s'agit de l'application publique de notre [décomposition de facture AWS](/fr/blog/aws-bill-of-a-three-person-startup) : une application Next.js pour un client américain, deux instances toujours actives de 2 vCPU et 4 Go chacune, pour qu'un déploiement ou un crash ne la laisse jamais sans capacité. 730 heures dans un mois.

**App Runner.** La mémoire est payée en continu : 2 instances × 4 Go × $0,007 × 730 h = **$40,88**. Le vCPU n'est payé que pendant qu'une instance est active : 2 instances × 2 vCPU × $0,064 × 730 h = $186,88 *si les deux étaient occupées chaque seconde du mois*. Le chiffre réel correspond à $186,88 multiplié par la part du temps où les instances traitent des requêtes. Nous appellerons cette part la fraction d'occupation.

**Fargate, x86.** Chaque tâche coûte 2 × $0,040478 + 4 × $0,004446 = $0,0987 par heure. Deux tâches pour un mois : **$144,16**. Puis les éléments qu'App Runner ne vous fait pas penser à ajouter :

- Un Application Load Balancer : $0,0225 × 730 = $16,43, plus environ une LCU en moyenne pour un trafic modeste, $5,84. **$22,27.**
- IPv4 publique pour l'ALB, une par zone de disponibilité, deux zones : **$7,30**.
- Les tâches ont besoin d'une route sortante pour appeler des API externes, récupérer des images et envoyer des e-mails. Soit des sous-réseaux publics avec une IP publique par tâche (**$7,30**), soit des sous-réseaux privés et une [passerelle NAT](/fr/blog/nat-gateway-the-most-expensive-line-you-do-not-see) ($32,85 plus $3,65 pour son adresse plus $0,045 par Go traité, **~$37**).

Total pour Fargate sur x86 : **~$181** avec des sous-réseaux publics, **~$210** avec des sous-réseaux privés et un NAT. La même configuration sur ARM (Graviton), sous-réseaux publics : **~$152**.

## Où les courbes se croisent

La facture d'App Runner est $40,88 plus $186,88 × fraction d'occupation. Celle de Fargate est un chiffre fixe. Mettons-les sur le même graphique :

<div class="article-figure">
<svg viewBox="0 0 900 340" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Graphique du coût mensuel selon la fraction d'occupation. App Runner passe d'env. 41 dollars à 0 % à env. 228 dollars à 100 %. Fargate est plat : env. 152 dollars sur ARM, 181 dollars sur x86 avec sous-réseaux publics, 210 dollars sur x86 avec NAT. App Runner est moins cher sous 60, 75 et 91 % d'occupation respectivement.">
<g font-family="Inter,system-ui,sans-serif" font-size="12">
<text x="80" y="24" fill="#f1f3ff" font-size="14" font-weight="700">Coût mensuel, 2 × (2 vCPU, 4 Go), prix catalogue us-east-1</text>
<g stroke="#2a3150" stroke-width="1">
<line x1="80" y1="260" x2="820" y2="260"/><line x1="80" y1="204.9" x2="820" y2="204.9"/><line x1="80" y1="149.8" x2="820" y2="149.8"/><line x1="80" y1="94.8" x2="820" y2="94.8"/><line x1="80" y1="40" x2="820" y2="40"/>
</g>
<g fill="#9aa3c7" text-anchor="end">
<text x="70" y="264">$0</text><text x="70" y="209">$60</text><text x="70" y="154">$120</text><text x="70" y="99">$180</text><text x="70" y="44">$240</text>
</g>
<g fill="#9aa3c7" text-anchor="middle">
<text x="80" y="280">0 %</text><text x="265" y="280">25 %</text><text x="450" y="280">50 %</text><text x="635" y="280">75 %</text><text x="820" y="280">100 %</text>
<text x="450" y="300">fraction d'occupation : part du mois où une instance traite au moins une requête</text>
</g>
<line x1="80" y1="67.3" x2="820" y2="67.3" stroke="#ff6b8a" stroke-width="2" stroke-dasharray="6,4"/>
<text x="84" y="61" fill="#ff6b8a">Fargate x86 + NAT · $210</text>
<line x1="80" y1="94.1" x2="820" y2="94.1" stroke="#ffd166" stroke-width="2" stroke-dasharray="6,4"/>
<text x="84" y="88" fill="#ffd166">Fargate x86, réseau public · $181</text>
<line x1="80" y1="120.5" x2="820" y2="120.5" stroke="#4fffb0" stroke-width="2" stroke-dasharray="6,4"/>
<text x="84" y="114" fill="#4fffb0">Fargate ARM, réseau public · $152</text>
<line x1="80" y1="222.5" x2="820" y2="51.2" stroke="#7b8cff" stroke-width="3"/>
<text x="560" y="190" fill="#7b8cff" font-weight="700">App Runner</text>
<circle cx="521" cy="120.5" r="5" fill="#4fffb0"/><text x="521" y="140" fill="#4fffb0" text-anchor="middle">60 %</text>
<circle cx="635" cy="94.1" r="5" fill="#ffd166"/><text x="647" y="112" fill="#ffd166" text-anchor="middle">75 %</text>
<circle cx="750" cy="67.3" r="5" fill="#ff6b8a"/><text x="762" y="85" fill="#ff6b8a" text-anchor="middle">91 %</text>
<text x="80" y="325" fill="#9aa3c7">À gauche d'un point, App Runner est moins cher que cette config Fargate ; à droite, c'est Fargate.</text>
</g>
</svg>
</div>

| Fraction d'occupation | App Runner | Fargate ARM, public | Fargate x86, public | Fargate x86 + NAT |
|---|---|---|---|---|
| 10 % | $60 | $152 | $181 | $210 |
| 25 % | $88 | $152 | $181 | $210 |
| 50 % | $134 | $152 | $181 | $210 |
| 75 % | $181 | $152 | $181 | $210 |
| 100 % | $228 | $152 | $181 | $210 |

App Runner reste moins cher que Fargate x86 tant que les instances ne sont pas occupées trois quarts du temps, et moins cher que la configuration en sous-réseau privé presque tout le temps. Graviton déplace le seuil à 60 %.

## Ce que « occupé » veut vraiment dire

C'est là que la comparaison part de travers, dans les deux sens. Occupé ne veut pas dire utilisation CPU. Une instance App Runner est active, et facturée pour le vCPU, dès qu'*au moins une requête* est en cours, avec un minimum d'une minute à chaque réveil. Une seule requête toutes les trente secondes maintient une instance active en continu, même si le CPU reste à 2 %.

La façon honnête d'estimer votre fraction d'occupation est donc de regarder quand il y a du trafic tout court, pas son intensité :

- **Une application B2B utilisée aux heures de bureau** dans un ou deux fuseaux horaires : occupée environ 10 à 12 heures en semaine, inactive les nuits et les week-ends. Soit 30 à 40 %. C'est l'application publique de notre client, et c'est pourquoi App Runner lui revient moins cher.
- **Une application grand public avec un trafic mondial**, ou tout ce qui est sollicité en permanence par des monitors, des webhooks et des bots : effectivement 100 %. Ici, Fargate gagne, clairement sur ARM.
- **Outils internes, panneaux d'administration, staging** : occupés quelques pour cent du temps. App Runner à la taille minimale (0,25 vCPU, 0,5 Go) coûte environ $2,60 par mois au repos. La même tâche Fargate coûte $9 par mois, que quelqu'un l'ouvre ou non.

Vérifiez votre propre chiffre avant de décider. Les journaux de requêtes de l'ALB ou de CloudFront, regroupés par minute, vous diront quelle part des minutes a eu au moins une requête.

## La ligne que la plupart des comparaisons oublient

App Runner n'a pas besoin de passerelle NAT pour l'accès Internet sortant avec son réseau par défaut. Dès que vous ajoutez un VPC connector pour que le service puisse atteindre une base de données privée, *tout* le trafic sortant passe par votre VPC, et il vous faut un NAT pour tout ce qui touche Internet : Stripe, une API d'e-mail, un fournisseur d'identité. C'est notre cas : nos services App Runner parlent à Aurora, donc le compte a déjà un NAT.

Quand les deux options ont besoin du NAT, il s'annule dans la comparaison et le seuil de rentabilité revient à environ 75 % sur x86. Quand App Runner n'en a pas besoin et que Fargate en aurait besoin, ce sont $37 par mois et par compte que seul un côté paie. Avec trois comptes (dev, staging, prod), cela fait plus de $100 par mois, [la troisième ligne la plus importante de notre facture](/fr/blog/aws-bill-of-a-three-person-startup).

<div class="article-figure">
<svg viewBox="0 0 900 300" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Arbre de décision. D'abord : requêtes de plus de 120 s, ou besoin de Spot ou de Savings Plans ? Si oui, Fargate. Sinon : l'appli est-elle occupée plus d'env. 75 % du mois, ou 60 % avec ARM ? Si oui, Fargate. Sinon, App Runner, moins cher et avec moins de plomberie à faire tourner.">
<g font-family="Inter,system-ui,sans-serif" font-size="13">
<rect x="20" y="30" width="400" height="70" rx="8" fill="#151b2e" stroke="#7b8cff"/>
<text x="220" y="58" text-anchor="middle" fill="#f1f3ff">Requêtes de plus de 120 s, ou besoin de</text>
<text x="220" y="78" text-anchor="middle" fill="#f1f3ff">Spot / Savings Plans / réseau fin ?</text>
<line x1="420" y1="65" x2="610" y2="65" stroke="#ffd166" stroke-width="2"/><text x="515" y="57" text-anchor="middle" fill="#ffd166">oui</text>
<rect x="610" y="35" width="270" height="60" rx="8" fill="#151b2e" stroke="#ffd166"/>
<text x="745" y="70" text-anchor="middle" fill="#ffd166" font-weight="700">Fargate</text>
<line x1="220" y1="100" x2="220" y2="140" stroke="#4fffb0" stroke-width="2"/><text x="235" y="126" fill="#4fffb0">non</text>
<rect x="20" y="140" width="400" height="70" rx="8" fill="#151b2e" stroke="#7b8cff"/>
<text x="220" y="168" text-anchor="middle" fill="#f1f3ff">Occupée plus de ~75 % du mois</text>
<text x="220" y="188" text-anchor="middle" fill="#f1f3ff">(~60 % si vous utilisiez ARM) ?</text>
<line x1="420" y1="175" x2="610" y2="175" stroke="#ffd166" stroke-width="2"/><text x="515" y="167" text-anchor="middle" fill="#ffd166">oui</text>
<rect x="610" y="145" width="270" height="60" rx="8" fill="#151b2e" stroke="#ffd166"/>
<text x="745" y="173" text-anchor="middle" fill="#ffd166" font-weight="700">Fargate</text>
<text x="745" y="192" text-anchor="middle" fill="#9aa3c7" font-size="12">sur Graviton</text>
<line x1="220" y1="210" x2="220" y2="240" stroke="#4fffb0" stroke-width="2"/><text x="235" y="230" fill="#4fffb0">non</text>
<rect x="20" y="240" width="400" height="50" rx="8" fill="#151b2e" stroke="#4fffb0"/>
<text x="220" y="270" text-anchor="middle" fill="#4fffb0" font-weight="700">App Runner : moins cher, moins à opérer</text>
</g>
</svg>
</div>

## Quand Fargate est quand même la bonne réponse

Le coût n'est pas le seul facteur, et il y a des cas où nous choisirions Fargate quelle que soit la fraction d'occupation :

- **Des requêtes qui durent plus de 120 secondes.** Le timeout de la gateway d'App Runner est fixe. Les exports, la génération de rapports et les appels IA longs doivent soit passer par une file d'attente, soit passer sur Fargate.
- **Vous voulez des engagements.** Les Compute Savings Plans couvrent Fargate, pas App Runner, et Fargate Spot enlève jusqu'à 70 % sur les workers interruptibles. À la taille de notre facture, [les engagements n'en valent pas encore la peine](/fr/blog/reserved-savings-plans-or-nothing-at-small-scale) ; à dix fois cette taille, si.
- **Vous avez besoin de contrôler le chemin réseau** : sidecars, service mesh, règles de security group spécifiques par tâche, plusieurs conteneurs dans une même tâche. C'est à ça que sert ECS, et notre [guide Fargate](/fr/blog/aws-ecs-fargate-deploy) couvre la configuration.
- **Plusieurs services derrière un seul ALB.** Le coût fixe de l'ALB n'est payé qu'une fois. Avec dix services derrière des règles de listener basées sur l'hôte, cela revient à $2 par service, et la comparaison bascule en faveur de Fargate pour les services occupés.

## Ce que nous ferions

Pour une petite équipe qui livre des applications web, commencez sur App Runner. C'est moins cher au niveau de trafic que connaissent réellement la plupart des jeunes produits, il n'y a ni ALB, ni target groups, ni sous-réseaux à gérer, et passer à Fargate plus tard est un changement dans la stack CDK, pas dans l'application, puisque les deux exécutent la même image de conteneur (gardez-la [petite](/fr/blog/docker-images-for-node-in-2026-distroless-multi-stage) dans tous les cas).

Reconsidérez la question quand un service est occupé la majeure partie du mois, ou quand sa ligne App Runner dépasse quelques centaines de dollars. À ce moment-là, faites tourner ce service-là sur Fargate avec Graviton, et laissez les services calmes où ils sont.

Si vous voulez que ce calcul soit fait pour votre propre trafic et votre architecture, [parlez-nous](/contact). C'est généralement un exercice d'une heure avec votre Cost Explorer ouvert.
