Agent IA autonome sur un VPS avec claude -p (et pourquoi Bedrock en production) | OptimyCloud

Faire tourner un agent IA en autonomie sur un VPS — et pourquoi je passe par Bedrock en production

22 juillet 2026 12 min de lecture Alexandre Gillon
Baie de serveurs hébergeant un agent IA autonome

Mettre un agent IA sur un VPS, c'est vingt minutes de travail. Un apt install, une clé API dans un fichier .env, un cron, et vous avez une machine qui trie vos logs toutes les nuits. Ça marche vraiment, et c'est assez satisfaisant.

Le problème arrive plus tard : le jour où ce montage ne tourne plus sur votre serveur perso mais chez un client, avec ses données, sa facture et son DSI qui pose des questions. À ce moment-là, la clé API dans le .env devient un vrai sujet, et il n'y a pas de rustine élégante.

Cet article fait les deux : le montage qui fonctionne, puis la version que je déploie réellement en production, basée sur Amazon Bedrock. Le basculement de l'une à l'autre tient dans une variable d'environnement — c'est tout ce qui sépare un side-project d'une infrastructure auditable.

Le montage de base : claude -p sur un VPS

Claude Code n'est pas seulement une interface interactive dans un terminal. Le drapeau -p (ou --print) le fait basculer en mode non interactif : il lit son entrée standard, écrit sur la sortie standard et rend la main avec un code de sortie. Autrement dit, il se comporte comme grep ou jq, et se pilote depuis n'importe quel script shell.

C'est ce qui rend l'agent déployable : plus besoin de session, de TTY ou de tmux qui traîne. Un VPS d'entrée de gamme suffit — l'inférence tourne côté API, la machine ne fait qu'orchestrer.

# Installation et premier appel non interactif

curl -fsSL https://claude.ai/install.sh | bash

export ANTHROPIC_API_KEY="sk-ant-..."

claude -p "Résume les erreurs de ce log" < /var/log/app/error.log

Les quatre drapeaux qui comptent

  • --bare — désactive la découverte automatique des hooks, skills, plugins, serveurs MCP et fichiers CLAUDE.md. Sans lui, votre agent charge tout ce qui traîne dans le répertoire de travail et dans ~/.claude. En production, c'est le drapeau qui garantit que la commande fait la même chose sur toutes les machines.
  • --output-format json — renvoie un objet structuré au lieu de texte libre : le résultat, l'identifiant de session, l'usage en tokens et le coût de l'exécution. C'est ce qui rend le pilotage possible : vous parsez avec jq et vous branchez sur la sortie.
  • --allowedTools — la liste blanche des outils autorisés sans confirmation. La syntaxe accepte le préfixe : Bash(git diff *) autorise toutes les commandes qui commencent par git diff. L'espace avant l'astérisque est significatif.
  • --append-system-prompt — ajoute des instructions au prompt système sans écraser le comportement par défaut. C'est là que vous définissez le rôle de l'agent : relecteur sécurité, trieur d'incidents, rédacteur de rapport.

# Un agent de revue déclenché par un timer systemd

#!/usr/bin/env bash
set -euo pipefail

cd /srv/projet

git diff origin/main | claude --bare -p \
  --append-system-prompt "Tu es ingénieur sécurité. Signale uniquement
  les vulnérabilités exploitables, avec fichier et ligne." \
  --output-format json \
  --allowedTools "Read" \
  | jq -r '.result' > /var/reports/revue-$(date +%F).md

Un timer systemd, une entrée de cron, et vous avez un agent qui produit un rapport de revue tous les matins. C'est réellement utile, et ça coûte quelques centimes par exécution.

Détail qui évite une mauvaise surprise : l'entrée standard est plafonnée à 10 Mo. Au-delà, la commande sort en erreur avec un code non nul. Pour de gros volumes, écrivez le contenu dans un fichier et donnez le chemin dans le prompt plutôt que de le faire transiter par un tube.

Ce qui casse dès que ce n'est plus votre side-project

Le montage ci-dessus est parfaitement viable sur votre serveur personnel. Il devient difficile à défendre le jour où il tourne chez un client. Quatre points bloquent, et aucun ne se règle avec une meilleure organisation de fichiers.

La clé API est un secret statique, en clair, sur la machine

