如何让配置VPC的Lambda调用WebSocket API Gateway的PostToConnection?
解决VPC内Lambda调用公网WebSocket API PostToConnection报403的问题
以下是针对不同场景的具体解决步骤:
一、网络可达性排查与配置
1. Lambda部署在公有子网时
- 检查公有子网的路由表,确保存在指向**Internet Gateway(IGW)**的默认路由(
0.0.0.0/0-> IGW),保证Lambda能正常访问公网。 - 确认Lambda的安全组允许**出站HTTPS(443端口)**流量到公网。
2. Lambda部署在私有子网时
- 为VPC配置NAT Gateway(推荐)或NAT实例,并将私有子网的路由表默认路由指向NAT Gateway,让Lambda通过NAT访问公网。
- 确保NAT Gateway部署在对应的公有子网,且该公有子网路由表指向IGW。
- 检查Lambda安全组允许出站HTTPS流量到NAT Gateway。
二、权限配置验证
- 为Lambda执行角色添加权限策略,允许调用WebSocket API的
PostToConnection接口,示例策略如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/*/@connections/*" } ] } - 检查WebSocket API的资源策略,确认没有阻止VPC内Lambda的请求:
- 如果资源策略中有IP限制,需添加Lambda所在子网的IP段;
- 如果使用VPC端点,需添加
aws:SourceVpc或aws:SourceVpce条件允许对应VPC/VPC端点的访问。
三、更优方案:使用VPC端点访问API Gateway(无需公网)
如果不想通过公网访问,可以配置API Gateway的Interface VPC Endpoint:
- 在VPC中创建Interface类型的VPC端点,服务选择
com.amazonaws.你的区域.execute-api,关联Lambda所在的子网和安全组。 - 配置VPC端点的安全组,允许Lambda的安全组发起HTTPS(443端口)连接。
- 修改Lambda调用API的地址为VPC端点的私有域名,而非公网域名。
- 在API Gateway的资源策略中添加允许来自该VPC端点的请求:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的区域:你的账号ID:你的API ID/*", "Condition": { "StringEquals": { "aws:SourceVpce": "你的VPC端点ID" } } } ] }
四、额外检查点
- 确认AWS SDK的请求签名逻辑正常(VPC环境下SDK通常会自动处理,但若自定义请求需确保签名正确)。
- 检查是否有其他网络拦截规则(如VPC流日志),确认Lambda到API Gateway的流量未被阻断。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

