在 Amazon API Gateway 中创建私有 API - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon API Gateway 中创建私有 API

使用 Amazon API Gateway,您可以创建私有 REST API,该 API 只能使用接口 VPC 终端节点从 Amazon VPC 中的 Virtual Private Cloud 访问。这是您在 VPC 中创建的终端节点网络接口。

使用资源策略,您可以允许或拒绝从选定的 VPC 和 VPC 终端节点访问您的 API,包括跨 Amazon 账户。每个终端节点都可用于访问多个私有 API。您还可以使用建立从本地网络 Amazon Direct Connect 到 Amazon VPC 的连接,并通过该连接访问您的私有 API。

重要

要限制私有 API 对特定 VPC 或 VPC 端点的访问权限,请向 API 的资源策略添加 aws:SourceVpcaws:SourceVpce 条件。有关示例策略,请参阅 示例:允许基于源 VPC 或 VPC 终端节点的私有 API 流量

在所有情况下,您的私有 API 的流量使用安全的连接,不会离开 Amazon 网络;它与公有 Internet 隔离开来。

您可以通过 API Gateway 的接口 VPC 终端节点(如下图所示)访问您的私有 API。如果您启用了私有 DNS,则可以使用私有或公有 DNS 名称来访问您的 API。如果您禁用了私有 DNS,则只能使用公有 DNS 名称。

注意

API Gateway 私有 API 仅支持 TLS 1.2。不支持早期 TLS 版本。

概括来说,创建私有 API 的步骤如下所示:

  1. 首先,在您的 VPC 中为 API 执行(称为 execute-api)的 API Gateway 组件服务创建接口 VPC 终端节点

  2. 创建并测试您的私有 API。

    1. 使用以下程序之一创建 API:

    2. 要授予对您的 VPC 终端节点的访问权限,请创建一个资源策略并将其附加到您的 API

    3. 测试您的 API

注意

下面的过程假定您已经有了一个完全配置的 VPC。有关更多信息以及开始创建 VPC,请参阅《Amazon VPC 用户指南》中的 Amazon VPC 入门

私有 API 开发注意事项

  • 您可以将现有的公有 API(区域或边缘优化)转换为私有 API,并且可以将私有 API 转换为区域 API。您不能将私有 API 转换为边缘优化 API。有关更多信息,请参阅 在 API Gateway 中更改公有或私有 API 端点类型

  • 要向 VPC 和 VPC 终端节点授予对私有 API 的访问权限,您需要创建一个资源策略并将其附加到新创建的(或转换的)API 中。在您执行此操作之前,所有对 API 的调用都将失败。有关更多信息,请参阅 为私有 API 设置资源策略。

  • 私有 API不支持自定义域名。

  • 您可以使用单个 VPC 终端节点访问多个私有 API。

  • 您可以将 VPC 终端节点与 REST API 关联或取消关联,这会提供 Route 53 别名 DNS 记录并简化调用私有 API 的过程。有关更多信息,请参阅将 VPC 终端节点与私有 REST API 关联或取消关联

注意

私有 API 的 VPC 终端节点与其他接口 VPC 终端节点的限制相同。有关更多信息,请参阅《Amazon PrivateLink 指南》中的接口端点属性和限制。有关将 API Gateway 用于共享 VPC 和共享子网的更多信息,请参阅《Amazon PrivateLink 指南》中的共享子网

为 API Gateway execute-api 创建接口 VPC 终端节点

API 执行的 API Gateway 组件服务称为 execute-api。要在部署私有 API 后访问它,您需要在 VPC 中为其创建接口 VPC 终端节点。

创建 VPC 终端节点之后,您便可以使用它来访问多个私有 API。