Elle ne tourne jamais d'elle-même, elle est rattachée à un compte nominatif, et elle vit dans un fichier lisible par le processus. Un agent qui exécute des commandes shell tourne, par construction, sur la même machine que le secret qui paye ses appels. Le jour où quelqu'un quitte l'entreprise ou où une sauvegarde fuite, vous révoquez à la main et vous redéployez partout.

Aucune traçabilité exploitable

Vous savez combien la clé a consommé au total. Vous ne savez pas quel service, quelle machine, quel job. En audit, « c'est un agent qui appelle une API avec une clé partagée » n'est pas une réponse recevable : on vous demandera qui a appelé quoi, quand, et avec quelle autorisation.

Pas de plafond technique

Un agent qui boucle sur une tâche mal cadrée consomme jusqu'à ce que quelqu'un s'en aperçoive. Le seul garde-fou natif d'une clé API, c'est le plafond de la carte bancaire qui est derrière — et une alerte de dépassement qui arrive après coup. Sur un budget client, ce n'est pas suffisant. Le sujet du pilotage de la dépense Cloud, on l'a détaillé dans notre guide de l'audit FinOps.

La question des données arrive toujours

Dès qu'un agent lit des fichiers métier, des logs applicatifs ou du code propriétaire, la première question du client porte sur le trajet de ces données et sur la juridiction où elles sont traitées. C'est une question légitime, et il vaut mieux avoir une réponse architecturale qu'une capture d'écran de conditions générales.

La version production : le même agent, via Amazon Bedrock

Amazon Bedrock sert les modèles Claude depuis l'intérieur d'un compte AWS. Pour l'agent, rien ne change : mêmes commandes, mêmes outils, même prompt. Ce qui change, c'est tout ce qu'il y a autour de l'appel.

# Le basculement complet

export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=eu-west-3

# Épinglage du modèle (fortement recommandé)
export ANTHROPIC_MODEL='eu.anthropic.claude-sonnet-4-5-20250929-v1:0'

claude --bare -p "Résume les erreurs de ce log" < /var/log/app/error.log

Il n'y a plus de ANTHROPIC_API_KEY dans l'environnement. Claude Code utilise la chaîne de credentials standard du SDK AWS : sur une instance EC2, il récupère les credentials temporaires du rôle IAM attaché à la machine. Aucun secret n'est écrit sur disque, et la rotation est gérée par AWS.

La politique IAM minimale

C'est le cœur du sujet : les permissions de l'agent deviennent une ressource déclarative, versionnée dans votre Terraform, revue en pull request.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "bedrock:InvokeModel",
      "bedrock:InvokeModelWithResponseStream",
      "bedrock:ListInferenceProfiles",
      "bedrock:GetInferenceProfile"
    ],
    "Resource": [
      "arn:aws:bedrock:*:*:inference-profile/*",
      "arn:aws:bedrock:*:*:foundation-model/*"
    ]
  }]
}

Restreignez la ressource aux ARN des profils d'inférence que l'agent a réellement le droit d'appeler et vous obtenez un périmètre net : cet agent-là, sur ces modèles-là, dans ce compte-là.

Ce que ça change concrètement

Traçabilité par appel

Chaque invocation passe par CloudTrail : quel principal IAM, depuis quelle instance, sur quel modèle, à quelle heure. C'est la différence entre « on pense que c'est le job de nuit » et une réponse sourcée en trente secondes.

Budget et refacturation

La consommation apparaît dans Cost Explorer comme n'importe quel service AWS. Vous posez des tags, vous refacturez par équipe ou par projet, et vous branchez AWS Budgets avec une alerte à un seuil que vous choisissez. Les paliers de service Bedrock (default, flex, priority) permettent en plus d'arbitrer coût contre latence sur les tâches de fond.

Résidence des données

Bedrock expose des profils d'inférence inter-régions préfixés eu. qui ne routent que vers des régions européennes. Attention toutefois : la disponibilité varie selon le modèle, et certains modèles récents ne sont proposés en Europe qu'à travers un profil Global qui route vers l'ensemble des régions commerciales. Vérifiez avant de vous engager.

Filtrage de contenu centralisé

Bedrock Guardrails s'applique par en-tête de requête, donc en dehors du code de l'agent. Une équipe sécurité peut imposer une politique de filtrage sans toucher aux scripts déployés.

# Vérifier ce qui est réellement disponible dans votre région

