Node.js에 대한 직접 코드 배포
직접 코드 배포를 사용하면 에이전트 코드와 해당 종속성을 .zip 파일 아카이브에 패키징하여 간단히 Node.js 기반 에이전트를 Amazon Bedrock AgentCore 런타임으로 가져올 수 있습니다. 에이전트는 여전히 AgentCore 런타임 요구 사항을 따라야 합니다. /invocations POST 및 /ping GET 서버 엔드포인트를 구현하는 진입점 .js 파일이 있어야 합니다.
종속성을 ZIPnode_modules/에 공급업체로 제공되거나 esbuild 번들 단일 .js 파일로 포함할 수 있습니다.
사전 조건
시작하기 전에 다음을 갖추었는지 확인하세요.
-
AWS 자격 증명이 구성된 계정입니다. AWS 자격 증명을 구성하려면 AWS CLI의 구성 및 자격 증명 파일 설정을 참조하세요.
-
Node.js
및 npm이 설치되었습니다. AgentCore 런타임에 배포하려는 것과 동일한 메이저 버전을 설치하는 것이 좋습니다(예: 런타임의 경우 Node.js 22 NODE_22). 지원되는 버전은 지원되는 언어 런타임을 참조하세요. -
AWS 권한: 에이전트를 생성하고 배포하려면 적절한 권한이 있어야 합니다. 자세한 내용은 AgentCore 런타임 권한을 참조하세요.
-
모델 액세스: Amazon Bedrock 콘솔에서 Anthropic Claude Sonnet 4.0이 활성화되었습니다. Strands 에이전트와 함께 다른 모델을 사용하는 방법에 대한 자세한 내용은 Strands 에이전트 SDK
설명서의 모델 공급자 섹션을 참조하세요.
1단계: 프로젝트 설정 및 종속성 설치
다음 명령을 사용하여 프로젝트를 초기화합니다.
mkdir agentcore_runtime_node_deploy cd agentcore_runtime_node_deploy npm init -y
선택적으로를 실행npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation하여 Amazon Bedrock AgentCore 관찰성 추적을 활성화합니다.
2단계: 에이전트 코드 생성
에이전트 진입점을 생성합니다. 에이전트는 /ping GET 상태 엔드포인트 및 /invocations POST 핸들러와 함께 AgentCore 런타임 HTTP 계약을 구현해야 합니다.
예
3단계: 로컬에서 테스트
시작하기 전에 포트 8080이 사용 가능한지 확인합니다. 일반적인 문제 및 솔루션의 사용 중인 포트 8080(로컬 전용)을 참조하세요.
터미널 창을 열고 에이전트를 시작합니다.
예
4단계: 에이전트에 대한 관찰성 활성화
Amazon Bedrock AgentCore 관찰성을 사용하면 AgentCore 런타임에서 호스팅하는 에이전트를 추적, 디버깅 및 모니터링할 수 있습니다. 먼저 Amazon Bedrock AgentCore 런타임 관찰성 활성화의 지침에 따라 CloudWatch 트랜잭션 검색을 활성화합니다. 에이전트를 관찰하려면 Amazon Bedrock AgentCore 에이전트의 관찰성 데이터 보기를 참조하세요.
Node.js 에이전트에 대해 자동 계측을 활성화하려면 ADOT 패키지를 추가합니다.
npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation
중요
ADOT 자동 계측은 런타임 시 Node.js require() 호출을 패치하여 작동합니다. 즉, CommonJS 모듈 출력과만 호환됩니다. --module nodenext 또는 --module esnext (EMS import 문 생성)를 사용하여 TypeScript를 컴파일하면 ADOT 계측이 자동으로 실패하고 트레이스가 생성되지 않습니다. ADOT를 사용하려면를 사용하여 컴파일--module commonjs하거나를 사용하여 esbuild를 사용합니다--platform=node(Node.js 기본 제공 모듈에 대한 require() 호출 보존).
배포할 때 ZIPnode_modules/에를 포함하고 진입점에 opentelemetry-instrument 접두사를 사용합니다(5단계 참조).
5단계: AgentCore 런타임에 배포 및 호출
참고
AgentCore 런타임은 기본적으로 TypeScript(.ts) 파일을 실행하지 않습니다. 배포하기 전에 TypeScript를 JavaScript로 트랜스파일해야 합니다. 자세한 내용은 TypeScript에서 작업 단원을 참조하십시오.
에이전트 코드 및 종속성을 사용하여 .zip 파일을 생성합니다. AgentCore 런타임은 arm64 명령 세트 아키텍처만 지원합니다. 네이티브 모듈(.node 파일)이 arm64용으로 컴파일되었는지 확인합니다.
예
참고
. AgentCore 런타임에 대한 .zip 배포 패키지의 최대 크기는 250MB(압축) 및 750MB(압축 해제)입니다. 이 제한은 업로드하는 모든 파일의 결합된 크기에 적용됩니다. AgentCore 런타임에는 배포 패키지의 파일을 읽을 수 있는 권한이 필요합니다. Linux 권한 8진수 표기법에서 AgentCore 런타임에는 실행 불가능한 파일에 대한 644개의 권한(rw-r—r--)과 디렉터리 및 실행 파일에 대한 755개의 권한(rwxr-xr-x)이 필요합니다. Linux 및 MacOS에서는 chmod 명령을 사용하여 배포 패키지의 파일 및 디렉터리에 대한 파일 권한을 변경합니다. 예를 들어 실행 불가능한 파일에 올바른 권한을 부여하려면 명령을 실행합니다chmod 644 <filepath>. Windows에서 파일 권한을 변경하려면 Microsoft Windows 설명서의 Set, View, Change, or Remove Permissions on an Object
에이전트 런타임 생성을 위한 사전 조건으로 Linux arm64 종속성이 포함된 ZIP 아카이브를 S3에 업로드해야 합니다. 아래 코드를 사용하려면 지정된 S3 버킷이 이미 있어야 합니다. 여기의 AWS 설명서에 따라 버킷을 생성하십시오. 다음 TypeScript 코드는 .zip 파일 아카이브를 S3에 업로드하고 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}`);
OTEL 자동 계측을 활성화하려면 ZIPnode_modules/@aws/aws-distro-opentelemetry-node-autoinstrumentation/에를 포함하고 진입점에 opentelemetry-instrument 접두사를 사용합니다.
entryPoint: ["opentelemetry-instrument", "dist/app.js"],
Amazon Bedrock AgentCore 런타임에서 프로그래밍 방식으로 에이전트를 호출하려면 다음을 참조하세요. 에이전트를 프로그래밍 방식으로 호출
6단계: 세션 중지, 업데이트 또는 정리
다음 TypeScript 코드는 AgentCore 런타임을 업데이트합니다. 새 배포 패키지를 S3에 업로드한 다음 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}`);
구성 가능한 IdleRuntimeSessionTimeout (기본값은 15분) 이전에 실행 중인 세션을 중지하고 잠재적 런어웨이 비용을 절감하려면 다음 코드를 사용합니다.
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 코드는 S3에서 Amazon Bedrock AgentCore 런타임과 .zip 아카이브 파일을 삭제합니다.
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별 개념
Amazon Bedrock AgentCore 런타임에서 직접 코드 배포를 사용할 때 Node.js 관련 개념에 대해 알아봅니다.
주제
Node.js용 AgentCore 런타임은 .js 진입점만 허용합니다. TypeScript 파일(.ts)은 직접 허용되지 않으므로 패키징하기 전에 JavaScript로 트랜스파일해야 합니다. esbuildnpm install -D esbuild.
진입점은 하위 디렉터리에 있을 수 있습니다. 예를 들어 src/app.js 또는 dist/index.js는 유효한 진입점입니다. Node.js 모듈 해상도는 진입점 위치에서 디렉터리 트리를 안내하므로 ZIP의 루트node_modules/에 있는의 종속성을 자동으로 찾을 수 있으므로 NODE_PATH 구성이 필요하지 않습니다.
하위 디렉터리 진입점을 지정할 때 entryPoint 구성의 경로가 ZIP 파일 내의 경로와 일치하는지 확인합니다.
Node.js 에이전트의 종속성을 패키징하는 방법에는 두 가지가 있습니다.
공급업체 종속성(단순):
진입점과 함께 ZIP에 node_modules/ 직접 포함시킵니다.
npm install --production zip -r my-agent.zip app.js node_modules/ package.json
이렇게 하면 다음 구조의 ZIP가 생성됩니다.
my-agent.zip ├── app.js ├── package.json └── node_modules/
esbuild(가장 작은 ZIP)와 번들링됨:
esbuild
npx esbuild app.js --bundle --platform=node --target=node22 --outfile=bundle.js zip my-agent.zip bundle.js
이렇게 하면 최소한의 ZIP이 생성됩니다.
my-agent.zip └── bundle.js
두 접근 방식 모두 작동합니다. 번들 배포는 일반적으로 10MB 미만이며 더 빠르게 배포됩니다. 공급업체 배포는 더 간단하며 빌드 단계가 필요하지 않지만 더 클 수 있습니다.
AgentCore 런타임은 arm64 명령 세트 아키텍처만 지원합니다. 에이전트가 네이티브 모듈(컴파일된 .node 또는 .so 파일)이 포함된 npm 패키지를 사용하는 경우 Linux arm64에 대해 해당 바이너리를 컴파일해야 합니다.
AgentCore 런타임은 ELF 헤더를 읽어 배포 패키지에 있는 모든 .node 및 .so 파일의 아키텍처를 검증합니다. 바이너리가 다른 아키텍처(예: x86_64 또는 macOS)에 대해 컴파일된 경우 에이전트 생성이 실패하고 상태가 CREATE_FAILED 됩니다.
arm64 호환 네이티브 모듈을 설치하려면:
-
arm64 시스템에 종속성 설치(예: AWS Graviton 기반 Amazon EC2 인스턴스)
-
npm
--arch및--platform플래그를 사용합니다.npm install --arch=arm64 --platform=linux -
런타임 시 네이티브 모듈을 피할 수 있는 경우 esbuild를 사용하여 코드 번들링
널리 사용되는 대부분의 npm 패키지(Express, Axios, Fastify, Hono, ws)는 순수 JavaScript이며 네이티브 모듈을 포함하지 않습니다.
AgentCore 런타임은 TypeScript 파일을 직접 실행하지 않습니다. 배포하기 전에 TypeScript 소스 코드를 JavaScript로 컴파일해야 합니다. 이는 AWS Lambda에서 사용하는 것과 동일한 패턴입니다.
TypeScript 컴파일러(tsc) 사용:
npm install -g typescript npx tsc --init --target ES2022 --module commonjs --outDir ./dist npx tsc
그런 다음 컴파일된 출력을 패키징합니다.
cd dist zip -r ../deployment_package.zip .
에이전트를 생성할 때 진입점을 컴파일된 .js 파일로 설정합니다(예: app.js 또는 ZIP 구조에 dist/app.js 따라 다름).
esbuild 사용(더 간단한 패키징에 권장):
npx esbuild app.ts --bundle --platform=node --target=node22 --outfile=app.js zip deployment_package.zip app.js
esbuild는 TypeScript를 컴파일하고 종속성을 단일 단계로 번들링하여 작은 독립형 .js 파일을 생성합니다.
에 engines.node 필드가 package.json 포함된 경우 AgentCore 런타임은 지정된 범위가 선택한 Node.js 버전과 호환되는지 확인합니다(예: NODE_22 런타임 사용 시 Node.js 22). 범위가 해당 버전을 제외하면 에이전트 생성이 실패하고 상태가 CREATE_FAILED 됩니다.
예를 들어 다음 engines 선언은 Node.js 22와 호환됩니다.
{ "engines": { "node": ">=18" } } { "engines": { "node": ">=14 <18 || >=20" } } { "engines": { "node": "22" } }
다음 선언은 호환되지 않으므로 에이전트 생성이 실패합니다.
{ "engines": { "node": "<18" } } { "engines": { "node": ">=14 <18" } }
또한 AgentCore 런타임은 engines.node 필드에 node_modules/의 일반적인 종속성이 있는지 확인합니다. 이 중 하나라도 대상 런타임 버전을 제외하는 Node.js 버전 범위를 선언하면 에이전트 생성이 실패합니다.
비engines.node호환성이 발생하는 경우 패키지를 대상 Node.js 버전을 지원하는 버전으로 업데이트하거나 package.json에서 engines 필드를 제거합니다. 지원되는 Node.js 버전은 지원되는 언어 런타임을 참조하세요.