如何使用接口 VPC 端点在另一个 AWS 账户中访问 API Gateway 私有 REST API?
上次更新日期:2022 年 9 月 16 日
我想要使用接口 VPC 端点访问另一个 AWS 账户中的 Amazon API Gateway 私有 REST API。该如何进行设置?
简短描述
要使用接口 VPC 终端节点访问另一个 AWS 账户中的 API Gateway 私有 REST API,请执行以下操作:
- 在一个账户(账户 A)中的 Amazon Virtual Private Cloud (Amazon VPC) 中创建接口终端节点。
- 在第二个账户(账户 B)中创建 API Gateway 私有 REST API。
- 为私有 REST API 配置资源策略,允许接口终端节点调用 API。
- 为私有 REST API 设置方法。
- 部署私有 REST API。
- 通过从账户 A 调用私有 REST API 来测试设置。
解决方法
在一个账户(账户 A)中的 Amazon VPC 中创建接口终端节点。
创建新的接口 VPC 终端节点
在账户 A 中,按照为 API Gateway execute-api 创建接口 VPC 端点中的说明操作。
重要提示:对于 Policy (策略),请选择 Full access (完全访问)。最佳做法是使用 VPC 端点策略限制通过 API ID 对终端节点的访问。使用 API Gateway 资源策略限制主体对端点的访问也是一种最佳实践。有关授予最低权限的安全建议的更多信息,请参阅 IAM 用户指南中的授予最小权限。
创建接口终端节点时,请考虑以下事项:
- 最好的做法是选择不同可用区中的多个子网。跨多个可用区配置子网,使接口终端节点可弹性应对可能的可用区故障。
- 激活私有 DNS 后,您可以使用公有或私有 DNS 连接您的私有 REST API。
注意:当您为接口 VPC 终端节点激活私有 DNS 时,您将不能再从 Amazon VPC 访问 API Gateway 公有 API。有关更多信息,请参阅我从 VPC 连接到 API Gateway API 时,为什么会收到 HTTP 403 禁止错误? - 您选择的安全组必须有一个规则,允许 TCP 端口 443 上来自以下任意一项的入站 HTTPS 流量:
您的 Amazon VPC 中的 IP 地址范围
– 或 –
您的 Amazon VPC 中的另一个安全组
注意:如果您没有符合其中一个要求的安全组,请选择 Create a new security group (创建新的安全组)。然后,创建一个满足其中一项要求的新安全组。如果您没有指定安全组,则将默认安全组与端点网络接口关联。
检索接口终端节点的 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. 对于选择 API 类型,在 REST API Private 下,选择构建。
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 对话框中,执行以下操作:
对于部署阶段,选择 [新建阶段]。
在阶段名称部分输入名称。例如,dev 或 test。
选择部署。
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) 实例。
重要提示:在设置期间,选择与您的接口端点关联的现有安全组。
注意:您的 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 响应。