aws bedrock list-inference-profiles --region eu-west-3

Deux limites à connaître avant de basculer.

L'outil de recherche web natif n'est pas disponible sur Amazon Bedrock. Si votre agent doit consulter des sources en ligne, il faut passer par un serveur MCP ou un outil maison. C'est le point qui surprend le plus au moment de la migration.

Le cache de prompt n'est pas actif dans toutes les régions Bedrock. Un agent qui renvoie un contexte volumineux à chaque exécution le paye plein tarif si le cache n'est pas disponible — surveillez les compteurs de tokens mis en cache, s'ils restent à zéro c'est que la région ne le supporte pas.

Épinglez vos modèles

Sans épinglage explicite, les alias sonnet et opus se résolvent vers les valeurs par défaut de Claude Code, qui évoluent avec les versions et peuvent ne pas être activées dans le compte du client. Sur un parc de machines, c'est la garantie d'un comportement qui change tout seul un matin — et d'une facture qui change avec, un modèle Opus coûtant sensiblement plus cher qu'un Sonnet.

export ANTHROPIC_DEFAULT_SONNET_MODEL='eu.anthropic.claude-sonnet-4-5-20250929-v1:0'
export ANTHROPIC_DEFAULT_HAIKU_MODEL='eu.anthropic.claude-haiku-4-5-20251001-v1:0'

En environnement d'entreprise, on va plus loin : les profils d'inférence applicatifs permettent de router chaque version de modèle vers un ARN géré par l'organisation, avec ses propres quotas et son propre suivi de coût.

Et si le client n'est pas sur AWS ?

L'argument de cet article n'est pas « utilisez Bedrock ». Il est qu'un agent en production ne doit pas porter de secret statique, doit être traçable, plafonné, et maîtrisé quant à la localisation de ses données. Bedrock est une façon d'obtenir ces quatre propriétés quand le client est déjà sur AWS. Ce n'est pas la seule.

Sur GCP, Azure ou une infrastructure mixte, la réponse habituelle est une passerelle LLM — LiteLLM en étant l'implémentation open source la plus répandue. Elle s'intercale entre l'agent et le fournisseur et rend exactement le même service : la clé du fournisseur reste côté serveur, chaque service ou chaque développeur reçoit son propre identifiant, la consommation est attribuée, budgets et limites s'appliquent en un point unique, et chaque requête est journalisée.

Côté agent, la bascule tient là encore en une variable :

export ANTHROPIC_BASE_URL=https://passerelle.interne.example.com

La passerelle apporte même une propriété que Bedrock n'a pas : changer de fournisseur se fait dans sa configuration, sans toucher aux machines qui exécutent les agents.

La contrepartie est réelle, et il faut la poser avant de s'engager : la passerelle devient une brique d'infrastructure que vous exploitez. Elle doit suivre les évolutions du client — une passerelle qui ne relaie pas une nouvelle capacité casse la fonctionnalité correspondante. Et Anthropic ne maintient ni n'audite les produits de passerelle tiers.

Avant de laisser tourner : ce qu'il faut verrouiller

Un agent autonome sur une machine exposée, c'est un processus qui exécute des commandes shell décidées par un modèle, à partir de contenus qu'il lit. Ces contenus — un log, une issue GitHub, un fichier déposé par un tiers — ne sont pas de confiance. Cinq règles, dans l'ordre d'importance :

  • Pas de --dangerously-skip-permissions sur une machine exposée. Le bon réglage est une liste blanche via --allowedTools, éventuellement combinée au mode dontAsk qui refuse tout ce qui ne figure pas dans vos règles d'autorisation ou dans l'ensemble des commandes en lecture seule. Un agent qui plante parce qu'il lui manque une permission est un bon signal ; un agent qui a tous les droits n'en émet aucun.
  • Un utilisateur système dédié, non privilégié. Pas de root, pas de compte de déploiement partagé. L'agent n'a accès qu'aux répertoires sur lesquels il doit travailler, et un rôle IAM qui ne porte que les actions Bedrock nécessaires — surtout pas les credentials d'administration du compte.
  • Un egress réseau restreint. Groupe de sécurité en sortie limité à ce dont l'agent a besoin. C'est le filet qui limite les dégâts si un contenu malveillant réussit à influencer une commande.
  • Un plafond de temps d'exécution. Un TimeoutStartSec côté systemd, ou un timeout autour de l'appel. À la réception d'un SIGTERM, Claude Code interrompt le tour en cours, termine l'arborescence de processus des commandes lancées et sort avec le code 143 — l'arrêt est propre, encore faut-il le déclencher.
  • Des journaux conservés. Redirigez la sortie JSON vers un fichier ou CloudWatch. Le jour où l'agent fait quelque chose d'inattendu, la trace complète de la session est la seule chose qui permet de comprendre.

