如何使用接口 VPC 端点访问另一个账户中的 API Gateway 私有 REST API?
我想使用接口虚拟私有云 (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 来测试设置。
注意: API Gateway 私有 REST API 和 VPC 端点必须位于同一 AWS 区域中。
解决方法
在一个账户(账户 A)中的 Amazon VPC 中创建接口端点
创建新的接口 VPC 端点
在账户 A 中,按照在 VPC 中为 API Gateway 创建接口 VPC 端点中的说明进行操作。
**重要事项:**对于 Policy(策略),选择 Full access(完全访问)。最佳做法是使用 VPC 端点策略限制 API ID 对端点的访问。另一种最佳做法是使用 API Gateway 资源策略限制主体对端点的访问。有关详细信息,请参阅应用最低权限许可。
创建接口端点时,请执行以下操作:
- 最佳做法是在不同的可用区选择多个子网。跨多个可用区配置子网时,接口端点更能抵御潜在的可用区故障。
- 激活私有 DNS,以使用公有或私有 DNS 连接到您的私有 REST API。
**注意:**为接口 VPC 端点激活私有 DNS 时,无法再从 VPC 访问 API Gateway 公有 API。有关详细信息,请参阅当我从 VPC 连接到 API Gateway API 时,为什么会收到 HTTP 403 Forbidden(HTTP 403 禁止访问)错误? - 您的安全组必须有一条规则,允许来自您的 VPC 中某个 IP 地址范围的 TCP 端口 443 入站 HTTPS 流量。该规则也可以来自您的 VPC 中的另一个安全组。
**注意:**如果您没有符合其中一个要求的安全组,请为您的 VPC 创建新的安全组。如果您未指定安全组,则默认安全组将与端点网络接口相关联。
获取接口端点的 VPC 端点 ID
创建接口端点后,将显示 VPC 端点 ID。复制新接口端点的 VPC 端点 ID(例如:vpce-1a2b3c456d7e89012)。
**注意:**创建和配置私有 REST API 时,请使用此 VPC 端点 ID。
获取接口端点的公有 DNS 名称
Endpoints(端点)页面显示在 Amazon VPC 控制台中。在 Endpoints(端点)页面的 Details(详细信息)选项卡上,在 DNS names(DNS 名称)列中复制接口端点的公有 DNS 名称。例如:vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com。
在另一个账户(账户 B)中创建 API Gateway 私有 REST API
- 在账户 B 中,打开 API Gateway 控制台。
- 选择 Create API(创建 API)。
- 对于 Choose an API type(选择 API 类型),在 REST API Private(REST API 私有)下,选择 Build(构建)。
- 在 API details(API 详细信息)下,输入以下信息:
对于 API name(API 名称),输入一个名称。
(可选)对于 Description(描述),输入描述。
将 Endpoint Type(端点类型)设置为 Private(私有)。
对于 VPC Endpoint IDs(VPC 端点 ID),输入您的接口端点 ID。然后,选择 Add(添加)。
**注意:**当您将接口端点与私有 REST API 关联时,API Gateway 会生成新的 Amazon Route 53 别名记录。您可以使用 Route53 别名访问您的私有 API。 - 选择 Create API(创建 API)。
有关详细信息,请参阅创建私有 API。
为私有 REST API 配置资源策略,允许接口端点调用 API
- 在 API Gateway 控制台的导航窗格中,在您的 API 下,选择 Resource Policy(资源策略)。
- 在 Resource Policy(资源策略)页面上,在文本框中输入以下示例资源策略:
**注意:**请将 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 设置方法
- 在 API Gateway 控制台的导航窗格中,在您的 API 下,选择 Resources(资源)。
- 在 Resources(资源)窗格中,选择 Actions(操作),然后选择 Create Method(创建方法)。
- 在 / resource(/资源)节点下的下拉列表中,选择 ANY(任意),然后选择复选标记图标。
- 在 / - ANY - Setup(/ - 任意 - 设置)窗格中,对于 Integration type(集成类型),选择 Mock(模拟)。
**注意:**模拟集成会响应到达它的任何请求。 - 选择 Save(保存)。
有关详细信息,请参阅 API Gateway 中用于 REST API 的方法。
部署私有 REST API
- 在 API Gateway 控制台的 Resources(资源)窗格中,选择 Actions(操作),然后选择 Deploy API(部署 API)。
- 在 Deploy API(部署 API)对话框中,输入以下信息:
对于部署阶段,选择新阶段。
对于 Stage name(阶段名称),输入一个名称。例如,dev 或 test。 - 选择 Deploy(部署)。
- 在 Stage Editor(阶段编辑器)窗格中,找到消息 If Private DNS is enabled, use this URL:(如果启用了私有 DNS,请使用此 URL:)。复制您的私有 REST API 的调用 URL。
**注意:**使用私有 REST API 的调用 URL 来测试设置。
有关详细信息,请参阅部署私有 API。
从账户 A 调用私有 REST API 来测试设置
- 在账户 A 中,在与接口端点相同的 VPC 中启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例。
**重要事项:**选择与接口端点关联的安全组。 - 连接到 Amazon EC2 实例。
**注意:**您的 AWS 账户可能会产生 EC2 实例费用。如果您创建了一个实例用于测试,请在完成测试后终止该实例,以避免产生更多费用。 - 从 EC2 实例的命令行中,运行以下任一 curl 命令来调用账户 B 中的私有 REST API。
**注意:**有关详细信息,请参阅“使用特定于端点的公有 DNS 主机名调用您的私有 API”。
对于私有 DNS 名称
运行以下命令:
**注意:**请将 https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name 替换为您的私有 API 的调用 URL。此命令仅在您为接口端点启用私有 DNS 时起作用。有关详细信息,请参阅“使用私有 DNS 名称调用私有 API”。curl -i https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name
对于 Route53 别名
运行以下命令:
**注意:**请将 a1bc234d5e 替换为您的 API ID,将 vpce-1a2b3c456d7e89012 替换为接口端点 ID,将 region 替换为您的 API 区域。请将 stage-name 替换为部署私有 API 的阶段的名称。有关详细信息,请参阅使用 Route53 别名调用私有 API。curl -i https://a1bc234d5e-vpce-1a2b3c456d7e89012.execute-api.region.amazonaws.com/stage-name
对于带主机标头的公有 DNS 名称
运行以下命令:
**注意:**请将 vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com 替换为您的接口端点的公有 DNS 名称,将 stage-name 替换为部署私有 API 的阶段的名称。请将 a1bc234d5e.execute-api.region.amazonaws.com 替换为您的私有 API 的调用 URL。curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "Host: a1bc234d5e.execute-api.region.amazonaws.com"
对于带 x-apigw-api-id 标头的公有 DNS 名称
运行以下命令:
**注意:**请将 vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com 替换为您的接口端点的公有 DNS 名称,将 stage-name 替换为部署私有 API 的阶段的名称。请将 a1bc234d5e 替换为您的 API ID。curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "x-apigw-api-id:a1bc234d5e" - 查看命令输出。连接成功时,API Gateway 将返回 200 OK 响应。

