通过VPC端点的AWS专用API网关

drg*_*rgn 5 amazon-web-services aws-api-gateway

首先,我对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(找不到)

现在,我想添加一个API网关来添加一些AWS lambda。我创建了所说的API并作为端点类型->私有

遵循以下步骤:官方文档 将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>"
    }
]
Run Code Online (Sandbox Code Playgroud)

}

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

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

最后的问题:

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

https://<API GATEWAY ID>.<REGION>.amazonaws.com/<MY STAGE>/<MY RESOURCE>
Run Code Online (Sandbox Code Playgroud)

好!让我们调用该URL:APIURL我在公共子网中SSH到EC2实例并运行以下命令:

curl https://$APIURL
Run Code Online (Sandbox Code Playgroud)

工作正常:输出:“工作正常!” 但是该APIURL似乎不是来自VPC端点,因此我尝试了以下操作(仍然来自公共子网EC2):

curl https://vpce-XXXXXXX-XXXX.execute-api.REGION.vpce.amazonaws.com/<MY STAGE>/<MY RESOURCE>
Run Code Online (Sandbox Code Playgroud)

我得到:{“ 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>"
    }
]
Run Code Online (Sandbox Code Playgroud)

}

一切都没有改变。APIURL仍然有效,VPCE Url仍然禁止我访问。

我究竟做错了什么?对于长期的帖子,我深表歉意。

mat*_*bet 6

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

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

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