Clé API ou Bedrock : le tableau

Critère Clé API Amazon Bedrock
Authentification Secret statique sur disque Rôle IAM, credentials temporaires
Rotation Manuelle Automatique
Traçabilité Volume global par clé CloudTrail, par appel
Contrôle du budget Alerte a posteriori AWS Budgets, quotas, tags
Résidence des données Selon le fournisseur Profils eu. (à vérifier par modèle)
Recherche web native Disponible Non disponible
Mise en place Quelques minutes Compte AWS, IAM, accès modèles

Le verdict est assez simple. Pour prototyper, explorer, automatiser vos propres tâches : la clé API, sans hésiter, c'est plus rapide et le surcoût de gouvernance ne se justifie pas. Dès qu'il y a un client, des données qui ne vous appartiennent pas ou un budget à défendre : une architecture gouvernée — Bedrock si le client est déjà sur AWS, une passerelle LLM sinon. Dans les deux cas, le passage se fait sans réécrire une ligne de l'agent.

Questions fréquentes

Quelle taille de VPS faut-il ?

Beaucoup moins que ce qu'on imagine. L'inférence tourne chez le fournisseur du modèle, pas sur votre machine : le VPS orchestre, lit des fichiers et exécute des commandes. Deux vCPU et 2 Go de RAM suffisent pour la plupart des agents. Dimensionnez plutôt en fonction de ce que l'agent fait réellement — s'il compile ou lance une suite de tests, c'est cette charge-là qui dicte la taille.

Comment enchaîner plusieurs étapes dans un même contexte ?

Le mode non interactif conserve les sessions. Récupérez l'identifiant de session dans la sortie JSON, puis reprenez-le avec --resume pour poursuivre la même conversation. --continue reprend la conversation la plus récente. Les deux commandes doivent être lancées depuis le même répertoire de projet.

Comment surveiller le coût d'un agent qui tourne en continu ?

La sortie --output-format json contient le coût total de l'exécution et le détail par modèle : vous pouvez le pousser dans une métrique à chaque passage. Sur Bedrock, la consommation remonte en plus dans Cost Explorer et se pilote avec AWS Budgets, comme n'importe quelle ressource AWS.

Faut-il vraiment un VPS, ou une Lambda suffit-elle ?

Tout dépend de la durée. Une Lambda convient pour un agent qui répond en quelques dizaines de secondes ; pour une tâche longue, un conteneur ECS Fargate déclenché par EventBridge est plus adapté et supprime la machine à maintenir. Le VPS reste le plus simple quand l'agent a besoin d'un espace de travail persistant — un dépôt Git déjà cloné, un cache de dépendances.

Que se passe-t-il si le modèle épinglé n'est pas activé sur le compte AWS ?

Claude Code vérifie au démarrage que les modèles visés sont accessibles. Si le modèle par défaut ne l'est pas et qu'aucun épinglage n'est configuré, il bascule sur une version antérieure pour la session en cours en affichant un avertissement — ce repli n'est pas persisté. C'est précisément pour éviter ce comportement silencieux qu'il faut épingler explicitement en production.

Bedrock est-il la seule option AWS ?

Non. AWS expose aussi un point d'entrée nommé Mantle, qui sert les modèles Claude au format natif de l'API Anthropic plutôt qu'au format Invoke de Bedrock, avec les mêmes credentials AWS. Il s'active avec CLAUDE_CODE_USE_MANTLE=1 et utilise ses propres identifiants de modèle. Le catalogue est distinct de celui de Bedrock, et les deux peuvent cohabiter dans la même session.

Un agent IA à mettre en production ?

Architecture, rôles IAM, épinglage des modèles, pilotage du budget et sécurisation de l'exécution. Je conçois et déploie des agents IA autonomes sur AWS, avec la gouvernance qui va avec.

Discutons de votre projet

Réponse sous 24h - Premier échange gratuit et sans engagement