AWS匿名无权执行:execute-api:在资源上调用。专用API网关

时间:2019-01-28 15:28:51

标签: amazon-web-services aws-api-gateway aws-vpc aws-vpc-link

我有一个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"
                }
            }
        }
    ]
}

我想念什么?

3 个答案:

答案 0 :(得分:0)

我已经审查了您提供的文档以及您编写的文档。我相信我找到了您访问问题的原因。

正如您提到的,您在公共子网中创建了一个EC2实例。默认情况下,该子网将具有可用的Internet网关,因此实际上,您的VPC终结点将不会用于访问私有API网关。在文档中,他们还说了以下内容;

  

要强调此API的“私密性”,请使用传统网络意义上的仅位于VPC内部且无直接网络访问权限的资源对其进行测试。

假设您的策略正确,资源块中使用了正确的区域,并且您的vpc端点ID是正确的,您只需要在专用子网内启动另一个ec2实例。然后下面的过程应该起作用;

  1. ssh到公共子网中的实例
  2. 从公共实例ssh到私有子网中的实例
  3. 在私有子网中从该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:*/*代替它