如何通过本地/ VPN访问私有API网关?

时间:2019-05-21 21:18:13

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

我创建了一个API网关来运行Lambda函数。这旨在用作内部服务,因此我的API网关是私有的。为了使API网关可以私有访问,我执行了以下操作:

  1. 在我们的VPC的两个子网中创建了VPC端点
  2. 将端点添加到仅允许来自本地的流量的安全组
  3. 向API网关添加了仅允许来自VPC端点的请求的资源策略

这些步骤有效地阻止了公共请求,并允许通过VPC端点创建的DNS名称来自本地的请求。

此方法的问题在于,要调用API,必须在请求中指定Hostx-apigw-api-id。目标是使用户能够在其浏览器上运行,键入URL和查询字符串参数,并从服务中获得响应。

Amazon API Gateway types, use cases and performance讨论了一种避免必须指定API ID或主机的方法,但是它没有提供太多细节。相关部分说解决方案将是:

  

将带有SSL证书(例如api.mydomain.com)的Application Load Balancer放在PrivateLink网络接口的IP地址之前。还要为api.mydomain.com部署自定义域名,并为API网关部署基本路径映射。然后添加一条Route 53记录,该记录将api.mydomain.com用作您的ALB的别名。该解决方案非常复杂,但是我们已经对其进行了测试,并且可以正常工作。描述完整的解决方案不在本文的讨论范围之内,但是我们稍后可能会写一篇单独的博客文章。

有人知道该怎么做或其他方法吗?

2 个答案:

答案 0 :(得分:0)

我找到了这个问题的答案,所以我认为我应该分享它,以防其他人想知道如何做到这一点。我与上面写这篇文章的人联系,他给了我一些建议。后来他写了一篇文章解释该解决方案,如果我对此的总结感到困惑,您可以在这里阅读他的文章:

https://cloudbanshee.com/blog/connecting-to-private-api-over-vpn-or-vpc-peering

基本上,一旦有了私有API网关VPC端点和ALB,这就是您需要做的:

  • 使用与ALB侦听器相同的证书创建自定义域名
  • 为要连接的API网关的所需阶段添加基本路径映射
  • 添加一个以自定义域名为名称,以ALB DNS为目标的route53记录(或者,如果您有自己的DNS服务器,则在其中添加记录
  • 为ALB创建IP类型的目标组,并为VPC端点添加IP
  • 在ALB侦听器中,创建规则,以在url匹配自定义域名并且路径匹配为API网关定义的基本路径映射时将流量发送到目标组

使我无法实现的事情是基本路径映射。这就是ALB如何知道将流量路由到哪个API网关的方式,而无需知道任何ID或主机名。

我分享的帖子更加详细,写得更好。我建议任何对学习如何私下访问API网关感兴趣的人阅读。

答案 1 :(得分:0)

实现此访问模式的推荐方法是将接口VPC端点与私有API网关明确关联:

aws apigateway update-rest-api \
    --rest-api-id u67n3ov968 \
    --patch-operations "op='add',path='/endpointConfiguration/vpcEndpointIds',value='vpce-01d622316a7df47f9'"
    --region us-east-1

这将创建一个新的公共可解析DNS名称,该名称将解析为VPC终结点专用IP地址:

> nslookup u67n3ov968-vpce-01d622316a7df47f9.execute-api.us-east-1.amazonaws.com    

Non-authoritative answer:
Name:   u67n3ov968-vpce-01d622316a7df47f9.execute-api.us-east-1.amazonaws.com
Address: 10.0.0.200
Name:   u67n3ov968-vpce-01d622316a7df47f9.execute-api.us-east-1.amazonaws.com
Address: 10.0.0.155

本地客户端可以使用此DNS名称来调用专用API网关,而无需传递标头或覆盖主机。