为 API Gateway execute-api 创建接口 VPC 终端节点
  1. 登录 Amazon Web Services Management Console 并打开亚马逊 VPC 控制台,网址为 https://console.aws.amazon.com/vpc/

  2. 在导航窗格中,选择 EndpointsCreate Endpoint

  3. 对于 Service category (服务类别),请确保选中 Amazon services (Amazon 服务)

  4. 服务名称中,选择 API Gateway 服务终端节点,包括您要连接的 Amazon 区域。其形式为 com.amazonaws.region.execute-api,例如 com.amazonaws.us-east-1.execute-api

    对于 Type,请确保它指示 Interface

  5. 完成以下信息:

    • 对于 VPC,选择要在其中创建终端节点的 VPC。

    • 对于子网,选择要在其中创建终端节点网络接口的子网(可用区)。要提高 API 的可用性,请选择多个子网。

      注意

      并非所有可用区都支持所有 Amazon 服务。

    • 对于 Enable Private DNS Name (启用私有 DNS 名称),请保持此复选框处于选中状态。默认情况下将启用私有 DNS。

      当启用私有 DNS 时,您能够通过私有或公有 DNS 访问您的 API。(此设置不影响谁可以访问您的 API,只影响他们可以使用哪些 DNS 地址。) 但是,您无法通过使用启用了私有 DNS 的 API Gateway VPC 终端节点从 VPC 访问公有 API。请注意,如果您使用边缘优化的自定义域名来访问公有 API,则这些 DNS 设置不会影响从 VPC 调用这些公有 API 的功能。使用边缘优化的自定义域名来访问您的公有 API(同时使用私有 DNS 访问您的私有 API)是从 VPC 访问公有和私有 API 的一种方法,其中的终端节点是在启用了私有 DNS 的情况下创建的。

      注意

      保持启用私有 DNS 是推荐的选择。如果您选择不启用私有 DNS,您将只能通过公有 DNS 访问您的 API。要了解更多信息,请参阅如何调用私有 API

      要使用私有 DNS 选项,您的 VPC 的 enableDnsSupportenableDnsHostnames 属性必须设置为 true。有关更多信息,请参阅《Amazon VPC 用户指南》中的 VPC 中的 DNS 支持更新对 VPC 的 DNS 支持

    • 对于安全组,选择要与 VPC 终端节点网络接口关联的安全组。

      您选择的安全组必须设置为允许来自您的 VPC 中的 IP 范围或您的 VPC 中的其他安全组的 TCP 端口 443 入站 HTTPS 通信。

  6. 选择Create endpoint

使用 API Gateway 控制台创建私有 API

使用 API Gateway 控制台创建私有 API
  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择 Create API (创建 API)

  3. REST API 下,选择 Build (生成)

  4. 对于名称,输入名称。

  5. (可选)对于描述,输入描述。

  6. 对于 API 端点类型,选择私有

  7. 选择 Create API (创建 API)

从这里开始,您可以设置 API 方法及其关联集成,如 的步骤 1-6 中所述使用 HTTP 自定义集成创建 API

注意

除非您的 API 有一个资源策略来授予对您的 VPC 或 VPC 终端节点的访问权限,否则所有 API 调用都将失败。测试并部署您的 API 之前,您需要创建资源策略并将其附加到 API,如 中所述为私有 API 设置资源策略。

使用创建私有 API Amazon CLI

要使用创建私有 API Amazon CLI,请调用以下create-rest-api命令:

aws apigateway create-rest-api \ --name 'Simple PetStore (Amazon CLI, Private)' \ --description 'Simple private PetStore API' \ --region us-west-2 \ --endpoint-configuration '{ "types": ["PRIVATE"] }'

成功调用返回类似于以下内容的输出:

{ "createdDate": "2017-10-13T18:41:39Z", "description": "Simple private PetStore API", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (Amazon CLI, Private)" }

从这里开始,您可以按照使用 Amazon CLI 命令设置边缘优化的 API中提供的相同说明来为此 API 设置方法和集成。

当您准备好测试 API 时,请确保创建资源策略并将其附加到 API,如中所述为私有 API 设置资源策略。

使用 Amazon SDK 创建私有 API JavaScript

要使用 Amazon SDK 创建私有 API,请执行 JavaScript以下操作:

apig.createRestApi({ name: "Simple PetStore (node.js SDK, private)", endpointConfiguration: { types: ['PRIVATE'] }, description: "Demo private API created using the Amazon SDK for node.js", version: "0.00.001" }, function(err, data){ if (!err) { console.log('Create API succeeded:\n', data); restApiId = data.id; } else { console.log('Create API failed:\n', err); } });

成功调用返回类似于以下内容的输出:

{ "createdDate": "2017-10-13T18:41:39Z", "description": "Demo private API created using the Amazon SDK for node.js", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (node.js SDK, private)" }

完成前面的步骤之后,您可以按照使用适用于 Node.js 的 Amazon 开发工具包设置边缘优化的 API中的说明来为此 API 设置方法和集成。

当您准备好测试 API 时,请确保创建资源策略并将其附加到 API,如中所述为私有 API 设置资源策略。

为私有 API 设置资源策略。

在访问您的私有 API 之前,您需要创建一个资源策略并将其附加到 API。这会授予从您的 VPC 和 VPC 终端节点或您明确授予访问权限的其他 Amazon 账户中的 VPC 和 VPC 终端节点访问 API 的权限。

为此,请遵循创建 API Gateway 资源策略并将其附加到 API中的说明。在步骤 5 中,选择源 VPC 示例。将 {{vpceID}}(包括大括号)替换为您的 VPC 终端节点 ID,然后选择 Save (保存) 以保存您的资源策略。

您还应考虑将终端节点策略附加到 VPC 终端节点来指定要授予的访问权限。有关更多信息,请参阅 在 API Gateway 中为私有 API 使用 VPC 终端节点策略

使用 API Gateway 控制台部署私有 API

要部署您的私有 API,请在 API Gateway 控制台中执行以下操作:

  1. 选择 API。

  2. 选择部署 API

  3. 对于阶段,选择新建阶段

  4. 对于阶段名称,输入阶段名称。

  5. (可选)对于描述,输入描述。

  6. 选择部署

将 VPC 终端节点与私有 REST API 关联或取消关联

当您将 VPC 终端节点与私有 API 关联时,API Gateway 将生成新的 Route 53 别名 DNS 记录。您可以使用此记录调用私有 API,就像使用边缘优化或区域 API 一样,而无需覆盖 Host 标头或传递 x-apigw-api-id 标头。

生成的基本 URL 采用以下格式:

https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}

将 VPC 终端节点与私有 REST API 关联或取消关联要求您更新 API 的配置。您可以使用 API Gateway 控制台、CLI 或适用于 AP Amazon I Gateway 的 Amazon 软件开发工具包来执行此更改。由于 DNS 传播,更新操作可能需要几分钟才能完成。在这段时间内,您的 API 将可用,但新生成的 DNS URL 的 DNS 传播可能仍在进行中。如果几分钟后您的新 URL 仍无法在 DNS 中解析,可以尝试为您的 API 创建新部署

使用 API Gateway 控制台将 VPC 端点与私有 REST API 关联

将其他 VPC 端点与私有 API 关联
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择您的私有 API。

  3. 在主导航窗格中,选择资源策略

  4. 编辑您的资源策略以允许来自其他 VPC 端点的调用。

  5. 在主导航窗格中,选择 API 设置

  6. API 详细信息部分中,选择编辑

  7. 对于 VPC 端点 ID,请选择其他 VPC 端点 ID。

  8. 选择保存

  9. 重新部署 API 以使更改生效。

使用 Amazon CLI 将 VPC 终端节点与私有 REST API 关联

要在创建 API 时关联 VPC 终端节点,请使用以下命令:

aws apigateway create-rest-api \ --name Petstore \ --endpoint-configuration '{ "types": ["PRIVATE"], "vpcEndpointIds" : ["vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee"] }' \ --region us-west-2

输出将与以下内容类似:

{ "apiKeySource": "HEADER", "endpointConfiguration": { "types": [ "PRIVATE" ], "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee" ] }, "id": "u67n3ov968", "createdDate": 1565718256, "name": "Petstore" }

要将 VPC 终端节点与已创建的私有 API 关联,请使用以下 CLI 命令:

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

输出将与以下内容类似:

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

使用 API Gateway 控制台将 VPC 端点与私有 REST API 取消关联

将 VPC 端点与私有 REST API 取消关联
  1. 通过以下网址登录到 API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择您的私有 API。

  3. 在主导航窗格中,选择资源策略

  4. 编辑您的资源策略,对于您要与私有 API 取消关联的 VPC 端点,删除提及该端点的内容。

  5. 在主导航窗格中,选择 API 设置

  6. API 详细信息部分中,选择编辑

  7. 对于 VPC 端点 ID,选择 X 以与 VPC 端点取消关联。

  8. 选择保存

  9. 重新部署 API 以使更改生效。

使用 Amazon CLI 将 VPC 端点与私有 REST API 取消关联

要从私有 API 取消关联 VPC 终端节点,请使用以下 CLI 命令:

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='remove',path='/endpointConfiguration/vpcEndpointIds',value='vpce-0393a628149c867ee'" \ --region us-west-2

输出将与以下内容类似:

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }