我正在尝试将我们的一个 API 网关设为私有并将其添加到 VPN。阅读 docs,我需要添加一个接口 VPC 终端节点。我已经使用以下地形完成了此操作:
data "aws_vpc_endpoint_service" "execute-api" {
service = "execute-api"
}
resource "aws_vpc_endpoint" "gateway-endpoint" {
vpc_id = data.aws_vpc.shared.id
service_name = data.aws_vpc_endpoint_service.execute-api.service_name
vpc_endpoint_type = "Interface"
private_dns_enabled = true
subnet_ids = toset(data.aws_subnets.private.ids)
security_group_ids = toset([data.aws_security_group.default.id])
}
然后我很高兴地设置我的 API 网关以使其私有,添加资源策略等。
然而,团队中的其他人都在经历地狱,因为事情突然出乎意料地崩溃了。
结果,所有其他 API 网关(配置完全不变)都返回 403,似乎我向 VPC 添加了一个
execute-api
接口,影响了帐户中的所有 API 网关!
这些其他 API 网关不处于私有模式,它们是“边缘优化”的,并且不在 VPC 内:
但是,除非将 lambda 取出到 VPC 之外,否则它们突然无法访问。我是否遗漏了创建此端点会阻止公共网关访问 lambda 的事情?
我有点晚了,但我遇到了完全相同的问题,并且想为将来遇到此问题的人分享一些资源(我只是专门创建此帐户来回答)。
背景
当这种情况发生在我身上时,我发现我通过 Terraform 创建的 VPC 端点覆盖了通用域
*.execute-api.<your-region>.amazonaws.com
。我能够在 AWS 控制台中看到这一点,因为在 Terraform 中我只指定了 execute-api
服务。
此域名被 API Gateway 中的all API 用作默认调用 URL。上面的“*”由您的 API 的唯一 ID 填写(API 的示例调用 URL 通常如下所示:
https://abcdefg.execute-api.<your-region>.amazonaws.com
)。
VPC 接口端点是我设置的,并且根据 VPC 端点上的文档:
接口终端节点可通过 AWS PrivateLink 连接到服务。 ...接口端点是一个或多个具有私有 IP 地址的弹性网络接口的集合,用作发往受支持服务的流量的入口点。
根据我对网络概念的有限理解,这对我来说意味着 AWS 中的整个
execute-api
“服务”现在将通过此 VPC 端点进行路由。我的所有公共和私有 API 都使用此 execute-api
服务作为调用 URL 的一部分。由于我启用了私有 DNS,因此 VPC 外部对我的公共 API 之一的任何调用都会失败。请注意,如果您关闭 VPC 终端节点上启用的私有 DNS,公共 API 将再次工作,但私有 API 现在将中断。
潜在的解决方案:公共 API 的自定义域
我发现的一个选项是将公共 API 切换为使用自定义域,以便它们不再使用通用
execute-api
域。您可以在这里阅读更多相关信息:https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html
对公共 API 使用自定义域意味着只有您的私有 API 使用默认的
execute-api
服务,因此您可以保持 VPC 终端节点不变。
此外,以下是有关为 API 网关自定义域设置 Route 53 记录的一些说明:https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-api-gateway.html
总结
这对我来说也是一个令人沮丧的问题,希望这可以帮助别人比我更快地发现问题......
值得阅读这篇文章 - https://www.winglang.io/blog/2024/02/09/private-api-gateway-aws 它是关于在 10 分钟内创建一个 VPC 后面的 API 网关。