使用VPC端点安全连接AI代理网关技术解析
架构概述
该架构图展示了用户访问由后端代理支持的应用程序,这些代理部署在各种计算服务中,包括EC2实例、Lambda函数、弹性Kubernetes服务或弹性容器服务,全部在VPC环境中运行。这些代理与代理核心网关通信,以发现、访问和调用已转换为代理兼容资源的外部工具和服务,例如企业API和Lambda函数。
在标准配置中,代理向代理核心网关的请求会经过公共互联网。通过实施接口VPC端点,组织可以将这些通信通过安全内部网络骨干路由,从而带来显著优势,包括增强安全性、降低延迟,以及为需要严格网络隔离和数据保护标准的受监管工作负载改进合规性。
解决方案遵循以下工作流程:
- AI代理交互 - VPC内运行的代理从身份提供者获取所需的入站授权,通过网关进行身份验证,并通过接口VPC端点向网关发送工具使用请求(调用MCP工具)
- 网关处理 - 网关管理OAuth授权以确保只有有效用户和代理可以访问工具和资源。入站请求由网关授权。将使用Model Context Protocol(MCP)等协议的代理请求转换为API请求和Lambda调用
- 安全访问 - 网关处理每个工具的凭证注入,使代理能够无缝使用具有不同身份验证要求的工具。它使用代理核心身份安全地代表代理访问后端资源(目标)
- 目标执行 - 网关数据平面调用目标,可以是Lambda函数、OpenAPI规范或Smithy模型
- 监控 - 代理核心网关提供内置可观察性和审计功能。此外,AWS PrivateLink将指标发布到CloudWatch以监控接口端点。可以选择启用VPC流日志来记录到代理核心网关的IP流量
关键考虑因素
私人和公共网络通信 - 接口VPC端点通过AWS PrivateLink实现从代理到代理核心网关的入站流量的安全通信,确保此流量保留在私有网络中。但是,身份验证工作流程(包括OAuth访问令牌检索和代理与外部身份提供者系统之间的凭证交换过程,用于入站和出站流)以及从网关到MCP工具的出站访问仍然需要互联网连接,以与AWS环境外部托管的外部资源和身份系统建立安全会话。
数据平面范围 - 需要了解的是,目前接口VPC端点支持仅适用于网关的数据平面端点 - 应用程序与代理工具交互的运行时端点。需要明确区分:虽然现在可以通过接口VPC端点访问网关的运行时端点,但控制平面操作(如创建网关、管理工具和配置安全设置)仍必须通过标准公共代理核心控制平面端点执行。
先决条件
要实施此解决方案,需要以下先决条件:
- 具有适当IAM权限的AWS账户,用于VPC和EC2管理
- 具有子网配置和路由表的现有VPC设置
- 已在AWS账户中配置和设置的代理核心网关
- 对VPC网络概念和安全组配置的基本理解
解决方案演练
以下部分演示了如何使用管理控制台配置接口VPC端点,并建立从VPC内测试EC2实例到代理核心网关的安全连接。
为EC2实例创建安全组
要为EC2实例创建安全组,请按照以下步骤操作:
- 在首选区域的EC2控制台中,选择导航窗格中网络与安全下的安全组
- 选择创建安全组
- 对于安全组名称,输入描述性名称,如ec2-agent-sg
- 对于描述,输入有意义的描述,如"用于运行AI代理的EC2实例的安全组"
- 对于VPC,选择目标VPC
- 添加EC2实例管理的相关入站规则,例如来自管理网络或堡垒主机的SSH(端口22)
- 将出站规则保留为默认值(允许所有出站流量),以确保代理可以与必要服务通信
- 选择创建安全组
为接口VPC端点创建安全组
要为接口VPC端点创建安全组,请按照以下步骤操作:
创建第二个安全组vpce-agentcore-sg,该安全组将附加到代理核心网关接口VPC端点,使用与前述说明类似的步骤并选择相同的VPC。对于此安全组,配置以下规则以启用安全和受限访问:
- 入站规则 - 允许HTTPS(端口443)用于与代理核心网关的安全通信
- 源 - 选择在前面部分创建的EC2安全组(ec2-agent-sg),仅允许来自授权代理实例的流量
- 出站规则 - 保留为默认值(允许所有流量)以支持响应流量
此安全组配置通过确保只有具有代理安全组的EC2实例可以访问VPC端点,同时阻止来自VPC中其他资源的未经授权访问,实现了最小权限原则。
在VPC内配置EC2实例
在同一个VPC中配置EC2实例,并为工作负载要求选择适当的可用区。使用以下列表所示的网络设置配置实例,确保选择相同的VPC并记下所选的子网以进行VPC端点配置:
- VPC - 选择目标VPC
- 子网 - 选择私有子网以增强安全性(记下此子网用于VPC端点配置)
- 安全组 - 附加在前面步骤中创建的EC2安全组(ec2-agent-sg)
- IAM角色 - 配置具有代理核心网关访问必要权限的IAM角色
- 实例类型 - 根据代理工作负载要求选择适当的实例类型
记住所选的子网,因为需要在同一子网中配置VPC端点以促进最佳网络路由和最小延迟。
创建接口VPC端点
使用Amazon VPC创建接口VPC端点,该端点自动使用AWS PrivateLink技术,实现从EC2实例到代理核心网关的安全通信,而无需经过公共互联网。按照以下步骤操作:
- 导航到Amazon VPC控制台,选择PrivateLink和Lattice部分下导航窗格中的端点
- 选择创建端点
- 对于名称标签,输入描述性名称(例如vpce-agentcore-gateway)
- 对于服务类别,选择AWS服务
- 对于服务,搜索并选择com.amazonaws.
.bedrock-agentcore.gateway(将 替换为实际的AWS区域)
将VPC设置为在整个设置过程中一直使用的相同VPC。
选择启用DNS名称以允许使用其默认域名访问代理核心网关,这简化了应用程序配置并保持与现有代码的兼容性。
指定运行EC2实例的子网以保持最佳网络路由和最小延迟。
将安全组设置为前面创建的VPC端点安全组(vpce-agentcore-sg)以控制对端点的访问。
对于初始测试,将策略设置为完全访问以允许VPC内的代理与AWS账户中的代理核心网关通信。在生产环境中,基于最小权限原则实施更严格的策略。
创建端点后,大约需要2-5分钟才能可用。可以在Amazon VPC控制台上监控状态,当显示为可用时,可以继续进行连接测试。
测试连接
登录到EC2实例以执行以下测试。
检查通过接口VPC端点的流量流
要确认通过代理核心网关端点的流量流,检查连接到代理核心网关端点的源资源的IP地址。设置接口VPC端点时,AWS会在子网中部署具有私有IP地址的弹性网络接口。此部署允许来自Amazon VPC内资源以及通过AWS Direct Connect或AWS Site-to-Site VPN连接到接口VPC端点的本地资源进行通信。当使用集中式接口VPC端点架构模式时,它还允许与其他Amazon VPC端点中的资源进行通信。
检查是否为代理核心网关端点开启了私有DNS。如果开启私有DNS,则代理核心网关端点将解析为私有端点IP地址。对于代理核心网关,启用私有DNS意味着代理可以继续使用标准网关端点URL,同时通过VPC端点受益于私有网络路由。
在VPC接口端点之前,DNS解析为代理核心网关端点的公共IP地址:
nslookup gateway.bedrock-agentcore.amazonaws.com
Non-authoritative answer:
Name: gateway.bedrock-agentcore.amazonaws.com
Address: 52.86.152.150
创建具有私有DNS解析的VPC接口端点后,DNS解析为创建VPC端点的VPC子网的CIDR范围内的私有IP地址:
nslookup gateway.bedrock-agentcore.amazonaws.com
Non-authoritative answer:
Name: gateway.bedrock-agentcore.amazonaws.com
Address: 172.31.91.174
当为代理核心网关VPC接口端点选择启用DNS名称时,默认情况下AWS会开启"仅针对入站端点启用私有DNS"选项。
私有DNS启用(cURL)(推荐)
当启用私有DNS时,应用程序可以无缝使用标准网关URL端点,格式为https://{gateway-id}.gateway.bedrock-agentcore.{region}.amazonaws.com,同时流量自动通过VPC端点路由。
以下是从VPC内资源执行的示例cURL请求。该命令发送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": {}
}'
此cURL命令向代理核心网关MCP端点发送JSON-RPC 2.0 POST请求以检索可用工具列表。它使用承载令牌身份验证并在输出中包含响应头,调用tools/list方法来发现通过网关可访问的工具。
私有DNS禁用(Python)
当禁用私有DNS时,无法通过标准代理核心网关端点直接访问网关。相反,必须通过VPC DNS名称路由流量,并在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": {}
}'
以下步骤详细介绍了执行使用Host头的Python脚本:
- 访问EC2实例。登录到具有VPC端点访问权限的EC2实例
- 配置连接所需的环境变量:
- GATEWAY_URL - 用于通过私有网络连接访问代理核心网关的VPC端点URL
- TOKEN - 用于访问网关的身份验证承载令牌
- GATEWAY_HOST - 禁用私有DNS时必须包含在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的文件中。此代码通过发现可用工具、使用工具创建Strands代理,然后测试对话交互(工具列表和天气查询)和直接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
# 从环境变量读取身份验证令牌和网关URL
token = os.getenv('TOKEN')
gatewayURL = os.getenv('GATEWAY_URL') # vpc端点url
gatewayHost = os.getenv('GATEWAY_HOST') # agentcore网关的域名
def create_streamable_http_transport():
"""创建具有适当身份验证头的HTTP传输"""
return streamablehttp_client(
gatewayURL,
headers={
"Authorization": f"Bearer {token}",
"Host": gatewayHost
}
)
# 使用传输初始化MCP客户端
client = MCPClient(create_streamable_http_transport)
# 配置Bedrock模型 - 确保~/.aws/credentials中的IAM凭证具有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'
# 从MCP服务器列出可用工具
tools = client.list_tools_sync()
# 使用模型和可用工具创建代理
agent = Agent(model=yourmodel, tools=tools)
print(f"代理中加载的工具: {agent.tool_names}")
# 使用简单查询测试代理以列出可用工具
response1 = agent("Hi, can you list all tools available to you?")
print(f"工具列表的代理响应: {response1}")
# 使用工具调用请求测试代理
response2 = agent("Get the current weather for Seattle and show me the exact response from the tool")
print(f"天气查询的代理响应: {response2}")
# 直接MCP工具调用以进行验证
result = client.call_tool_sync(
tool_use_id="get-weather-seattle-call-1", # 此调用的唯一标识符
name=f"{targetname}___get_weather", # Lambda目标的工具名称格式
arguments={"location": "Seattle"}
)
print(f"直接MCP工具响应: {result}")
使用以下命令调用脚本:
python3 agent.py
高级配置:VPC端点访问策略
VPC端点策略是基于资源的策略,控制通过端点对AWS服务的访问。与基于身份的策略不同,端点策略在网络级别提供额外的访问控制层。可以为具有特定考虑的代理核心网关VPC端点配置访问策略。
在为代理核心网关创建端点策略时,考虑以下关键元素:
- 主体配置 - 主体字段无法修改,因为代理核心网关不使用IAM进行身份验证。身份验证通过承载令牌而不是IAM主体处理
- 资源规范 - 如果要限制对特定网关端点的访问,请明确定义资源字段。使用完整的Amazon资源名称(ARN)格式以定位账户内的特定网关
- 操作权限 - 对于操作字段,避免指定控制平面操作。使用通配符(*)以允许网关功能所需的数据平面操作
以下是示例策略结构:
{
"Version": "2012-10-17",
"Statement": [
{
"Principal": "*",
"Effect": "Allow",
"Action": "*",
"Resource": "arn:aws:bedrock-agentcore:<region>:<AWS_Account_ID>:gateway/<gateway_id>"
}
]
}
当VPC端点策略阻止请求时,将看到错误响应,例如:
{"jsonrpc":"2.0","id":2,"error":{"code":-32002,"message":"Authorization error - Insufficient permissions"}}
策略缓存行为
代理核心网关实施了访问策略的缓存机制,在策略更改生效前引入最多15分钟的延迟。尽管此缓存显著提高了网关性能,但意味着策略修改可能不会立即反映在访问控制中。要有效处理此行为,应在进行更新后允许至少15分钟让策略更改在整个系统中完全传播。在可能的情况下,在计划维护窗口期间安排策略修改以最小化操作影响。在将策略更改应用于生产网关之前,始终在非生产环境中测试策略更改,并在诊断与访问相关的问题时考虑缓存延迟,以避免过早的故障排除工作。
高级模式
在共享网关、多代理模式中,来自不同服务的多个代理通过共享VPC端点访问单个集中式网关,在通过基于令牌的身份验证保持安全性的同时简化网络架构。
在多网关、多代理模式中,跨不同应用程序的多个代理通过专用VPC端点访问多个专用网关,提供每个网关的访问控制的最大安全隔离。
在跨VPC网关访问模式中,多个VPC中的代理可以通过VPC对等或AWS Transit Gateway连接访问代理核心网关,允许跨网络边界集中式网关访问,同时保持隔离。
在混合云网关模式中,本地代理可以通过禁用私有DNS的VPC端点访问基于云的网关,通过Direct Connect或VPN连接启用混合云部署。
清理
为避免持续费用并保持良好的资源卫生,按顺序完成以下步骤清理资源:
删除EC2实例:
- 导航到EC2控制台并选择测试实例
- 选择实例状态并停止实例,然后等待其停止
- 选择实例状态并终止实例以永久删除实例
删除VPC端点:
- 导航到Amazon VPC控制台并选择端点
- 选择创建的VPC端点(vpce-agentcore-gateway)
- 选择操作并删除VPC端点
- 确认删除
删除安全组:
- 导航到EC2控制台并选择安全组
- 选择创建的EC2安全组(ec2-agent-sg)
- 选择操作并删除安全组
- 对VPC端点安全组(vpce-agentcore-sg)重复操作
结论
本文演示了如何使用VPC接口端点和AWS PrivateLink在VPC托管资源与AI代理核心网关之间建立安全、私有连接。此架构通过实施与互联网隔离的网络,通过专用私有网络路径提供增强的安全性,为企业AI部署带来全面优势。该解决方案通过VPC端点策略实施了强大的数据边界,创建了围绕AI资源的严格数据边界的细粒度访问控制。此外,该架构支持本地环境的私有连接到网关端点,支持跨越云和本地基础设施的分布式AI架构。对于大规模部署自主AI系统的组织,实施VPC接口端点创建了高效代理操作所需的安全网络基础,同时通过优化的网络路径提供降低的延迟。这种企业级方法有助于使AI代理应用程序在满足安全性和合规性要求的同时实现改进的性能和减少的响应时间。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码