VPC内Lambda访问公网WebSocket API Gateway遇超时及权限问题求助
解决VPC内Lambda调用公网WebSocket API Gateway出现Forbidden的问题
我之前踩过几乎一模一样的坑——VPC里的Lambda要给公网WebSocket API的连接ID发消息,先是超时,加了execute-api VPC端点又碰到Forbidden。以下是亲测有效的分步解决方案:
1. 调整VPC端点的资源策略,允许访问你的公网API
默认情况下,execute-api的接口VPC端点只放行私有API的访问请求,所以得给它添加策略,允许你的Lambda角色访问目标公网WebSocket API。
你可以用AWS CLI修改已创建的VPC端点:
aws ec2 modify-vpc-endpoint \ --vpc-endpoint-id vpce-你的端点ID \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的Lambda执行角色ARN" }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:eu-west-1:你的AWS账号ID:你的WebSocket API ID/*/*/*" } ] }'
注意Resource要精确匹配你的WebSocket API的ARN格式,*/*/*涵盖所有部署阶段、路由和操作。
2. 在API Gateway控制台允许VPC端点访问你的公网API
这是最容易被忽略的关键步骤!哪怕你的API是公网可访问的,默认也会拒绝来自VPC端点的请求,必须手动添加允许的VPC端点:
- 打开API Gateway控制台,找到你的WebSocket API
- 切换到Settings标签页
- 下滑到VPC Endpoints区域,点击Add VPC Endpoint
- 选择你创建的execute-api VPC端点ID,保存配置
3. 检查安全组的互通规则
Lambda和VPC端点的安全组要确保能双向通信:
- Lambda所在的安全组:添加出站规则,允许HTTPS(443端口)访问VPC端点的安全组
- VPC端点的安全组:添加入站规则,允许HTTPS(443端口)来自Lambda的安全组
4. 验证Lambda中apigwManagementApi的配置
确保你初始化ApiGatewayManagementApi时用了正确的端点,并且Lambda角色有足够的权限:
- Node.js初始化示例:
const AWS = require('aws-sdk'); const apigwManagementApi = new AWS.ApiGatewayManagementApi({ region: 'eu-west-1', endpoint: 'https://你的API ID.execute-api.eu-west-1.amazonaws.com/你的部署阶段' }); - 给Lambda的执行角色添加IAM权限,允许
execute-api:Invoke动作,资源指向你的WebSocket API的ARN(和VPC端点策略里的一致)
问题根源复盘
- 最初没有VPC端点时,VPC内的Lambda如果没配置NAT网关/互联网网关,无法访问公网的API Gateway端点,导致请求超时
- 创建VPC端点后,默认策略和API Gateway的访问设置都不允许公网API接受VPC端点的请求,因此抛出
ForbiddenException
内容的提问来源于stack exchange,提问作者Callum M
相关产品推荐
相关产品推荐

