📢 转载信息
原文作者:Dhawalkumar Patel, June Won, Thomas Veppumthara, and Sindhura Palakodety
构建企业级智能体应用:通过接口 VPC 端点安全连接 Amazon Bedrock AgentCore 网关
代理式AI(Agentic AI)应用的兴起,标志着企业自动化领域的一个重大进步。智能体能够自主执行复杂工作流程、访问敏感数据集,并在您的组织基础设施中实时决策。Amazon Bedrock AgentCore 通过提供完全托管的服务,加速了企业的AI转型。它消除了基础设施复杂性、维护会话隔离,并支持与企业工具的无缝集成,使组织能够大规模部署可信赖的AI智能体。
AgentCore 网关是 AgentCore 的一个模块化服务,它通过将API、AWS Lambda 函数和各种服务安全地转换为兼容 模型上下文协议(MCP)的工具,并以统一的端点提供给智能体,从而简化了集成。它具有内置的身份验证和无服务器基础设施,最大限度地减少了运营开销。
为何需要接口 VPC 端点?
在生产环境中,AI智能体通常部署在虚拟私有云(VPC)内,以维护安全、隔离的网络访问,并满足企业的安全和合规性要求。AWS 接口 VPC 端点可以通过在 VPC 托管的智能体与 AgentCore 网关之间创建私有连接,增强代理式AI的安全性,确保敏感通信保留在 AWS 的安全基础设施内部。
- 私有连接与性能: 这些端点使用具有私有IP地址的专用网络接口,通过直接连接提供更低的延迟和卓越的性能。
- 精细访问控制: VPC 接口端点通过端点策略提供细粒度的访问控制。
- 简化操作与成本: 它们简化了操作,避免了代理服务器的管理,并降低了数据传输成本。
本文将演示如何从 VPC 中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例通过 VPC 接口端点访问 AgentCore 网关,并展示如何配置端点策略以在遵循最小权限原则的同时,确保安全访问。
架构概览与工作流程
下图展示了用户访问由后端智能体支持的应用程序的架构。这些智能体部署在EC2、Lambda、Amazon EKS 或 Amazon ECS 等各种AWS计算服务中,它们都在 VPC 环境中运行。这些智能体与 AgentCore 网关通信,以发现、访问和调用外部工具和服务(如企业API和Lambda函数)。
在标准配置中,智能体到 AgentCore 网关的请求会通过公共互联网传输。通过实施接口 VPC 端点,可以将这些通信路由到 AWS 的安全内部网络骨干,从而带来更高的安全性、更低的延迟以及更符合严格网络隔离和数据保护标准的合规性。
解决方案的工作流程如下:
- AI 智能体交互: 运行在 VPC 内的智能体从身份提供商处获取必要的入站授权,向网关进行身份验证,并通过接口 VPC 端点向网关发送工具使用请求(调用 MCP 工具)。
- 网关处理: 网关管理 OAuth 授权,确保只有有效用户和智能体才能访问工具和资源。它将 MCP 请求转换为 API 请求和 Lambda 调用。
- 安全访问: 网关为每个工具注入凭证,使智能体能够无缝使用具有不同身份验证要求的工具。它使用 AgentCore Identity 代表智能体安全地访问后端资源(目标)。
- 目标执行: 网关数据平面调用目标(Lambda 函数、OpenAPI 规范或 Smithy 模型)。
- 监控: AgentCore 网关提供内置的可观测性和审计。此外,AWS PrivateLink 会向 Amazon CloudWatch 发布指标以监控接口端点。您可以选择启用 VPC Flow Logs 来记录到 AgentCore 网关的 IP 流量。
关键注意事项
- 网络通信: 接口 VPC 端点确保了从智能体到 AgentCore 网关的入站流量通过 AWS PrivateLink 在私有网络内保持安全。然而,身份验证工作流程(如 OAuth 访问令牌检索和凭证交换)以及网关到外部托管 MCP 工具的出站访问,仍然需要互联网连接才能与外部身份系统和资源建立安全会话。
- 数据平面范围: 目前,接口 VPC 端点仅支持网关的数据平面端点(即应用程序与智能体工具交互的运行时端点)。控制平面操作(如创建网关、管理工具和配置安全设置)仍需通过标准的公共 AgentCore 控制平面端点(例如
bedrock-agentcore-control.<region>.amazonaws.com
)进行。
解决方案前提条件
- 拥有适当 AWS IAM 权限(用于 VPC 和 Amazon EC2 管理)的 AWS 账户。
- 已配置的 VPC 及其子网和路由表。
- 您的 AWS 账户中已预配并配置了 AgentCore 网关。
- 对 VPC 网络和安全组配置有基本了解。
分步解决方案指南
我们将使用 AWS 管理控制台来配置接口 VPC 端点,并从 VPC 内的测试 EC2 实例建立安全连接。
1. 创建 EC2 实例的安全组
在您选择的 AWS 区域,导航至 Amazon EC2 控制台,然后选择安全组:
- 选择创建安全组。
- 安全组名称: 输入描述性名称,例如
ec2-agent-sg
。 - VPC: 选择目标 VPC。
- 入站规则: 添加必要的管理规则,如来自您的管理网络或堡垒主机的 SSH(22 端口)。
- 出站规则: 保持默认设置(允许所有出站流量)。
- 选择创建安全组。
2. 创建接口 VPC 端点的安全组
创建第二个安全组命名为 vpce-agentcore-sg
,并将用于附加到 AgentCore 网关接口 VPC 端点。配置规则如下,以实现最小权限访问:
- 入站规则: 允许来自EC2 安全组 (
ec2-agent-sg
) 的 HTTPS(443 端口)流量。 - 出站规则: 保持默认设置。
3. 预置 VPC 内的 EC2 实例
在同一 VPC 中预置 EC2 实例,并注意其子网和安全组配置:
- 子网: 选择一个私有子网(为 VPC 端点配置做准备)。
- 安全组: 附加
ec2-agent-sg
。 - IAM 角色: 配置必要的 Amazon Bedrock 和 AgentCore 网关访问权限。
4. 创建接口 VPC 端点
导航至 Amazon VPC 控制台下的端点,创建使用 AWS PrivateLink 的接口端点:
- 选择创建端点。
- 服务类别: 选择 AWS services。
- 服务: 搜索并选择
com.amazonaws.<region>.bedrock-agentcore.gateway
(替换<region>
)。
关键配置步骤:
- VPC 和子网: 选择工作所在的 VPC,并指定 EC2 实例所在的相同子网以优化路由。
- DNS 名称: 选择启用 DNS 名称,这样您的应用程序仍可以使用默认的域名访问 AgentCore 网关,而流量会自动通过私有端点路由。
- 安全组: 附加
vpce-agentcore-sg
。 - 策略: 对于初始测试,设置为完全访问。生产环境中应根据最小权限原则进行限制。
端点创建后大约需要 2-5 分钟才能变为可用状态。
5. 测试连接
登录到 EC2 实例进行连接测试。
检查接口 VPC 端点的流量流
通过检查连接到 AgentCore 网关端点时使用的源 IP 地址,可以确认流量是否通过接口 VPC 端点。如果启用了私有 DNS,DNS 解析将指向 VPC 子网中的私有 IP 地址(由 VPC 端点中的弹性网络接口提供)。
未启用 VPC 接口端点之前: DNS 解析到公共 IP 地址:
nslookup gateway.bedrock-agentcore.amazonaws.com
Non-authoritative answer:
Name: gateway.bedrock-agentcore..amazonaws.com
Address: 52.86.152.150
启用 VPC 接口端点并解析私有 DNS 之后: DNS 解析到私有 IP 地址:
nslookup .gateway.bedrock-agentcore..amazonaws.com
Non-authoritative answer:
Name: .gateway.bedrock-agentcore..amazonaws.com
Address: 172.31.91.174
私有 DNS 已启用 (cURL)(推荐)
如果私有 DNS 启用,应用程序可以直接使用标准网关 URL,流量将自动通过 VPC 端点路由。以下是使用 cURL 从 VPC 资源执行的 JSON-RPC POST 请求示例,用于检索可用工具列表:
curl -sS -i -X POST https://<gatewayid>.gateway.bedrock-agentcore.<region>.amazonaws.com/mcp \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer $TOKEN" \
--data '{
"jsonrpc": "2.0",
"id": "'"$UNIQUE_ID"'",
"method": "tools/list",
"params": {}
}'
私有 DNS 已禁用 (Python)
如果禁用私有 DNS,则不能直接通过标准 AgentCore 网关端点访问。相反,您必须通过 VPC DNS 名称路由流量,并在 Host
头部包含原始网关域名。
cURL 示例(需要设置 Host
头部):
curl -sS -i -X POST https://<vpce-dns-name>/mcp \
--header 'Host: <gatewayid>.gateway.bedrock-agentcore.<region>.amazonaws.com' \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer $TOKEN" \
--data '{ "jsonrpc": "2.0", "id": "'$UNIQUE_ID'", "method": "tools/list", "params": {} }'
Python 脚本执行步骤:
- 登录到 EC2 实例。
- 配置环境变量:
GATEWAY_URL
(VPC 端点 URL)、TOKEN
(Bearer Token) 和GATEWAY_HOST
(原始网关域名)。
例如:
export GATEWAY_URL=https://<vpce_id>.gateway.bedrock-agentcore.ap-southeast-2.vpce.amazonaws.com/mcp
export TOKEN=<your-token-here>
export GATEWAY_HOST=<gateway_id>.gateway.bedrock-agentcore.ap-southeast-2.amazonaws.com
- 将以下 Python 代码保存为
agent.py
,该代码将测试工具列表、会话交互以及直接 MCP 工具调用:
from strands.models import BedrockModel
from mcp.client.streamable_http import streamablehttp_client
from strands.tools.mcp.mcp_client import MCPClient
from strands import Agent
import logging
import os # 读取环境变量
token = os.getenv('TOKEN')
gatewayURL = os.getenv('GATEWAY_URL') # vpc endpoint url
gatewayHost = os.getenv('GATEWAY_HOST') # domain name of the agentcore gateway
def create_streamable_http_transport():
"""Create HTTP transport with proper authentication headers"""
return streamablehttp_client(
gatewayURL,
headers={
"Authorization": f"Bearer {token}",
"Host":gatewayHost
}
)
# 初始化 MCP 客户端
client = MCPClient(create_streamable_http_transport)
# 配置 Bedrock 模型
yourmodel = BedrockModel(
model_id="amazon.nova-pro-v1:0",
temperature=0.7,
)
# 配置日志
logging.getLogger("strands").setLevel(logging.INFO)
logging.basicConfig( format="%(levelname)s | %(name)s | %(message)s", handlers=[logging.StreamHandler()]
)
# 测试完整代理工作流程
with client:
targetname = 'TestGatewayTarget36cb2ebf'
# 1. 列出可用工具
tools = client.list_tools_sync()
# 2. 创建包含工具的模型
agent = Agent(model=yourmodel, tools=tools)
print(f"Tools loaded in the agent: {agent.tool_names}")
# 3. 测试会话查询
response1 = agent("Hi, can you list all tools available to you?")
print(f"Agent response for tool listing: {response1}")
# 4. 测试工具调用
response2 = agent("Get the current weather for Seattle and show me the exact response from the tool")
print(f"Agent response for weather query: {response2}")
# 5. 直接 MCP 工具调用验证
result = client.call_tool_sync(
tool_use_id="get-weather-seattle-call-1",
name=f"{targetname}___get_weather",
arguments={"location": "Seattle"}
)
print(f"Direct MCP tool response: {result}")
- 使用以下命令执行脚本:
python3 agent.py
高级配置:VPC 端点访问策略
VPC 端点策略是资源级策略,用于控制通过该端点对 AWS 服务的访问,提供了网络级别的额外访问控制层。
配置 AgentCore 网关的端点策略时,请注意以下关键点:
- Principal 配置:
Principal
字段无法修改,因为 AgentCore 网关不使用 IAM 进行身份验证,而是依赖于 Bearer Token。 - 资源规范: 如果要限制对特定网关的访问,请在
Resource
字段中明确定义完整的 Amazon 资源名称 (ARN)。 - 操作权限: 对于
Action
字段,应避免指定控制平面操作,而使用通配符(*)以允许必要的网关数据平面操作。
以下是策略结构示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Principal": "*",
"Effect": "Allow",
"Action": "*",
"Resource": "arn:aws:bedrock-age... [内容被截断]
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,小白也可以简单操作。
评论区