AWS 匿名无权对资源执行:execute-api:Invoke。私有 API 网关

Pet*_*ack 5 amazon-web-services amazon-vpc aws-api-gateway

我将 REST API Lambda 函数部署到私有子网,其中 API 网关类型为私有。在之后,我设置了一个 vpc 端点到私有 API 网关,连接到与 lambda 函数私有子网相同的 vpc 的两个公共子网。vpce 对应的安全组允许所有流量。

如果我尝试从公有子网中的 EC2 实例查询 API 端点,我会收到以下错误:

 anonymous is not authorized to perform: execute-api:Invoke on the resource.
Run Code Online (Sandbox Code Playgroud)

我找不到问题,因为私有 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"
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

mar*_*ber 0

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

\n\n

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

\n\n
\n

为了强调此 API 的 \xe2\x80\x9cprivateness\xe2\x80\x9d,请从传统网络意义上仅存在于您的 VPC 内部且无法直接通过网络访问的资源来测试它。

\n
\n\n

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

\n\n
    \n
  1. ssh 到公共子网中的实例
  2. \n
  3. 从公共实例 ssh 进入私有子网中的实例
  4. \n
  5. 从私有子网中的 EC2 实例执行调用操作
  6. \n
\n