Déploiement direct du code pour Node.js
Le déploiement direct du code vous permet d'intégrer votre Node.js-based agent à Amazon Bedrock AgentCore Runtime simplement en regroupant le code de l'agent et ses dépendances dans une archive de fichier .zip. Votre agent doit toujours respecter les exigences AgentCore d'exécution : disposer d'un .js fichier de point d'entrée qui implémente les points de terminaison des serveurs /invocations POST et /ping GET.
Vous pouvez inclure les dépendances telles qu'elles sont fournies node_modules/ dans votre fichier ZIP ou sous forme de fichier unique fourni par esbuild. .js
Conditions préalables
Avant de commencer, assurez-vous de disposer des éléments suivants :
-
AWS Compte avec informations d'identification configurées. Pour configurer vos AWS informations d'identification, consultez la section Configuration et paramètres des fichiers d'identification dans la AWS CLI.
-
Node.js
et npm installés. Nous vous recommandons d'installer la même version majeure que celle que vous prévoyez de déployer sur AgentCore Runtime (par exemple, Node.js 22 pour le NODE_22runtime). Pour les versions prises en charge, consultez la section Exécutions linguistiques prises en charge. -
AWS Autorisations : pour créer et déployer un agent, vous devez disposer des autorisations appropriées. Pour plus d'informations, consultez la section Autorisations AgentCore d'exécution.
-
Accès au modèle : Anthropic Claude Sonnet 4.0 activé dans la console Amazon Bedrock. Pour plus d'informations sur l'utilisation d'un modèle différent avec les Strands Agents, consultez la section Fournisseurs de modèles dans la documentation du SDK Strands Agents
.
Étape 1 : Configuration du projet et installation des dépendances
Initialisez votre projet à l'aide des commandes suivantes :
mkdir agentcore_runtime_node_deploy cd agentcore_runtime_node_deploy npm init -y
Exécutez éventuellement npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation pour activer les traces d' AgentCore observabilité d'Amazon Bedrock.
Étape 2 : Créez votre code d'agent
Créez le point d'entrée de votre agent. Votre agent doit implémenter le contrat HTTP AgentCore Runtime avec un point de terminaison de santé /ping GET et un gestionnaire /invocations POST.
Exemple
Étape 3 : Tester localement
Assurez-vous que le port 8080 est libre avant de démarrer. Voir Port 8080 en cours d'utilisation (local uniquement) dans Problèmes courants et solutions.
Ouvrez une fenêtre de terminal et lancez votre agent :
Exemple
Étape 4 : Activez l'observabilité pour votre agent
Amazon Bedrock AgentCore Observability vous permet de suivre, de déboguer et de surveiller les agents que vous hébergez dans Runtime. AgentCore Activez d'abord CloudWatch Transaction Search en suivant les instructions de la section Activer l'observabilité du AgentCore runtime Amazon Bedrock. Pour observer votre agent, consultez Afficher les données d'observabilité de vos agents Amazon Bedrock AgentCore .
Pour activer l'instrumentation automatique pour votre Node.js agent, ajoutez le package ADOT :
npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation
Important
L'auto-instrumentation ADOT fonctionne en appliquant des correctifs aux Node.js require() appels lors de l'exécution. Cela signifie qu'il n'est compatible qu'avec la sortie du module CommonJS. Si vous compilez TypeScript avec --module nodenext ou --module esnext (en produisant des import instructions ESM), l'instrumentation ADOT échoue silencieusement et aucune trace n'est émise. Pour utiliser ADOT, compilez avec --module commonjs ou utilisez esbuild with --platform=node (qui préserve les require() appels aux modules Node.js intégrés).
Lors du déploiement, node_modules/ incluez-le dans votre ZIP et utilisez le opentelemetry-instrument préfixe dans votre point d'entrée (voir étape 5).
Étape 5 : Déployer vers AgentCore Runtime et invoquer
Note
AgentCore Le moteur d'exécution n'exécute pas les fichiers TypeScript (.ts) de manière native. Vous devez effectuer une transpilation JavaScript avant TypeScript de procéder au déploiement. Pour plus d'informations, consultez Travailler avec TypeScript .
Créez un fichier .zip avec le code de votre agent et ses dépendances. AgentCore Runtime ne prend en charge que l'architecture du jeu d'instructions arm64. Assurez-vous que tous les modules natifs (.nodefichiers) sont compilés pour arm64.
Exemple
Note
. La taille maximale d'un package de déploiement .zip pour AgentCore Runtime est de 250 Mo (compressé) et de 750 Mo (décompressé). Notez que cette limite s'applique à la taille combinée de tous les fichiers que vous téléchargez. Le AgentCore Runtime a besoin d'une autorisation pour lire les fichiers de votre package de déploiement. Dans la notation octale des autorisations Linux, AgentCore Runtime a besoin de 644 autorisations pour les fichiers non exécutables (rw-r—r--) et de 755 autorisations (rwxr-xr-x) pour les répertoires et les fichiers exécutables. Sous Linux et macOS, utilisez la commande chmod pour modifier les autorisations de fichiers sur les fichiers et les répertoires de votre package de déploiement. Par exemple, pour attribuer les autorisations appropriées à un fichier non exécutable, exécutez la commande suivante,chmod 644 <filepath>. Pour modifier les autorisations relatives aux fichiers dans Windows, voir Définir, afficher, modifier ou supprimer des autorisations sur un objet
Une archive ZIP contenant des dépendances Linux arm64 doit être téléchargée sur S3 comme condition préalable à Create Agent Runtime. Le code ci-dessous nécessite que le compartiment S3 spécifié existe déjà. Veuillez suivre la AWS documentation ici pour créer un bucket. Le TypeScript code suivant téléchargera l'archive de fichiers .zip dans S3 et créera un environnement d'exécution Amazon Bedrock AgentCore .
import { readFileSync } from "node:fs"; import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { BedrockAgentCoreControlClient, CreateAgentRuntimeCommand, } from "@aws-sdk/client-bedrock-agentcore-control"; const accountId = "your-aws-account-id"; const agentName = "nodejs_agent"; const region = "us-west-2"; const bucketName = `bedrock-agentcore-code-${accountId}-${region}`; const s3Client = new S3Client({ region }); console.log("Uploading deployment_package.zip to S3..."); await s3Client.send(new PutObjectCommand({ Bucket: bucketName, Key: `${agentName}/deployment_package.zip`, Body: readFileSync("deployment_package.zip"), ExpectedBucketOwner: accountId, })); console.log(`Upload completed. S3 location: s3://${bucketName}/${agentName}/deployment_package.zip`); const controlClient = new BedrockAgentCoreControlClient({ region }); const response = await controlClient.send(new CreateAgentRuntimeCommand({ agentRuntimeName: agentName, agentRuntimeArtifact: { codeConfiguration: { code: { s3: { bucket: bucketName, prefix: `${agentName}/deployment_package.zip`, }, }, runtime: "NODE_22", entryPoint: ["dist/app.js"], }, }, networkConfiguration: { networkMode: "PUBLIC" }, roleArn: `arn:aws:iam::${accountId}:role/AmazonBedrockAgentCoreSDKRuntime-${region}`, lifecycleConfiguration: { idleRuntimeSessionTimeout: 300, maxLifetime: 1800, }, })); console.log(`Agent Runtime created successfully!`); console.log(`Agent Runtime ARN: ${response.agentRuntimeArn}`); console.log(`Status: ${response.status}`);
Pour activer l'auto-instrumentation OTEL, node_modules/@aws/aws-distro-opentelemetry-node-autoinstrumentation/ incluez-le dans votre ZIP et utilisez le opentelemetry-instrument préfixe dans le point d'entrée :
entryPoint: ["opentelemetry-instrument", "dist/app.js"],
Pour appeler un agent sur Amazon Bedrock AgentCore Runtime par programmation, reportez-vous à : Invoquer un agent par programmation
Étape 6 : arrêt de session, mise à jour ou nettoyage
TypeScript Le code suivant mettra à jour un AgentCore Runtime. Téléchargez le nouveau package de déploiement sur S3, puis appelez UpdateAgentRuntimeCommand :
import { readFileSync } from "node:fs"; import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { BedrockAgentCoreControlClient, UpdateAgentRuntimeCommand, } from "@aws-sdk/client-bedrock-agentcore-control"; const accountId = "your-aws-account-id"; const agentName = "nodejs_agent"; const region = "us-west-2"; const bucketName = `bedrock-agentcore-code-${accountId}-${region}`; const s3Client = new S3Client({ region }); console.log("Uploading deployment_package.zip to S3..."); await s3Client.send(new PutObjectCommand({ Bucket: bucketName, Key: `${agentName}/deployment_package.zip`, Body: readFileSync("deployment_package.zip"), ExpectedBucketOwner: accountId, })); console.log("Upload completed successfully!"); const controlClient = new BedrockAgentCoreControlClient({ region }); const response = await controlClient.send(new UpdateAgentRuntimeCommand({ agentRuntimeId: "<your-agent-runtime-id>", agentRuntimeArtifact: { codeConfiguration: { code: { s3: { bucket: bucketName, prefix: `${agentName}/deployment_package.zip`, }, }, runtime: "NODE_22", entryPoint: ["dist/app.js"], }, }, networkConfiguration: { networkMode: "PUBLIC" }, roleArn: `arn:aws:iam::${accountId}:role/AmazonBedrockAgentCoreSDKRuntime-${region}`, })); console.log(`Agent Runtime updated successfully!`); console.log(`Agent Runtime ARN: ${response.agentRuntimeArn}`); console.log(`Status: ${response.status}`);
Pour arrêter la session en cours avant la configuration IdleRuntimeSessionTimeout (15 minutes par défaut) et économiser sur d'éventuels coûts supplémentaires, utilisez le code suivant :
import { BedrockAgentCoreClient, StopRuntimeSessionCommand, } from "@aws-sdk/client-bedrock-agentcore"; const region = "us-west-2"; const dataClient = new BedrockAgentCoreClient({ region }); const response = await dataClient.send(new StopRuntimeSessionCommand({ agentRuntimeArn: "arn:aws:bedrock-agentcore:us-west-2:<account-id>:runtime/<agent-runtime-id>", runtimeSessionId: "<your-session-id>", qualifier: "DEFAULT", })); console.log("Session stopped successfully!");
TypeScript Le code suivant supprimera un environnement d' AgentCore exécution Amazon Bedrock et le fichier d'archive .zip dans S3.
import { S3Client, DeleteObjectCommand } from "@aws-sdk/client-s3"; import { BedrockAgentCoreControlClient, DeleteAgentRuntimeCommand, } from "@aws-sdk/client-bedrock-agentcore-control"; const accountId = "your-aws-account-id"; const agentName = "nodejs_agent"; const region = "us-west-2"; const bucketName = `bedrock-agentcore-code-${accountId}-${region}`; const controlClient = new BedrockAgentCoreControlClient({ region }); console.log("Deleting Agent from Amazon Bedrock AgentCore Runtime!"); const response = await controlClient.send(new DeleteAgentRuntimeCommand({ agentRuntimeId: "<your-agent-runtime-id>", })); console.log(`Agent Runtime deleted successfully!`); console.log(`Status: ${response.status}`); const s3Client = new S3Client({ region }); console.log("Deleting deployment archive from S3..."); await s3Client.send(new DeleteObjectCommand({ Bucket: bucketName, Key: `${agentName}/deployment_package.zip`, ExpectedBucketOwner: accountId, })); console.log("Archive deleted successfully from S3!");
Node.js-specific concepts pour le déploiement direct de code
Découvrez les Node.js-specific concepts liés à l'utilisation du déploiement direct de code avec Amazon Bedrock AgentCore Runtime.
Rubriques
AgentCore Runtime for Node.js n'accepte que les points .js d'entrée. TypeScript les fichiers (.ts) ne sont pas acceptés directement. Vous devez les transpiler JavaScript avant de les emballer. Nous vous recommandons d'utiliser esbuildnpm install -D esbuild.
Les points d'entrée peuvent se trouver dans des sous-répertoires. Par exemple, src/app.js ou dist/index.js sont des points d'entrée valides. Node.js module resolution parcourt l'arborescence des répertoires depuis l'emplacement du point d'entrée, de sorte que les dépendances node_modules/ situées à la racine de votre fichier ZIP sont détectées automatiquement. Aucune NODE_PATH configuration n'est nécessaire.
Lorsque vous spécifiez un point d'entrée de sous-répertoire, assurez-vous que le chemin entryPoint de votre configuration correspond au chemin du fichier ZIP.
Il existe deux approches pour empaqueter les dépendances des Node.js agents :
Dépendances liées au fournisseur (les plus simples) :
Incluez node_modules/ directement dans votre ZIP à côté de votre point d'entrée :
npm install --production zip -r my-agent.zip app.js node_modules/ package.json
Cela produit un fichier ZIP dont la structure est la suivante :
my-agent.zip ├── app.js ├── package.json └── node_modules/
Fourni avec esbuild (le plus petit ZIP) :
Utilisez esbuild
npx esbuild app.js --bundle --platform=node --target=node22 --outfile=bundle.js zip my-agent.zip bundle.js
Cela produit un ZIP minimal :
my-agent.zip └── bundle.js
Les deux approches fonctionnent. Les déploiements groupés ont généralement une taille inférieure à 10 Mo et sont déployés plus rapidement. Les déploiements fournis par des fournisseurs sont plus simples et ne nécessitent pas d'étape de construction, mais ils peuvent être plus importants.
AgentCore Runtime ne prend en charge que l'architecture du jeu d'instructions arm64. Si votre agent utilise des packages npm qui incluent des modules natifs (compilés .node ou .so fichiers), ces binaires doivent être compilés pour Linux arm64.
AgentCore Runtime valide l'architecture de tous les .so fichiers .node de votre package de déploiement en lisant leurs en-têtes ELF. Si un binaire est compilé pour une architecture différente (telle que x86_64 ou macOS), la création de votre agent échouera avec le statut. CREATE_FAILED
Pour installer des modules natifs compatibles avec arm64 :
-
Installer les dépendances sur une machine arm64 (telle qu'une instance AWS Graviton-based Amazon EC2)
-
Utilisez des npm
--archet des--platformdrapeaux :npm install --arch=arm64 --platform=linux -
Utilisez esbuild pour regrouper votre code si le module natif peut être évité lors de l'exécution
Les packages npm les plus populaires (Express, Axios, Fastify, Hono, ws) sont purs JavaScript et ne contiennent pas de modules natifs.
AgentCore Runtime n'exécute pas TypeScript les fichiers directement. Vous devez compiler votre code TypeScript source JavaScript avant de procéder au déploiement. Il s'agit du même modèle que celui utilisé par AWS Lambda.
À l'aide du TypeScript compilateur (tsc) :
npm install -g typescript npx tsc --init --target ES2022 --module commonjs --outDir ./dist npx tsc
Ensuite, empaquetez la sortie compilée :
cd dist zip -r ../deployment_package.zip .
Lors de la création de l'agent, définissez le point d'entrée du .js fichier compilé (par exemple, app.js ou dist/app.js en fonction de votre structure ZIP).
En utilisant esbuild (recommandé pour un empaquetage plus simple) :
npx esbuild app.ts --bundle --platform=node --target=node22 --outfile=app.js zip deployment_package.zip app.js
esbuild compile TypeScript et regroupe les dépendances en une seule étape, produisant ainsi un petit fichier autonome. .js
Si vous package.json incluez un engines.node champ, AgentCore Runtime valide que la plage spécifiée est compatible avec la Node.js version que vous avez sélectionnée (par exemple, Node.js 22 lorsque vous utilisez le NODE_22 runtime). Si la plage exclut cette version, la création de votre agent échouera avec le statutCREATE_FAILED.
Par exemple, les engines déclarations suivantes sont compatibles avec Node.js 22 :
{ "engines": { "node": ">=18" } } { "engines": { "node": ">=14 <18 || >=20" } } { "engines": { "node": "22" } }
Les déclarations suivantes sont incompatibles et entraîneront l'échec de la création de l'agent :
{ "engines": { "node": "<18" } } { "engines": { "node": ">=14 <18" } }
AgentCore Runtime vérifie également engines.node dans le champ les dépendances courantes de votrenode_modules/. Si l'un d'entre eux déclare une plage de Node.js versions qui exclut la version d'exécution cible, la création de l'agent échouera.
Si vous rencontrez une engines.node incompatibilité, mettez à jour le package vers une version compatible avec votre Node.js version cible ou supprimez le engines champ de votrepackage.json. Pour les Node.js versions prises en charge, consultez la section Exécutions linguistiques prises en charge.