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

时间:2019-03-28 19:58:24

标签: 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,并将其作为端点类型->私有

此之后: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>

好!让我们调用该网址: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仍然禁止我访问。

我在做什么错?我很长的道歉。

2 个答案:

答案 0 :(得分:1)

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

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

  

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

答案 1 :(得分:0)

由于您的API网址正常工作,因此该政策似乎有问题。
在IAM策略中,拒绝权限将覆盖允许权限。尝试将您的政策更改为以下内容:

{
    "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/