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

在 Amazon API Gateway 中创建私有 API

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

通过使用资源策略,您可以允许或拒绝从选定的 VPC 和 VPC 终端节点(包括跨 Amazon 账户)对您的 API 进行访问。每个终端节点都可用于访问多个私有 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。

  • 私有 API 的 VPC 终端节点与其他接口 VPC 终端节点的限制相同。有关更多信息,请参阅《Amazon VPC 用户指南》中的接口终端节点属性和限制

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

为 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并打开 Amazon VPC 控制台,网址:https://console.aws.amazon.com/vpc/

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

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

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

    对于 Type,请确保它指示 Interface

  5. 完成以下信息:

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

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

      注意

      并非所有可用区都支持所有 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。

      要使用私有 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. API Name(API 名称)中输入名称。

  5. 终端节点类型选择 Private

  6. 选择 Create API (创建 API)

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

注意

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

使用 Amazon CLI 创建私有 API

要使用 Amazon CLI 创建私有 API,请调用 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 设置资源策略。

使用适用于 JavaScript 的 Amazon 开发工具包创建私有 API

要使用适用于 JavaScript 的 Amazon 开发工具包创建私有 API,请执行以下操作:

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中的说明。在步骤 4 中,选择 源 VPC 示例。将 {{vpceID}}(包括大括号)替换为您的 VPC 终端节点 ID,然后选择 Save (保存) 以保存您的资源策略。

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

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

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

  1. 在左侧导航窗格中,选择所需 API,然后从 Actions (操作) 下拉菜单中选择 Deploy API (部署 API)

  2. Deploy API (部署 API) 对话框中,选择一个阶段(对于 API 的首次部署,选择 [New Stage])。在 Stage name (阶段名称) 输入字段中,输入名称(例如“test”、“prod”或“dev”)。(可选)在 Stage description (阶段描述) 和/或 Deployment description (部署描述) 中,提供描述。然后选择 Deploy (部署)

将 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 控制台、Amazon CLI 或适用于 API Gateway 的Amazon开发工具包执行此更改。由于 DNS 传播,更新操作可能需要几分钟才能完成。在这段时间内,您的 API 将可用,但新生成的 DNS URL 的 DNS 传播可能仍在进行中。如果几分钟后您的新 URL 仍无法在 DNS 中解析,可以尝试为您的 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" }

使用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" }