如何使用接口 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. 在创建终端节点页面执行以下操作:
对于 Service category(服务类别),选择 AWS 服务。
对于 Service Name(服务名称),选择 com.amazonaws.<region name>.execute-api。
对于 VPC,选择您希望在其中创建接口终端节点的 Amazon VPC。
对于子网,选择您希望在其中创建终端节点网络接口的子网。在不同可用区中选择多个子网,以确保您的接口终端节点可弹性应对可能的可用区故障。
对于Enable DNS name(启用 DNS 名称),请保持选中 Enable for this endpoint(为此终端节点启用)复选框,从而为接口终端节点启用私有 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 对话框中,执行以下操作:
对于部署阶段,选择 [新建阶段]。
在阶段名称部分输入名称。例如,dev 或 test。
选择部署。
3. 在 Stage Editor(阶段编辑器)窗格中,用您的私有 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 响应。