我有一个REST API Lambda函数部署到私有子网,其中API网关类型是私有的。在this之后,我已经设置了一个vpc端点到私有api网关到同一个vpc的两个公共子网,就像lambda函数私有子网一样。 vpce的相应安全组允许所有流量。
如果我尝试从公有子网中的EC2实例查询api端点,我会收到以下错误:
anonymous is not authorized to perform: execute-api:Invoke on resource.
我找不到问题,因为私有api网关的资源策略如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:eu-central-1:xxxxxxx:xxxxxx/*",
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-xxxxxxxx"
}
}
}
]
}
我错过了什么?
我已经查看了您提供文档的文档以及您编写的内容。我相信我找到了您的访问问题的原因。
正如您所提到的那样,您在公有子网中创建了一个EC2实例。默认情况下,子网将具有可用的Internet网关,因此实际上您的VPC端点将不会用于访问私有API网关。在文档中他们也说以下内容;
为了强调此API的“私有性”,请在传统的网络意义上,从仅存在于您的VPC内并且没有直接网络访问权限的资源中对其进行测试。
假设您的策略正确,您的资源块中使用了正确的区域,并且您的vpc端点ID是正确的,您只需要在私有子网内启动另一个ec2实例。那么下面的过程应该有效;
你能检查api网关端点上的安全组吗?你需要使用
Ingress:你的vpc的https来源CIDR。
Outgress:所有流量,0.0.0.0 / 0
我发现如果你在sg(Ingress)中使用sg-,它将无效。在我改为CIDR后,它现在有效。我可以从basion机器上调用这个api。