AWS AgentCore Runtime
Article 1 : Déployer un agent de support avec AWS AgentCore Runtime
Série : Agent de Support Backoffice avec AWS AgentCore Étape 1
Table des matières
- Introduction
- Qu’est-ce qu’AWS AgentCore Runtime ?
- Prérequis
- Configuration de l’environnement
- Création de l’agent
- Tests locaux
- Déploiement sur AWS
- Invocation de l’agent
- Observabilité
- Prochaines étapes
Introduction
Lorsqu’un ticket arrive dans ServiceNow, l’équipe de support doit analyser le problème, rechercher dans la base de connaissances, et préparer une réponse. Ce processus manuel prend du temps et retarde la résolution.
Dans cette série d’articles, nous allons construire un agent de support backoffice intelligent qui :
- ✅ Reçoit automatiquement les tickets ServiceNow via webhook
- ✅ Analyse les données de tickets reçues
- ✅ Recherche des solutions dans une base de connaissances
- ✅ Met à jour directement les tickets dans ServiceNow
- ✅ Aide l’équipe de support à traiter les tickets plus rapidement
Ce que vous allez construire dans cet article
Dans ce premier article, nous allons créer un prototype fonctionnel avec AWS AgentCore Runtime. Cet agent :
- Reçoit les données de tickets comme entrée (via webhook dans l’Article 2)
- Parse et extrait les informations pertinentes des tickets
- Recherche dans une base de connaissances simulée
- Prépare des mises à jour de tickets
Important : Pour valider le concept rapidement, nous utilisons des données simulées (hard-coded). Dans l’Article 2, nous déploierons l’infrastructure webhook complète avec API Gateway + Lambda, et connecterons l’agent à la vraie API ServiceNow.
Temps estimé
⏱️ 30-45 minutes pour compléter ce tutoriel.
Qu’est-ce qu’AWS AgentCore Runtime ?
AWS AgentCore Runtime est un service qui permet de déployer, exécuter et mettre à l’échelle des agents IA de manière sécurisée. Il offre :
Isolation de session
Chaque session utilisateur s’exécute dans son propre environnement protégé, empêchant les fuites de données - une exigence critique pour les applications manipulant des données sensibles.
Environnement serverless
- Pas de serveurs à gérer
- Mise à l’échelle automatique
- Facturation à l’utilisation
Compatibilité avec tous les frameworks
AgentCore Runtime fonctionne avec :
- ✅ Strands Agents (que nous utilisons dans cette série)
- ✅ CrewAI
- ✅ LangGraph
- ✅ LlamaIndex
- ✅ Tout framework ou agent personnalisé
Configurations réseau
AgentCore Runtime supporte différentes configurations réseau :
Public (que nous utilisons dans cet article)
- Exécution avec accès Internet géré
- Parfait pour les prototypes et les tests
VPC-only (disponible prochainement)
- Accès aux ressources hébergées dans votre VPC
- Connexion via AWS PrivateLink
- Idéal pour la production avec des exigences de sécurité strictes
Prérequis
Compte et outils AWS
-
Compte AWS actif
- Accès à Amazon Bedrock dans votre région (eu-central-1)
- Permissions IAM pour créer des rôles et des repositories ECR
-
AWS CLI configuré
aws configure # Vérifiez la configuration aws sts get-caller-identity -
Python 3.9 ou supérieur
python --version # Devrait afficher Python 3.9.x ou supérieur -
Git
git --version
Connaissances recommandées
- Bases de Python
- Compréhension des concepts d’agents IA
- Familiarité avec AWS (IAM, services de base)
Configuration de l’environnement
1. Cloner le repository
git clone https://github.com/votre-username/aws-agentcore-tutorial.git
cd aws-agentcore-tutorial
# Basculer sur la branche step-01 (si disponible)
git checkout step-01-runtime-deployment
2. Créer et activer un environnement virtuel Python
# Créer l'environnement virtuel
python -m venv .venv
# Activer l'environnement
# Sur Linux/Mac :
source .venv/bin/activate
# Sur Windows :
.venv\Scripts\activate
Votre prompt devrait maintenant commencer par (.venv).
3. Installer les dépendances
Le fichier requirements.txt contient toutes les dépendances nécessaires :
strands-agents
strands-agents-tools
bedrock-agentcore
bedrock-agentcore-starter-toolkit
Installez-les avec :
pip install -r requirements.txt
Vérification :
# Vérifiez que les packages sont installés
pip list | grep -E "strands|bedrock"
Vous devriez voir :
bedrock-agentcore x.x.x
bedrock-agentcore-starter-toolkit x.x.x
strands-agents x.x.x
strands-agents-tools x.x.x
4. Vérifier l’accès au CLI AgentCore
L’installation du package bedrock-agentcore-starter-toolkit vous donne accès au CLI AgentCore :
agentcore --help
Vous devriez voir l’aide du CLI avec les commandes disponibles.
5. Configurer votre compte AWS
Le fichier de configuration .bedrock_agentcore.yaml contient des informations spécifiques à votre compte AWS. Pour des raisons de sécurité, ce fichier
n’est pas inclus dans le repository Git.
Étapes de configuration :
- Copier le template de configuration
cp .bedrock_agentcore.yaml.template .bedrock_agentcore.yaml
- Récupérer votre numéro de compte AWS
aws sts get-caller-identity --query Account --output text
-
Ou via la console AWS : cliquez sur votre nom d’utilisateur en haut à droite → le numéro de compte s’affiche.
-
Modifier le fichier de configuration
-
Ouvrez .bedrock_agentcore.yaml et remplacez toutes les occurrences de AWS_ACCOUNT_NUMBER par votre numéro de compte AWS :
# Avant
account: 'AWS_ACCOUNT_NUMBER'
ecr_repository: AWS_ACCOUNT_NUMBER.dkr.ecr.eu-central-1.amazonaws.com/...
# Après (exemple avec le compte 123456789012)
account: '123456789012'
ecr_repository: 123456789012.dkr.ecr.eu-central-1.amazonaws.com/...
-
Vérifier la configuration grep “AWS_ACCOUNT_NUMBER” .bedrock_agentcore.yaml
-
Cette commande ne devrait rien retourner. Si elle affiche des résultats, vous n’avez pas remplacé toutes les occurrences.
Note : Le fichier .bedrock_agentcore.yaml est ignoré par Git (via .gitignore) pour protéger vos informations sensibles. Ne commitez jamais ce fichier dans votre repository.
Création de l’agent
Structure du projet
Voici la structure de notre projet :
aws-agentcore-tutorial/
├── src/
│ └── agent/
│ └── agent_level_one_triage.py # Notre agent principal
├── requirements.txt
└── .bedrock_agentcore.yaml # Configuration (généré automatiquement)
Code de l’agent
Ouvrons src/agent/agent_level_one_triage.py pour comprendre la structure.
Import des modules
import json
from strands import Agent, tool
from strands_tools import calculator, current_time
from bedrock_agentcore.runtime import BedrockAgentCoreApp
Explications :
strands: Framework pour créer des agents IA@tool: Décorateur pour définir des outils que l’agent peut utiliserBedrockAgentCoreApp: Classe principale pour créer une application AgentCore
Configuration de l’agent
SYSTEM_PROMPT = """
You are a helpful backoffice support assistant for ServiceNow ticket management.
Your role is to:
1. Parse and analyze ticket data received from webhooks
2. Search the knowledge base for relevant solutions
3. Update ServiceNow tickets with proposed resolutions
4. Provide clear, professional responses to support staff
When analyzing a ticket:
- Parse the ticket data JSON to extract key information
- Search the knowledge base for similar issues
- Propose a resolution based on available information
- Update the ServiceNow ticket with work notes and resolution
You receive complete ticket data via webhook.
Always be concise and professional in your responses.
"""
Le System Prompt définit :
- La personnalité de l’agent
- Son rôle et ses responsabilités
- Comment il doit se comporter
C’est l’élément clé qui guide le comportement de l’agent.
Définition des outils (Tools)
Les outils permettent à l’agent d’interagir avec des systèmes externes. Définissons trois outils pour notre agent de support.
Outil 1 : Parse des données de ticket reçues
@tool
def parse_ticket_data(ticket_json: str) -> str:
"""
Parse ticket data received from ServiceNow webhook.
Extracts key information for analysis.
"""
try:
ticket = json.loads(ticket_json)
formatted = {
"ticket_number": ticket.get("number", "Unknown"),
"short_description": ticket.get("short_description", ""),
"description": ticket.get("description", ""),
"priority": ticket.get("priority", ""),
"state": ticket.get("state", ""),
"requester": ticket.get("caller_id", ""),
"category": ticket.get("category", "")
}
return json.dumps(formatted, indent=2)
except Exception as e:
return json.dumps({"error": f"Failed to parse: {str(e)}"})
Ce que fait cet outil :
- Reçoit les données complètes d’un ticket en format JSON
- Extrait et formate les informations clés du ticket
- Gère les erreurs de parsing gracieusement
- Dans l’Article 2, recevra les données directement via webhook ServiceNow
Architecture webhook (Article 2) :
ServiceNow (nouveau ticket créé)
↓ Déclenche Business Rule
↓ HTTP POST avec données complètes du ticket
API Gateway (/webhook/servicenow)
↓ Invoque
Lambda Function (webhook_handler)
↓ Appelle
Agent (parse_ticket_data + analyse + update)
Outil 2 : Recherche dans la base de connaissances
@tool
def search_knowledge_base(query: str) -> str:
"""Search the knowledge base for solutions related to the query"""
# Simulated knowledge base - will be replaced with AWS Bedrock Knowledge Base in Article 3
knowledge_articles = []
query_lower = query.lower()
if "vpn" in query_lower:
knowledge_articles.append({
"article_id": "KB0001",
"title": "VPN Connection Timeout Troubleshooting",
"summary": "Common causes and solutions for VPN connection timeout errors",
"solution": [
"1. Check if user's home network allows VPN traffic...",
"2. Verify VPN client version is up to date",
# ... autres étapes
],
"category": "Network Access"
})
# ... autres articles
return json.dumps(response, indent=2)
Ce que fait cet outil :
- Recherche des articles de la base de connaissances pertinents
- Retourne les solutions correspondantes
- Dans cet article, utilise une logique simple basée sur des mots-clés
- Dans l’Article 3, utilisera AWS Bedrock Knowledge Bases avec recherche sémantique
Outil 3 : Mise à jour de ticket ServiceNow
@tool
def update_servicenow_ticket(ticket_number: str, resolution_notes: str) -> str:
"""
Update ServiceNow ticket with resolution notes.
Makes real API call to ServiceNow (in Article 2).
"""
try:
# Simulated update - will be replaced with real ServiceNow API call in Article 2
result = {
"success": True,
"ticket_number": ticket_number,
"message": "Ticket update prepared",
"state": "In Progress",
"work_notes": resolution_notes,
"note": "This is a simulated update. In Article 2, this will make a real API call to ServiceNow."
}
return json.dumps(result, indent=2)
except Exception as e:
return json.dumps({
"success": False,
"error": f"Failed to update: {str(e)}"
}, indent=2)
Ce que fait cet outil :
- Prépare une mise à jour de ticket avec notes de résolution
- Simule la mise à jour dans cet article
- Dans l’Article 2, effectuera un vrai appel API REST à ServiceNow
- Retourne un résultat structuré indiquant le succès ou l’échec
Initialisation de l’application AgentCore
# Créer l'application AgentCore
app = BedrockAgentCoreApp()
# Créer l'agent avec le modèle Nova Lite
agent = Agent(
model="eu.amazon.nova-lite-v1:0",
system_prompt=SYSTEM_PROMPT,
tools=[
calculator,
current_time,
parse_ticket_data, # Parse les données de ticket reçues
search_knowledge_base,
update_servicenow_ticket # Met à jour ServiceNow
]
)
Explications :
BedrockAgentCoreApp(): Crée l’application AgentCoreAgent(): Initialise l’agent Strands avec :- model : Amazon Nova Lite (rapide et économique)
- system_prompt : Le prompt système défini plus haut
- tools : Liste des outils disponibles pour l’agent
Point d’entrée de l’application
@app.entrypoint
def invoke(payload):
"""Handler for agent invocation"""
user_message = payload.get(
"prompt",
"No prompt found in input. Please provide a 'prompt' key in the JSON payload."
)
response = agent(user_message)
return response.message['content'][0]['text']
if __name__ == "__main__":
app.run()
Explications :
@app.entrypoint: Définit la fonction appelée lors d’une invocationpayload.get("prompt"): Extrait le message utilisateur du payload JSONagent(user_message): Invoque l’agent avec le messageresponse.message['content'][0]['text']: Extrait le texte de la réponse
Tests locaux
Avant de déployer sur AWS, testons l’agent localement.
1. Lancer l’agent en mode local
# Depuis le répertoire racine du projet
agentcore launch --local
2. Tester avec le CLI AgentCore
Ouvrez un nouveau terminal (gardez le serveur qui tourne) et testez :
Test 1 : Salutation simple
agentcore invoke --local '{"prompt": "Hello! What can you help me with?"}'
L’agent devrait vous répondre en expliquant son rôle de support pour ServiceNow.
Test 2 : Analyse de données de ticket VPN
agentcore invoke --local '{"prompt": "Analyze this ticket data: {\"number\": \"INC0001234\", \"short_description\": \"VPN connection timeout\", \"description\": \"User cannot connect to VPN from home\", \"priority\": \"2\", \"state\": \"1\"}"}'
L’agent devrait :
- Appeler
parse_ticket_data()avec les données JSON du ticket - Extraire les informations clés (numéro, description, priorité)
- Appeler
search_knowledge_baseavec “VPN” - Trouver l’article KB0001
- Proposer une solution basée sur l’article
- Appeler
update_servicenow_ticket()pour mettre à jour le ticket
Test 3 : Recherche générale
agentcore invoke --local '{"prompt": "How do I troubleshoot email sync issues on iPhone?"}'
L’agent devrait rechercher dans la base de connaissances et retourner l’article KB0003 sur les problèmes de synchronisation email mobile.
3. Observer le comportement de l’agent
Quand vous invoquez l’agent, observez comment il :
- Raisonne : Planifie les étapes nécessaires
- Agit : Appelle les outils appropriés
- Synthétise : Combine les informations pour donner une réponse complète
C’est le cycle Reasoning → Acting → Observing des agents IA.
Déploiement sur AWS
Maintenant que l’agent fonctionne localement, déployons-le sur AWS avec AgentCore Runtime.
1. Configurer l’agent pour le déploiement
Arrêtez le serveur local (Ctrl+C) et exécutez :
agentcore configure --entrypoint src/agent/agent_level_one_triage.py
Questions posées par le CLI :
-
Auto-create IAM execution role? → Appuyez sur Entrée (Yes)
- Crée automatiquement un rôle IAM avec les permissions nécessaires
-
Auto-create ECR repository? → Appuyez sur Entrée (Yes)
- Crée un repository Amazon ECR pour stocker l’image Docker
-
Dependency file detected → Appuyez sur Entrée (Confirm)
- Utilise requirements.txt pour installer les dépendances
Cette commande crée un fichier .bedrock_agentcore.yaml avec la configuration :
default_agent: agent_level_one_triage
agents:
agent_level_one_triage:
name: agent_level_one_triage
entrypoint: src/agent/agent_level_one_triage.py
platform: linux/arm64
container_runtime: docker
aws:
account: 'VOTRE-ACCOUNT-ID'
region: eu-central-1
ecr_auto_create: true
execution_role_auto_create: true
network_configuration:
network_mode: PUBLIC
observability:
enabled: true
2. Activer l’observabilité avec CloudWatch
Pour activer la livraison de traces, configurez Transaction Search dans CloudWatch :
# Activer CloudWatch Logs pour les traces
aws xray update-trace-segment-destination --destination CloudWatchLogs
# Configurer le taux d'échantillonnage (1% ici)
aws xray update-indexing-rule --name "Default" --rule '{"Probabilistic": {"DesiredSamplingPercentage": 1}}'
Vérifiez la configuration :
aws xray get-trace-segment-destination
aws xray get-indexing-rules
3. Déployer l’agent
Lancez le déploiement :
agentcore launch
Ce que fait cette commande :
- Build : Construit l’image Docker de votre agent
- Push : Pousse l’image vers Amazon ECR
- Deploy : Crée l’infrastructure AgentCore Runtime :
- Environnement serverless isolé
- Configuration réseau (mode PUBLIC)
- Rôles IAM avec permissions Bedrock
- Endpoints pour l’invocation
Le déploiement prend généralement 2-3 minutes.
Vous verrez :
Building agent...
Pushing to ECR...
Deploying to AgentCore Runtime...
✓ Agent deployed successfully!
Endpoint: https://xxxxxx.execute-api.eu-central-1.amazonaws.com/prod/invoke
Invocation de l’agent
Une fois déployé, invoquez l’agent depuis n’importe où.
1. Vérifier le statut
agentcore status
Devrait afficher :
Agent: agent_level_one_triage
Status: ACTIVE
Endpoint: https://xxxxxx.execute-api.eu-central-1.amazonaws.com/prod/invoke
Region: eu-central-1
2. Invoquer l’agent déployé
Sans le flag --local, les commandes utilisent l’endpoint AWS :
agentcore invoke '{"prompt": "Analyze ticket INC0001234 and provide a resolution"}'
L’agent s’exécute maintenant sur AWS AgentCore Runtime !
3. Exemple d’utilisation complète
Testons un scénario complet :
agentcore invoke '{
"prompt": "Analyze this ticket: {\"number\": \"INC0001236\", \"short_description\": \"Email sync issues on iPhone\", \"description\": \"User cannot sync email on iPhone 14\", \"priority\": \"3\", \"state\": \"1\"}. Find relevant KB articles and update the ticket with the solution."
}'
L’agent va :
- ✅ Parser les données du ticket INC0001236 avec
parse_ticket_data() - ✅ Identifier le problème (email sync sur iPhone)
- ✅ Rechercher dans la KB avec
search_knowledge_base()→ trouve KB0003 - ✅ Mettre à jour ServiceNow avec
update_servicenow_ticket()avec les étapes de résolution - ✅ Retourner une réponse professionnelle et structurée
Observabilité
Consulter les logs
AgentCore Runtime intègre automatiquement avec CloudWatch Logs.
Via AWS CLI :
# Trouver le nom du log group
agentcore status
# Voir les derniers logs (remplacez ID_DU_LOG_GROUP par l'ID affiché dans status)
aws logs tail /aws/lambda/bedrock-agentcore-agent_level_one_triage-ID_DU_LOG_GROUP --follow
# Ou lister tous les log groups pour trouver celui de votre agent
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/bedrock-agentcore
Via la console AWS :
- Ouvrez CloudWatch dans la console AWS
- Allez dans Logs > Log groups
- Cherchez le log group :
/aws/lambda/bedrock-agentcore-agent_level_one_triage - Explorez les logs d’exécution
Traces X-Ray (si configuré)
Si vous avez activé X-Ray Transaction Search, vous pouvez :
- Visualiser les traces d’exécution
- Voir les appels aux outils
- Analyser les performances
- Déboguer les erreurs
Nous approfondirons l’observabilité dans l’Article 4.
Résumé et bonnes pratiques
Ce que nous avons accompli 🎉
✅ Créé un agent de support intelligent pour ServiceNow ✅ Défini 3 outils personnalisés :
parse_ticket_data: Parse les données de tickets reçuessearch_knowledge_base: Recherche dans la KBupdate_servicenow_ticket: Met à jour les tickets ✅ Testé l’agent localement avecagentcore launch --local✅ Déployé l’agent sur AWS avecagentcore launch✅ Invoqué l’agent via le CLI ✅ Configuré l’observabilité de base
Bonnes pratiques
1. Développement itératif
Toujours suivre ce cycle :
Développer localement → Tester localement → Déployer → Tester en prod
2. System Prompt
- Soyez précis sur le rôle de l’agent
- Donnez des exemples de comportement attendu
- Itérez sur le prompt basé sur les résultats
3. Outils (Tools)
- Gardez les outils simples et focalisés
- Retournez toujours du JSON structuré
- Incluez une gestion d’erreur robuste
4. Tests
Testez différents scénarios :
- Cas nominaux (ticket existe, KB trouve une solution)
- Cas d’erreur (ticket inexistant, pas de solution)
- Cas edge (requêtes ambiguës, multiples solutions possibles)
Dépannage
L’agent ne trouve pas le modèle
Erreur : Model eu.amazon.nova-lite-v1:0 not found
Solution :
- Vérifiez que vous avez accès à Amazon Bedrock dans eu-central-1
- Activez le modèle Nova Lite dans la console Bedrock
- Vérifiez les permissions IAM pour invoquer le modèle
Erreur de permissions IAM
Erreur : AccessDeniedException
Solution : Le rôle IAM créé automatiquement doit avoir :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:eu-central-1::foundation-model/amazon.nova-lite-v1:0"
}
]
}
Prochaines étapes
Dans le prochain article (Article 2), nous allons :
🔜 Implémenter l’architecture webhook complète (ServiceNow → API Gateway → Lambda → Agent) 🔜 Créer un client API ServiceNow pour les mises à jour en temps réel 🔜 Déployer l’infrastructure avec AWS CDK (API Gateway + Lambda + Secrets Manager) 🔜 Configurer ServiceNow Business Rules pour déclencher les webhooks 🔜 Implémenter un flux de tickets de bout en bout :
- ServiceNow envoie les données de ticket via webhook
- Lambda invoque l’agent avec les données
- Agent analyse et met à jour ServiceNow directement 🔜 Créer une suite de tests complète
Branche Git : step-02-gateway-servicenow
Ressources
Documentation
Code source
- Repository GitHub
- Branch :
step-01-runtime-deployment
Conclusion
Félicitations ! 🎉 Vous avez déployé votre premier agent intelligent avec AWS AgentCore Runtime.
Récapitulatif :
- Vous avez compris les concepts d’AgentCore Runtime
- Créé un agent avec 3 outils ServiceNow :
parse_ticket_data: Parse les données de ticketssearch_knowledge_base: Recherche de solutionsupdate_servicenow_ticket: Mise à jour de tickets
- Testé localement puis déployé sur AWS
- Invoqué l’agent en production
L’approche progressive :
- Article 1 (ce tutoriel) : Agent fonctionnel avec parsing de données
- Article 2 : Architecture webhook complète + API ServiceNow réelle + Infrastructure AWS CDK
- Articles 3-X : Fonctionnalités avancées (Mémoire, KB, Observability, Identity)
Cette approche vous permet de valider rapidement le concept avant d’investir dans l’infrastructure complète. L’agent est déjà conçu pour recevoir des données de tickets en entrée, ce qui facilite l’intégration webhook dans l’Article 2.