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

上次更新时间:2020 年 5 月 8 日

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

简短描述

在一个账户(“账户A”)中的 Amazon Virtual Private Cloud (Amazon VPC) 中创建接口终端节点。在另一个账户(“账户 B”)中,使用允许接口终端节点中的调用来调用的资源策略创建 API Gateway 私有 REST API。

解决方法

在账户 A 中创建一个接口终端节点

1.    在账户 A 中,打开 Amazon VPC 控制台的终端节点页面

2.    选择创建终端节点

3.    在创建终端节点页面执行以下操作:
对于服务类别,选择 AWS 服务
对于 VPC,选择您希望在其中创建接口终端节点的 Amazon VPC。
对于子网,选择您希望在其中创建终端节点网络接口的子网。在不同可用区中选择多个子网,以确保您的接口终端节点可弹性应对可能的可用区故障。
对于启用 DNS 名称,请保持选中为此终端节点启用复选框,从而为接口终端节点启用私有 DNS。启用私有 DNS 后,您可以使用私有或公有 DNS 连接您的私有 API
注意:当您为接口 VPC 终端节点启用私有 DNS 时,您将不能再从 Amazon VPC 访问 API Gateway 公有 API。有关更多信息,请参阅我从 VPC 连接到 API Gateway API 时,为什么会收到 HTTP 403 禁止错误?
对于安全组,请至少选择一个安全组来与终端节点网络接口关联。您选择的安全组必须有一个规则,该规则允许来自 Amazon VPC 内的 IP 地址范围或 Amazon VPC 中的另一个安全组的 TCP 端口 443 入站 HTTPS 流量。如果您没有符合这些要求的安全组,请选择创建新安全组创建安全组。如果您没有指定安全组,则将默认安全组与终端节点网络接口关联。
对于策略,请选择完全访问
选择创建终端节点
对于服务名称,请选择 API Gateway 服务终端节点。它类似于 com.amazonaws.region.execute-api,且 region 被替换为您当前的AWS 区域。例如,com.amazonaws.us-east-1.execute-api

4.    复制您的新接口终端节点的 VPC 终端节点 ID。它类似于 vpce-1a2b3c456d7e89012。在创建和配置私有 API 时,您需要此 ID。

5.    选择关闭

6.    在 Amazon VPC 控制台的终端节点页面上,在详细信息选项卡中,记下 DNS 名称。复制您的接口终端节点的公有 DNS 名称。它类似于 vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com

有关更多信息,请参阅为 API Gateway execute-api 创建接口 VPC 终端节点

在账户 B 中创建私有 REST API

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

2.    选择创建 API

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

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

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

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

7.    选择创建 API

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

为您的私有 REST 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.    在资源窗格中,选择操作,然后选择创建方法

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

4.    在 /- ANY – 设置窗格中,为集成类型选择模拟。模拟集成会响应任何到达它的请求,这有助于以后进行测试。

5.    选择保存

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

部署您的私有 REST API

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

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

3.    在阶段编辑器窗格中,用您的 私有 API 的调用 URL 记录消息(“如果私有 DNS 启用,请使用此 URL:”)。复制 URL 进行测试。

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

在账户 A 中测试您的私有 API

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

2.    连接到 EC2 实例

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

3.    从 EC2 实例的命令行中,使用以下任一 curl 命令调用账户 B 中的私有 API。有关 curl 的更多信息,请参阅 cURL 项目网站

私有 DNS 名称:

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 别名:

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 名称:

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

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

带有 x-apigw-api-id 标头的公有 DNS 名称:

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。

有关更多信息,请参阅使用特定于终端节点的公有 DNS 主机名调用您的私有 API

4.    查看命令输出。如果连接成功,您会从 API Gateway 收到一个 200 OK 响应。