如何跨账号跨区域安全暴露Lambda给外部消费者
问题描述
我在AWS账号A的us-west-2区域拥有一个Lambda,该Lambda部署在配置了严格安全组(SG)的VPC私有子网中。我希望实现让账号B、C、D能够通过API Gateway或其他方式调用该Lambda,API Gateway的调用可能来自不同区域。
调用方主机应能通过私有区域(Private Zone)解析的URL进行调用,退一步讲,也可直接安全调用API Gateway。出于安全性和性能考虑,我倾向于采用VPC和端点方案,通过Private Links实现调用。
关于VPC对等连接,所有账号的子网均为10.0.0.0/16,无需账号B、C等访问账号A内的其他主机,仅需这些账号的主机能够调用账号A中的单个API Gateway URL。
设想架构
+-------------------+ +-------------------+ +-------------------+ | Account B | | Account C | | Account D | | (Region varies) | | (Region varies) | | (Region varies) | | | | | | | | +---------------+ | | +---------------+ | | +---------------+ | | | EC2/ECS/ | | | | EC2/ECS/ | | | | EC2/ECS/ | | | | Fargate | | | | Fargate | | | | Fargate | | | | 10.0.0.0/16 | | | | 10.0.0.0/16 | | | | 10.0.0.0/16 | | | +-------+-------+ | | +-------+-------+ | | +-------+-------+ | | | | | | | | | | | +-----v-----+ | | +-----v-----+ | | +-----v-----+ | | | PrivateLink| | | | PrivateLink| | | | PrivateLink| | | | Endpoint | | | | Endpoint | | | | Endpoint | | | +-----------+ | | +-----------+ | | +-----------+ | +--------|-----------+ +--------|-----------+ +--------|-----------+ | | | | | | | AWS PrivateLink | | +-----------------------------+-----------------------------+ | | +------------v-------------+ | Account A | | (Region: us-west-2) | | | | +----------------------+ | | | VPC (10.0.0.0/16) | | | | | | | | +------------------+ | | | | | Private Subnet | | | | | | | | | | | | +-----------+ | | | | | | | API | | | | | | | | Gateway | | | | | | | +-----+-----+ | | | | | | | | | | | | | +---v---+ | | | | | | |Lambda | | | | | | | +-------+ | | | | | | | | | | | +------------------+ | | | | | | | +----------------------+ | | | +--------------------------+
前置问题
- 这似乎需要使用VPC Endpoint Service,但该服务似乎需要Network Load Balancer(NLB)而非Application Load Balancer(ALB),而NLB无法将Lambda作为目标,那么正确的实现方式是什么?
- 即使调用方主机位于不同区域,我是否可以仅启用API Gateway的IAM/角色授权,让消费者扮演对应角色来实现访问?
解决方案
问题1:基于PrivateLink的Lambda调用实现方案
你说的没错,VPC Endpoint Service(PrivateLink服务端)确实需要绑定NLB,但NLB不能直接把Lambda设为目标。这里有两种可行的落地路径:
路径一:API Gateway + NLB + PrivateLink
- 在账号A的us-west-2区域创建私有API Gateway,选择和Lambda同VPC的私有子网部署,将Lambda配置为API的集成目标。
- 创建NLB,采用TCP目标类型,把API Gateway的私有域名/IP设为目标。
- 在账号A中创建VPC Endpoint Service,绑定这个NLB,并在服务配置中添加账号B、C、D的账号ID,允许它们访问。
- 账号B、C、D各自在自身VPC中创建Interface类型的VPC端点,关联账号A的VPC Endpoint Service;同时在各自的Route 53私有托管区创建记录,将指定的私有域名解析到该VPC端点的DNS名称,实现调用方的私有域名访问。
路径二:Lambda函数URL + NLB + PrivateLink
如果不想依赖API Gateway,也可以直接用Lambda的函数URL:
- 给账号A的Lambda开启函数URL,配置为私有访问(仅允许VPC内流量触发)。
- 创建NLB,将Lambda函数URL的域名作为TCP目标(开放443端口)。
- 后续步骤和路径一一致:绑定VPC Endpoint Service、授权其他账号访问、其他账号创建VPC端点并配置私有域名解析。
注意:NLB的安全组要允许来自其他账号VPC端点的流量,Lambda的安全组要允许来自API Gateway或NLB的流量。
问题2:跨区域IAM授权调用的可行性
可以实现,但有明显的限制和权衡点:
- IAM配置逻辑:在账号A的API Gateway(或Lambda函数URL)上启用IAM授权;在账号B、C、D中创建IAM角色,给这些角色添加调用账号A资源的权限;同时在账号A的API Gateway资源策略中,允许这些跨账号角色的访问请求。
- 网络路径限制:如果调用方在其他区域,单纯用IAM授权的话,请求会走公网到达账号A的API Gateway——这和你想要的私有访问需求冲突,而且会带来更高的延迟。如果要实现私有路径,还是得结合问题1中的PrivateLink方案。
- 安全与性能权衡:跨区域公网调用不仅延迟高,还会暴露公网入口增加安全风险。如果你的核心需求是私有访问+低延迟,建议同时结合PrivateLink和IAM授权,既保证流量走私有路径,又通过IAM做身份验证。
简单来说:仅用IAM授权能实现跨区域调用,但无法满足私有访问的要求;要同时满足安全和性能需求,必须结合PrivateLink方案。
内容的提问来源于stack exchange,提问作者diegoaguilar
相关产品推荐
相关产品推荐

