如何使用接口 VPC 终端节点在另一个 AWS 账户中访问 API Gateway 私有 REST API?

上次更新日期:2021 年 10 月 11 日

我想要使用接口 VPC 终端节点访问另一个 AWS 账户中的 Amazon API Gateway 私有 REST API。该如何进行设置?

简短描述

要使用接口 VPC 终端节点访问另一个 AWS 账户中的 API Gateway 私有 REST API,请执行以下操作:

  1. 在一个账户(账户 A)中的 Amazon Virtual Private Cloud (Amazon VPC) 中创建接口终端节点。
  2. 在第二个账户(账户 B)中创建 API Gateway 私有 REST API。
  3. 为私有 REST API 配置资源策略,允许接口终端节点调用 API。
  4. 为私有 REST API 设置方法。
  5. 部署私有 REST API。
  6. 通过从账户 A 调用私有 REST API 来测试设置。

解决方法

在一个账户(账户 A)中的 Amazon VPC 中创建接口终端节点。

创建新的接口 VPC 终端节点

在账户 A 中,按照为 API Gateway execute-api 创建接口 VPC 终端节点中的说明操作。

重要提示:对于 Policy (策略),请选择 Full access (完全访问)。最佳做法是使用 VPC 终端节点策略限制通过 API ID 对终端节点的访问。使用 API Gateway 资源策略限制委托人对终端节点的访问也是一种最佳实践。有关授予最小权限的安全建议的更多信息,请参阅 IAM 用户指南中的授予最小权限

创建接口终端节点时,请考虑以下事项:

检索接口终端节点的 VPC 终端节点 ID

选择Create endpoint (创建终端节点) 并创建接口终端节点之后,将显示 VPC 终端节点 ID。复制新接口终端节点的 VPC 终端节点 ID(例如:vpce-1a2b3c456d7e89012)。选择 Close (关闭)

注意:在创建和配置私有 REST API 时,您需要此 ID。

检索接口终端节点的公有 DNS 名称

选择 Close (关闭) 后,Amazon VPC 控制台将打开 Endpoints (终端节点) 页面。在 Endpoints (终端节点) 页面 Details (详细信息) 选项卡的 DNS names (DNS 名称) 列中,查找并复制接口终端节点的公有 DNS 名称。例如:vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com

在第二个账户(账户 B)中创建 API Gateway 私有 REST API

1.    在账户 B 中,打开 API Gateway 控制台

2.    选择创建 API

3.    在 REST API 私有下,选择构建

4.    在创建页面上,将选择协议的设置留为 REST

5.    对于创建新的 API,选择新建 API

6.    在设置下,执行以下操作:
对于 API 名称,输入 API 的名称。
(可选)对于描述,输入 API 的描述。
Endpoint Type (终端节点类型) 设置留为 Private (私有)
对于 VPC Endpoint IDs (VPC 终端节点 ID),请粘贴接口终端节点 ID。然后选择 Add (添加)
注意:当您将您的接口终端节点与您的私有 REST API 关联时,API Gateway 会生成新的 Amazon Route 53 别名记录。您可以使用 Route 53 别名访问您的私有 API

7.    选择创建 API

有关更多信息,请参阅在 Amazon API Gateway 中创建私有 API

为私有 REST API 配置资源策略,允许接口终端节点调用 API

1.    在 API Gateway 控制台的左侧导航窗格中,在您的 API 下,选择资源策略

2.    在资源策略 页面上,将以下示例资源策略粘贴到文本框中:

注意:vpce-1a2b3c456d7e89012 替换为您复制的接口终端节点 ID。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/*/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-1a2b3c456d7e89012"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/*/*"
        }
    ]
}

有关更多信息,请参阅为私有 API 设置资源策略

为私有 REST API 设置方法

1.    在 API Gateway 控制台的左侧导航窗格中,在您的 API 下,选择资源

2.    在 Resources (资源) 窗格中,选择 Actions (操作)。然后,选择 Create Method (创建方法)

3.    在 / resource 节点下的下拉列表中,选择 ANY。然后,选择复选标记图标。

4.    在 / - ANY - Setup (/– 任何 – 设置) 窗格中,为 Integration type (集成类型) 选择 Mock (模拟)
注意:模拟集成会响应任何到达它的请求。此响应有助于进行测试。

5.    选择 Save(保存)。

有关更多信息,请参阅在 API Gateway 中设置 REST API 方法

部署私有 REST API

1.    在 API Gateway 控制台资源窗格中,选择操作,然后选择部署 API

2.    在部署 API 对话框中,执行以下操作:
对于部署阶段,选择 [新建阶段]
阶段名称部分输入名称。例如,devtest
选择部署

3.    在 Stage Editor (阶段编辑器) 窗格中,查找包含私有 REST API 的调用 URL 的消息(“如果私有 DNS 启用,请使用此 URL:”)。然后,复制 URL。
注意:您可以使用私有 REST API 的调用 URL 来测试设置。

有关更多信息,请参阅使用 API Gateway 控制台部署私有 API

通过从账户 A 调用私有 REST API 来测试设置

1.    在账户 A 中,在与接口终端节点相同的 Amazon VPC 中启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例
重要提示:在设置期间,选择与您的接口终端节点关联的现有安全组

2.    连接到此 Amazon EC2 实例

注意:您的 AWS 账户可能会产生 Amazon EC2 实例费用。如果您创建了一个仅用于测试此设置的实例,完成后请终止实例,以免产生经常性费用。

3.    从 Amazon EC2 实例的命令行中,使用以下任一 curl 命令调用账户 B 中的私有 REST API。
注意:有关更多信息,请参阅使用特定于终端节点的公有 DNS 主机名调用您的私有 API。如需关于 curl 的更多信息,请参见 curl 项目网站

使用私有 DNS 名称调用 API

curl -i https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name

注意:请将 https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name 替换为您从 API Gateway 控制台中复制的私有 API 的调用 URL。此命令仅在您为接口终端节点启用私有 DNS 时起作用。有关更多信息,请参阅使用私有 DNS 名称调用私有 API

使用 Route 53 别名调用 API

curl -i https://a1bc234d5e-vpce-1a2b3c456d7e89012.execute-api.region.amazonaws.com/stage-name

注意:请将 a1bc234d5e 替换为您的 API 的 ID。
vpce-1a2b3c456d7e89012 替换为接口终端节点 ID。
region 替换为您的 API 的区域。(例如,us-east-1。)
stage-name 替换为您部署私有 API 所在阶段的名称。有关更多信息,请参阅使用 Route 53 别名访问您的私有 API

使用带主机标头的公有 DNS 名称调用 API

curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "Host: a1bc234d5e.execute-api.region.amazonaws.com"

注意:请将 vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com 替换为您在 Amazon VPC 控制台中记录的公有 DNS 名称。
stage-name 替换为您部署私有 API 所在阶段的名称。
a1bc234d5e.execute-api.region.amazonaws.com 替换为 API Gateway 控制台中您的私有 API 的调用 URL。

使用带 x-apigw-api-id 标头的公有 DNS 名称调用 API

curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "x-apigw-api-id:a1bc234d5e"

注意:请将 vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com 替换为您在 Amazon VPC 控制台中记录的公有 DNS 名称。
stage-name 替换为您部署私有 API 所在阶段的名称。
a1bc234d5e 替换为您的 API 的 ID。

4.    查看命令输出。如果连接成功,API Gateway 将返回一个 200 OK 响应。