【问题标题】:AWS private API Gateway through VPC Endpoint通过 VPC 端点的 AWS 私有 API 网关
【发布时间】:2019-08-19 17:11:27
【问题描述】:

首先,我对 AWS 非常陌生。 这是我想要实现的目标:

  • 1 个 VPC
    • 2 子网
      • 1 个包含一些 EC2 实例的公共
      • 1 个私有的,包含一个只能由 EC2 实例访问的 API 网关

公共子网运行良好,我可以访问 SSH 和 HTTP。 私有子网给我带来了一些麻烦。出于调试目的,我在其中启动了一个 EC2 实例。从“公共实例”之一我可以 ping 通“私有实例”私有 IP(显然没有公共 IP)

按照文档,我在我的私有子网中创建了一个 VPC 端点,该端点创建了一个网络接口,我在其中附加了一个安全组,该安全组允许来自整个 VPC CIDR 的 HTTP(S)(80 和 443)。端点类型为接口

所以,现在我有一个带有端点的私有子网,它允许 HTTP(S) 流量。该端点有一些(私有)DNS NAME 和(可能)还有一个私有 IP(找不到它)

现在我想在一些 AWS lambda 前面添加一个 API 网关。 我创建了上述 API 并作为端点类型 -> 私有

关注这个:Official Documentation 将 API 网关“链接”到 VPC 端点的“唯一”方法是添加资源策略。所以我输入以下内容

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:<REGION>:<MY ID>:<API GATEWAY ID>/*/*/<MY RESOURCE>",
        "Condition": {
            "StringNotEquals": {
                "aws:sourceVpce": "<VPC ENDPOINT ID>"
            }
        }
    },
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:<REGION>:<MY ID>:<API GATEWAY ID>/*/*/<MY RESOURCE>"
    }
]

}

为了完整起见,这里是我的 lambda (python3.6):

from __future__ import division
def lambda_handler(event, context):
  return {
      "statusCode":200,
      "headers": {"Content-Type": "application/json" },
      "body" : "It work!"
  }

终于有问题了:

调用此 REST Api 的 URL 是什么! API 网关(在 lamdba 控制台中)告诉我这个:

https://<API GATEWAY ID>.<REGION>.amazonaws.com/<MY STAGE>/<MY RESOURCE>

好的!让我们调用那个 url:APIURL 我 ssh 到公共子网中的 EC2 实例并运行以下命令:

curl https://$APIURL

它起作用了:它输出:“它起作用了!”但该 APIURL 似乎并非来自 VPC 端点,因此我尝试以下操作(仍来自公共子网 EC2):

curl https://vpce-XXXXXXX-XXXX.execute-api.REGION.vpce.amazonaws.com/<MY STAGE>/<MY RESOURCE>

我得到:{"message":"Forbidden"}

这似乎不对。在我测试时,我更改了以下 API 网关资源策略:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:<REGION>:<MY ID>:<API ID>/*/*/<MY RESOURCE>"
    }
]

}

什么都没有改变。 APIURL 仍然有效,VPCE Url 仍然给我禁止。

我做错了什么?对于这篇长篇文章,我深表歉意。

【问题讨论】:

  • 如果你更新了资源策略,你需要重新部署你的api。否则,更改将无效。
  • 尽管为遇到类似问题的人提供了有用的信息,但没有提供任何答案真正回答它。我认为问题在于“重新部署”它,以便采用新配置。您能否根据您的评论提供答案,以便我接受?
  • 绝对——添加了答案。

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


【解决方案1】:

在将 api 部署到阶段之前,策略角色更新不会生效。

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-resource-policies-create-attach.html

如果您在创建 API 后更新资源策略,则需要在附加更新后的策略后部署 API 以传播更改。

【讨论】:

    【解决方案2】:

    由于您的 API 网址运行良好,因此该政策似乎存在问题。
    在 IAM 政策中,Deny 权限将覆盖 Allow 权限。尝试将您的政策更改为以下内容:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "execute-api:Invoke",
                "Resource": [
                    "arn:aws:execute-api:region:account-id:api-id/*",
                "Condition": {
                  "StringEquals":{
                                 "aws:SourceVpce": "<VPC Endpoint ID>"
                             }
                           }
                        ]
            },
            {
                "Effect": "Deny",
                "Principal": "*",
                "Action": "execute-api:Invoke",
                "Resource": [
                    "arn:aws:execute-api:region:account-id:api-id/*"
                ],
                "Condition" : {
                    "StringNotEquals": {
                        "aws:SourceVpce": "<VPC Endpoint ID>"
                    }
                }
            }
        ]
    }
    

    如需进一步参考,请点击此链接:
    https://aws.amazon.com/blogs/compute/introducing-amazon-api-gateway-private-endpoints/

    【讨论】:

    • 其实这不是IAM Policy,而是API Gateway中的Resource Policy。 (API -> MyApi -> 资源策略)。当我改变它以否认一切时它仍然有效。我应该能够使用 VPCE DNS 访问资源吗?
    • 据我所知,我可以在资源策略中输入一个 Pie recipes(只要它是有效的 json),它的行为方式也是一样的。似乎完全忽略了我输入的内容。我肯定错过了什么
    猜你喜欢
    • 2018-08-08
    • 2021-06-22
    • 2020-02-07
    • 2021-06-13
    • 2022-11-04
    • 2021-06-17
    • 2020-12-08
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多