Bỏ qua để đến nội dung

AgentCore Gateway đến Agent

Generator connection có thể đăng ký một agent (có thể là TypeScript hoặc Python) làm AgentCore Runtime target của một AgentCore Gateway được tạo với protocol: http.

Sau khi kết nối, Gateway sẽ proxy các yêu cầu cho agent dưới <gatewayUrl>/<targetName>/invocations, ký lưu lượng truy cập đi ra đến runtime bằng IAM SigV4. Điều này cung cấp cho các agent của bạn một điểm vào duy nhất được quản lý — và vì người gọi chỉ cần tiếp cận Gateway, bản thân các agent runtime có thể được triển khai bên trong VPC phía sau nó.

Trước khi sử dụng generator này, hãy đảm bảo bạn có:

  1. Một dự án agentcore-gateway được tạo với protocol: http
  2. Một component agent (ts#agent hoặc py#agent) được tạo với infra: agentcore. Cả auth: iam (Gateway gọi nó bằng role của chính nó) hoặc auth: cognito (Gateway chuyển tiếp JWT của người gọi — xem Chuyển tiếp danh tính người gọi) đều hoạt động.
Terminal window
pnpm nx g @aws/nx-plugin:connection
Bạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Chọn dự án Gateway làm nguồn và dự án agent làm đích. Nếu dự án agent chứa nhiều component, hãy chỉ định targetComponent để phân biệt.

Tham sốKiểuMặc địnhMô tả
sourceProject Bắt buộcstring-Dự án nguồn
targetProject Bắt buộcstring-Dự án đích để kết nối tới
sourceComponent string-Component nguồn để kết nối từ đó (tên component, đường dẫn tương đối so với thư mục gốc của dự án nguồn, hoặc generator id). Sử dụng '.' để chọn rõ ràng dự án làm nguồn.
targetComponent string-Component đích để kết nối tới (tên component, đường dẫn tương đối so với thư mục gốc của dự án đích, hoặc generator id). Sử dụng '.' để chọn rõ ràng dự án làm đích.
preferInstallDependencies booleantrueCó nên cài đặt các dependencies sau khi generator chạy hay không. Đặt thành false để trì hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối.

Generator kết nối các dự án hiện có với nhau thay vì tạo ra các file nguồn mới. Các file sau được sửa đổi:

  • Thư mụcpackages/<gateway>
    • project.json target dev của Gateway có thêm dependency vào <agent>-dev của agent
    • local-dev.ts ATTACHED_AGENTS được cập nhật để gateway cục bộ proxy đến agent

Generator không thể tự động kết nối agent target vào cơ sở hạ tầng của bạn vì nó không biết stack hoặc module nào khởi tạo Gateway. Hãy tự thêm một lệnh gọi duy nhất gateway.addAgent(agent).

Trong stack nơi bạn khởi tạo Gateway, hãy đăng ký agent làm target:

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);

Để ghi đè tên target mặc định, hãy truyền gatewayTargetName:

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

Construct cấp quyền invoke access cho execution role của Gateway đến agent runtime và cấu hình target với credential provider GATEWAY_IAM_ROLE, để Gateway ký các lệnh gọi đi ra bằng role của chính nó.

Các yêu cầu đến <gatewayUrl origin>/<targetName>/invocations được chuyển tiếp đến agent runtime mà không có chuyển đổi giao thức, vì vậy người gọi sử dụng cùng hình dạng yêu cầu mà họ sẽ sử dụng trực tiếp với runtime — SSE streams (AG-UI), JSON streaming (Python HTTP) và A2A JSON-RPC đều proxy qua. Người gọi xác thực với Gateway (IAM SigV4 hoặc Cognito JWT tùy thuộc vào auth của Gateway) thay vì với agent.

Để kết nối một website với các agent của Gateway, hãy sử dụng connection generator.

Chuyển tiếp danh tính người gọi đến runtime

Phần tiêu đề “Chuyển tiếp danh tính người gọi đến runtime”

Theo mặc định, Gateway ký các lệnh gọi đi ra bằng IAM role của chính nó (credential provider GATEWAY_IAM_ROLE), vì vậy runtime thấy danh tính của Gateway, không phải của người gọi. Nếu thay vào đó bạn muốn agent ủy quyền dựa trên người gọi — ví dụ để đọc các claim sub hoặc scope của người dùng — hãy đặt một agent Cognito phía sau một Gateway Cognito. Gateway sau đó chuyển tiếp JWT của người gọi đến runtime không thay đổi (credential provider JWT_PASSTHROUGH), và runtime xác thực lại nó.

Tạo cả hai đầu với auth: cognito và kết nối chúng như trên:

  • một agent (ts#agent hoặc py#agent) được tạo với auth: cognito, và
  • một Gateway được tạo với auth: cognito đặt phía trước cùng Cognito user pool.

Mọi thứ khác đều tự động — gateway.addAgent(agent) (CDK) và Terraform runtime module được tạo xử lý việc kết nối cho bạn dựa trên auth của agent:

  • target được tạo với credential provider JWT_PASSTHROUGH (thay vì GATEWAY_IAM_ROLE), và
  • runtime cho phép header Authorization vào danh sách cho phép để token được chuyển tiếp đến code agent của bạn. Không có danh sách cho phép này, AgentCore xác thực token nhưng loại bỏ header trước container của bạn.

Người gọi gọi Gateway với Authorization: Bearer <jwt> (không có SigV4), và agent đọc các claim từ header Authorization — bỏ qua xác thực chữ ký, vì inbound authorizer của runtime đã xác minh token:

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'], ...

Chạy Gateway cục bộ với:

Terminal window
pnpm nx dev <gateway-name>

khởi động một gateway cục bộ cộng với mọi agent được đính kèm trên cổng cục bộ được chỉ định của nó. Gateway cục bộ proxy các đường dẫn /<targetName>/... đến máy chủ cục bộ của mỗi agent, khớp với định tuyến dựa trên đường dẫn của Gateway đã triển khai.