我有一个REST API Lambda函数部署到私有子网,其中API网关类型为私有。在this之后,我将一个vpc端点设置为私有api网关,该网关连接到与lambda函数私有子网相同的vpc的两个公共子网。 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"
}
}
}
]
}
我想念什么?
答案 0 :(得分:0)
我已经审查了您提供的文档以及您编写的文档。我相信我找到了您访问问题的原因。
正如您提到的,您在公共子网中创建了一个EC2实例。默认情况下,该子网将具有可用的Internet网关,因此实际上,您的VPC终结点将不会用于访问私有API网关。在文档中,他们还说了以下内容;
要强调此API的“私密性”,请使用传统网络意义上的仅位于VPC内部且无直接网络访问权限的资源对其进行测试。
假设您的策略正确,资源块中使用了正确的区域,并且您的vpc端点ID是正确的,您只需要在专用子网内启动另一个ec2实例。然后下面的过程应该起作用;
答案 1 :(得分:0)
您可以检查api网关端点上的安全组吗? 您需要使用
入口: 您的vpc的https源CIDR。
出口: 所有流量,0.0.0.0 / 0
我发现,如果您在sg(入口)中使用sg-,它将无法正常工作。更改为CIDR后,它现在可以工作了。我可以从打包机中调用此api。
答案 2 :(得分:0)
实际上,@ peterhack所说的也是我的答案。 问题与所有占位符一起使用提供的模板“ VPC白名单”:
...xxx:/{{stageNameOrWildcard}}/{{httpVerbOrWildcard}}/{{resourcePathOrWildcard}}
用...xxx:*/*
代替它