AWS私有API Gateway EC2调用报anonymous无权限故障
问题根因
- 你声称已经在资源策略中放通VPC Endpoint所有访问权限,但从导出的Swagger配置来看,资源策略仅配置了源IP放行规则,没有添加任何VPC Endpoint相关的放行条件。
- 当通过接口VPC Endpoint访问私有API Gateway时,私网传输链路不会透传EC2实例的真实源IP,CloudWatch日志中记录的
w.x.y.z是VPC Endpoint自身ENI的私网地址,并非EC2实例地址,因此你配置的IP条件根本无法匹配真实请求来源。 - 私有API Gateway的访问逻辑要求:通过VPC Endpoint发起的请求,必须在资源策略中显式通过
aws:SourceVpce条件放行对应VPC Endpoint,仅配置IP条件不会生效。 - 你在AWS控制台测试能正常返回结果,是因为控制台测试走的是AWS管理平面的鉴权链路,使用你的账号身份直接调用API,不经过VPC Endpoint的私网访问链路,因此不受你配置的私网访问策略影响。
解决方案
- 修改API Gateway资源策略,删除无效的IP地址条件,添加VPC Endpoint放行规则,修正后的策略片段如下:
x-amazon-apigateway-policy: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: "*" Action: "execute-api:Invoke" Resource: "arn:aws:execute-api:eu-west-1:aaa:bbb/*" Condition: StringEquals: aws:SourceVpce: "vpce-123456789"
- 将修改后的配置重新导入API Gateway,必须重新部署对应的
dev阶段,资源策略的修改只有在阶段部署后才会生效,不部署会持续沿用旧的错误策略。 - 如果需要限制仅指定EC2实例可访问该API,不要使用源IP作为校验条件,可通过VPC Endpoint自定义策略、API Gateway IAM授权或者自定义Lambda授权器实现身份校验,私网链路下源IP字段不代表真实请求发起方,无法用于精确的访问控制。
- 部署完成后重新执行curl命令即可正常调用。
内容的提问来源于stack exchange,提问作者Sauer
相关产品推荐
相关产品推荐

