跨账户使用私有 API 的架构模式

作者: 埃里克·约翰逊 |

这篇博客由高级解决方案架构师托马斯·摩尔和高级解决方案架构师乔什·哈特撰写。

Amazon API Gateway 允许开发人员创建只能从 虚拟私有云 (VPC) 访问的私 有 REST API。私有 API 的流量使用安全连接,不会离开 亚马逊云科技 网络,这意味着 亚马逊云科技 将其与公共互联网隔离开来。这使得私有 API Gateway 端点非常适合发布内部 API,例如后端微服务通信所使用的那些 API。

在多个团队构建和管理组件的微服务架构中,不同的 亚马逊云科技 账户通常使用私有 API 终端节点。

这篇博客文章展示了服务如何使用通过 亚马逊云科技 PrivateLink 安全发布在另一个 亚马逊云科技 账户中的 有 API 网关终端节点。

Consuming API Gateway private endpoint cross-account via AWS PrivateLink.

通过 亚马逊云科技 PrivateLink 跨账户使用 API Gateway 私有终端节点。

本博客介绍了跨账户使用 API 网关终端节点。要公开 API 网关背后的跨账户资源,请阅读 这篇现有的博客文章

概述

要访问 API Gateway 私有终端节点,您必须在您的 VPC 内创建接口 VPC 终端节点(名为 execute-api)。这将在您的 亚马逊云科技 账户 VPC 和 API Gateway 服务 VPC 之间创建一个 亚马逊云科技 PrivateLink 连接。PrivateLink 连接允许流量在不通过互联网的情况下流经私有 IP 地址空间。

PrivateLink 允许访问不同 亚马逊云科技 账户中的私有 API 网关终端节点,无需使用 VPC 对等、VPN 连接或 AW S Transit Gateway。 无论目标 API 网关位于哪个 亚马逊云科技 账户,都使用单个 execute-api 终端节点连接到任何 API 网关。 资源策略 控制哪些 VPC 终端节点可以访问 API Gateway 私有终端节点。这使得跨账户架构变得更简单,没有复杂的路由或 vpc 间连接。

下图显示了消费者账户中的接口 VPC 终端节点如何创建回到 API Gateway 服务账户 VPC 的 PrivateLink 连接。应用于私有 API 的资源策略决定哪个 VPC 终端节点可以访问该 API。因此,确保资源策略正确无误以防止来自其他 亚马逊云科技 账户 VPC 终端节点的意外访问至关重要。

Access to private API Gateway endpoints requires an AWS PrivateLink connection to an AWS service account VPC.

访问私有 API 网关终端节点需要通过 亚马逊云科技 PrivateLink 连接到 亚马逊云科技 服务账户 VPC。

在此示例中,资源策略拒绝与私有 API 端点的所有连接,除非账户 A 中的 aws: sourcevpce 条件与 vpce-1a2b3c4d 相匹配。这意味着来自其他 execute-api VPC 端点的连接将被拒绝。要允许账户 B 进行访问,请将 vpce-9z8y7x6w 添加到资源策略中。请参阅 文档 ,了解您可以在 API Gateway 资源策略中使用的其他条件密钥。

有关 VPC 链接工作原理的更多详细信息,请参阅 了解 Amazon API Gateway 私有集成 中的 VPC 链接

以下部分涵盖了跨账户使用 API Gateway 私有端点的三种架构模式:

  1. 从区域 API 网关到私有 API 网关
  2. Lambda 函数在另一个账户中调用 API 网关
  3. 容器微服务使用 mTLS 在另一个账户中调用 API Gateway

区域 API 网关到私有 API 网关跨账户

在不同的 亚马逊云科技 账户中构建微服务时,通常使用私有 API Gateway 终端节点来允许服务间通信。有时,这些端点的一部分必须公开以供最终用户使用。其中一种模式是拥有一个中央公共 API 网关,该网关充当多个私有 API 网关端点的前门。这允许对身份验证、记录和监控进行集中管理。

下图显示了如何使用 VPC 链接实现此目的。VPC 链接使您能够将 API 网关集成连接到 VPC 内的私有资源。API Gateway VPC 接口终端节点是您想要连接的 VPC 资源,因为这将流量路由到不同 亚马逊云科技 账户中的私有 API 网关终端节点。

API Gateway Regional endpoint consuming API Gateway private endpoints cross-account

API 网关区域终端节点使用 API 网关私有终端节点跨账户

VPC 链接需要使用 网络负载均衡器 (NLB)。NLB 的目标组指向 VPC 终端节点的私有 IP 地址,通常每个可用区一个。目标组运行状况检查必须验证 API Gateway 服务是否在线。您可以为此使用 API Gateway 保留的 /ping 路径,该路径会在服务运行正常时返回 200 的 HTTP 状态码。

您可以使用在 GitHub 上找到的示例 CDK 代码在自己的账户中部署此模式。

Lambda 函数调用私有 API 网关跨账户

另一个受欢迎的要求是, 亚马逊云科技 L am bda 函数必须跨账户调用私有 API 网关终端节点。这支持微服务架构中的服务间通信。

下图显示了如何使用 Lambda 的 接口终端节点 实现此目的 ,它允许访问您的 VPC 内的私有资源。这允许 Lambda 访问 API 网关 VPC 终端节点,从而访问另一个账户中的私有 API 网关终端节点。

Consuming API Gateway private endpoints from Lambda cross-account

使用来自 Lambda 跨账户的 API 网关私有端点

与前面的示例不同,不需要 NLB 或 VPC 链接。私有 API 网关上的资源策略必须允许从使用者 Lambda 函数所在的账户中的 VPC 终端节点进行访问。

由于 Lambda 函数具有 VPC 附件,因此它将使用 VPC 内部的 DNS 解析。这意味着,如果您在为 API Gateway 创建接口 VPC 终端节点时选择了 “启用私有 DNS 名称” 选项,那就是 https://{restapi-id}.execute-api。{区域} .amazonaws.com 终端节点将自动解析为私有 IP 地址。请注意,此 DNS 配置可以阻止从 VPC 内部的区域和边缘优化 API 端点进行访问。有关更多信息,请参阅 知识中心文章

您可以使用在 GitHub 上找到的示例 CDK 代码在自己的账户中部署此模式。

使用双向 TLS (mTLS) 跨账户调用私有 API 网关

在开放银行等受监管行业开展业务的客户通常必须实现双向 TLS (mTL) 才能安全地访问其 API。它也非常适合物联网 (IoT) 应用程序使用数字证书对设备进行身份验证。

Mutual TLS (mTLS) verifies both the client and server via certificates with TLS

双向 TLS (mTLS) 通过带有 TLS 的证书对客户端和服务器进行验证

区域 API 网关 原生支持 mTLS , 但目前,私有 API 网关不支持 mTLS,因此您必须在 API 网关之前终止 mTLS。一种模式是在生产者账户中实现代理服务,该服务可以解析 mTLS 的握手、终止 mTLS,并通过常规 HTTPS 将请求代理到私有 API 网关。

下图显示了如何组合使用 PrivateLink、 基于 NGINX 的代理和私有 API 网关来实现 mTLS 并跨账户使用私有 API。

Consuming API Gateway private endpoints cross-account with mTLS

使用 mTLS 跨账户使用 API 网关私有端点

在此架构图中, Amazon ECS Far gate 用于托管运行 NGINX 代理服务器的容器任务。在通过执行代理 VPC 端点将连接传递给 API Gateway 之前,此代理会验证连接客户端传递的证书。以下 NGINX 配置示例,通过使用 ssl_verify_client 和 ssl_client_client_client_cretify_client_cretify 设置来验证连接的客户端的证书,并使用 proxy_pass 将请求转发到 API Gateway,从而显示 mTLS 代理服务是如何工作的。

server {
    listen 443 ssl;

    ssl_certificate     /etc/ssl/server.crt;
    ssl_certificate_key /etc/ssl/server.key;
    ssl_protocols       TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_client_certificate /etc/ssl/client.crt;
    ssl_verify_client      on;

    location / {
        proxy_pass https://{api-gateway-endpoint-api};
    }
}

通过 VPC 终端节点服务连接到 API 时,连接客户端必须提供客户端证书:

curl --key client.key --cert client.crt --cacert server.crt https://{vpc-endpoint-service-url}

在 VPC 终端节点和 NGINX 代理上使用 VPC 安全组规则,防止客户端绕过 mTLS 端点直接连接到 API 网关端点。

GitHub 存储库中有一个用于配置此解决方案的 NGINX 配置和 Dockerfile 示例。

结论

这篇文章探讨了跨亚马逊云科技账户使用私有API Gateway的三种解决方案。所有解决方案的关键组件是 VPC 接口终端节点。使用 VPC 终端节点和 PrivateLink ,您可以在 亚马逊云科技 账户中安全地使用资源,甚至可以安全地使用自己的微服务。要了解更多详情,请阅读 使用 亚马逊云科技 PrivateLink 启用新的 SaaS 策略。 访问 GitHub 存储库,立即开始实施其中一个解决方案。

如需更多无服务器学习资源,请访问 无服务器世界


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。