콘텐츠로 이동

AgentCore Gateway에서 Agent로

connection 제너레이터는 에이전트(TypeScript 또는 Python)를 protocol: http로 생성된 AgentCore GatewayAgentCore Runtime 대상으로 등록할 수 있습니다.

연결되면 Gateway는 <gatewayUrl>/<targetName>/invocations 경로로 에이전트에 대한 요청을 프록시하며, IAM SigV4로 런타임에 대한 아웃바운드 트래픽에 서명합니다. 이를 통해 에이전트에 단일 거버넌스 진입점을 제공하며, 호출자는 Gateway에만 도달하면 되므로 에이전트 런타임 자체는 그 뒤의 VPC 내부에 배포할 수 있습니다.

이 제너레이터를 사용하기 전에 다음을 확인하세요:

  1. protocol: http로 생성된 agentcore-gateway 프로젝트
  2. infra: agentcore로 생성된 에이전트 컴포넌트(ts#agent 또는 py#agent). auth: iam(Gateway가 자체 역할로 호출) 또는 auth: cognito(Gateway가 호출자의 JWT를 전달 — 런타임에 호출자 ID 전달 참조) 모두 작동합니다.
Terminal window
pnpm nx g @aws/nx-plugin:connection
어떤 파일이 변경될지 확인하기 위해 드라이 런을 수행할 수도 있습니다
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Gateway 프로젝트를 소스로, 에이전트 프로젝트를 대상으로 선택합니다. 에이전트 프로젝트에 여러 컴포넌트가 포함된 경우 targetComponent를 지정하여 명확히 구분하세요.

매개변수타입기본값설명
sourceProject 필수string-소스 프로젝트
targetProject 필수string-연결할 대상 프로젝트
sourceComponent string-연결을 시작할 소스 컴포넌트 (컴포넌트 이름, 소스 프로젝트 루트 기준 상대 경로, 또는 generator id). 프로젝트를 소스로 명시적으로 선택하려면 '.'을 사용하세요.
targetComponent string-연결할 대상 컴포넌트 (컴포넌트 이름, 대상 프로젝트 루트 기준 상대 경로, 또는 generator id). 프로젝트를 대상으로 명시적으로 선택하려면 '.'을 사용하세요.
preferInstallDependencies booleantrue생성기 실행 후 의존성 설치를 선호할지 여부입니다. 여러 생성기를 일괄 처리할 때 설치를 연기하려면 false로 설정하세요 (후속 생성기가 Nx 프로젝트 그래프를 계산할 수 있도록 필요한 경우 설치는 여전히 실행됩니다); 마지막에 한 번만 설치합니다.

제너레이터는 새 소스 파일을 생성하는 대신 기존 프로젝트를 연결합니다. 다음 파일이 수정됩니다:

  • 디렉터리packages/<gateway>
    • project.json Gateway의 dev 대상이 에이전트의 <agent>-dev에 대한 종속성을 얻음
    • local-dev.ts ATTACHED_AGENTS가 업데이트되어 로컬 게이트웨이가 에이전트로 프록시

제너레이터는 Gateway를 인스턴스화하는 스택이나 모듈을 알 수 없으므로 에이전트 대상을 인프라에 자동으로 연결할 수 없습니다. gateway.addAgent(agent)를 직접 한 번 호출하여 추가하세요.

Gateway를 인스턴스화하는 스택에서 에이전트를 대상으로 등록합니다:

packages/infra/src/stacks/application-stack.ts
const myAgent = new MyAgent(this, 'MyAgent');
const myGateway = new MyGateway(this, 'MyGateway');
// Register the agent as a runtime target of the Gateway. The target name
// defaults to the agent's `agentName` (its class name in kebab-case,
// e.g. `MyAgent` -> `my-agent`), and forms the target's invocation path:
// <gatewayUrl>/my-agent/invocations
myGateway.addAgent(myAgent);

기본 대상 이름을 재정의하려면 gatewayTargetName을 전달하세요:

myGateway.addAgent(myAgent, { gatewayTargetName: 'my-target' });

구성은 Gateway의 실행 역할에 에이전트 런타임에 대한 호출 액세스 권한을 부여하고 GATEWAY_IAM_ROLE 자격 증명 공급자로 대상을 구성하므로 Gateway는 자체 역할로 아웃바운드 호출에 서명합니다.

<gatewayUrl origin>/<targetName>/invocations에 대한 요청은 프로토콜 변환 없이 에이전트 런타임으로 전달되므로 호출자는 런타임에 직접 사용하는 것과 동일한 요청 형태를 사용합니다 — SSE 스트림(AG-UI), JSON 스트리밍(Python HTTP) 및 A2A JSON-RPC가 모두 프록시를 통과합니다. 호출자는 에이전트가 아닌 Gateway로 인증합니다(Gateway의 auth에 따라 IAM SigV4 또는 Cognito JWT).

웹사이트를 Gateway의 에이전트에 연결하려면 connection 제너레이터를 사용하세요.

기본적으로 Gateway는 자체 IAM 역할(GATEWAY_IAM_ROLE 자격 증명 공급자)로 아웃바운드 호출에 서명하므로 런타임은 호출자가 아닌 Gateway의 ID를 봅니다. 대신 에이전트가 호출자를 기준으로 권한을 부여하도록 하려면(예: 사용자의 sub 또는 scope 클레임을 읽기 위해) Cognito 에이전트를 Cognito Gateway로 프론트하세요. 그러면 Gateway는 호출자의 JWT를 런타임에 변경 없이 전달하고(JWT_PASSTHROUGH 자격 증명 공급자), 런타임은 이를 재검증합니다.

양쪽 끝을 auth: cognito로 생성하고 위와 같이 연결하세요:

  • auth: cognito로 생성된 에이전트(ts#agent 또는 py#agent), 그리고
  • 동일한 Cognito 사용자 풀을 프론트하는 auth: cognito로 생성된 Gateway.

나머지는 모두 자동입니다 — gateway.addAgent(agent)(CDK) 및 생성된 Terraform 런타임 모듈이 에이전트의 auth를 기반으로 연결을 처리합니다:

  • 대상은 (GATEWAY_IAM_ROLE이 아닌) JWT_PASSTHROUGH 자격 증명 공급자로 생성되며,
  • 런타임은 Authorization 헤더를 허용 목록에 추가하여 전달된 토큰이 에이전트 코드에 도달하도록 합니다. 이 허용 목록이 없으면 AgentCore는 토큰을 검증하지만 컨테이너 전에 헤더를 제거합니다.

호출자는 Authorization: Bearer <jwt>로 Gateway를 호출하고(SigV4 없음), 에이전트는 Authorization 헤더에서 클레임을 읽습니다 — 런타임의 인바운드 권한 부여자가 이미 토큰을 확인했으므로 서명 검증을 건너뜁니다:

packages/py_project/.../my_agent/main.py
import jwt # PyJWT
@app.post('/invocations')
async def invoke(input: InvokeInput, request: Request):
token = request.headers['authorization'].removeprefix('Bearer ')
claims = jwt.decode(token, options={'verify_signature': False})
# authorize on claims['sub'], claims['scope'], ...

다음 명령으로 Gateway를 로컬에서 실행:

Terminal window
pnpm nx dev <gateway-name>

로컬 게이트웨이와 할당된 로컬 포트의 모든 연결된 에이전트를 시작합니다. 로컬 게이트웨이는 /<targetName>/... 경로를 각 에이전트의 로컬 서버로 프록시하여 배포된 Gateway의 경로 기반 라우팅과 일치합니다.