我想通过 AWS Direct Connect 连接来连接到私有 Amazon API Gateway。
解决方法
为 Amazon API Gateway 服务创建 Amazon Virtual Private Cloud(Amazon VPC)端点
Amazon VPC 端点允许 VPC 中的私有资源与 API Gateway 服务安全通信。要为 API Gateway 创建 Amazon VPC 端点,请按照以下步骤操作:
- 打开 Amazon VPC 控制台。
- 在导航窗格中的 Virtual Private Cloud 下,选择端点。
- 对于服务类别,请选择 AWS 服务。
- 对于服务名称,按关键字搜索“execute-api”。此搜索会返回一个结果:“com.amazonaws.REGION.execute-api”。
- 选择“com.amazonaws.REGION.execute-api”。
- 对于 VPC,选择已配置 Direct Connect 连接的 Amazon VPC。
- 对于子网,选择要访问 API 的子网。
- 对于启用 DNS 名称,清除为此端点启用框。关闭此设置要求 Amazon VPC 启用“DNS 主机名”,这是一项可选功能。如果 VPC 使用 Amazon 提供的 DNS,则启用此设置会中断对已部署 Amazon VPC 中公有 API Gateway API 的所有访问权限。
- 对于安全组,为 Amazon VPC 端点选择安全组。该安全组必须允许从您的 Amazon VPC 通过 TCP/443 入站进行访问。
- 对于策略,选择完全访问。此选项允许使用 AWS IAM 权限进行从 Amazon VPC 到 VPC 端点的所有连接。
- 选择创建端点。
- 记下 Amazon VPC 端点 ID(如“vpce-01234567890abcdef”)。稍后需要此 ID 来编辑 API 的资源策略。
如果您还没有 REST API,请创建私有 REST API
- 打开 API Gateway 控制台。
- 选择 Direct Connect 连接的区域。
- 选择创建 API。
- 对于 API 类型,选择 REST API 私有。
- 对于 API 协议,选择 REST。
- 在创建新 API 下,选择示例 API。
- 在设置下,确认将端点类型设置为私有。
- 选择导入。
授予 Amazon VPC 端点访问私有 REST API 的权限
- 在“API 管理”页面上,选择资源策略。
- 将以下策略复制到资源策略中。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*/*/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "{{vpceID}}"
}
}
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*/*/*"
}
]
}
将 {{vpceID}} 字符串替换为您在创建 VPC 端点后记下的 Amazon VPC 端点 ID。或者,在 Amazon VPC 控制台中的端点下查看该 ID。
**注意:**此示例策略允许从您的 Amazon VPC 访问 API 上的所有资源。要进一步限制访问权限,请修改 Resource 键。
- 选择保存。
部署 API 以提交更改
现在您已创建 API 并添加了资源策略,请将 API 部署到某个阶段以实施更改:
- 在 API Gateway 控制台上,从导航窗格中选择资源。
- 选择操作。
- 在 API 操作下,选择部署 API。
- 对于部署阶段,选择 [新阶段]。
- 输入阶段的名称。
- 选择部署。更改已部署到 API。此过程可能需要几分钟才能传播。
测试通过 Direct Connect 连接对 API 的访问权限
请按照以下步骤测试访问权限:
-
在 Amazon VPC 控制台上,选择端点,然后选择您创建的 VPC 端点。
-
在详细信息下,复制 VPC 端点的 DNS 名称。例如,
“vpce-0123456789abcdef-b238e1kf.execute-api.REGION.vpce.amazonaws.com”。
-
在使用 Direct Connect 连接到 Amazon VPC 的计算机上,运行以下一种命令来测试 VPC 端点的 DNS 主机名解析。
Windows PowerShell:
nslookup <YOUR_VPCE_HOSTNAME>
-或者-
macOS/Unix:
nslookup <YOUR_VPCE_HOSTNAME>
**注意:**将 YOUR_VPCE_HOSTNAME 替换为之前创建的 VPC 端点的主机名。
该响应会返回与您的 Amazon VPC 端点相对应的私有 IP 地址。如果您未在响应中收到私有 IP 地址,请前往 Amazon VPC 控制台,检查端点下的 Amazon VPC 端点主机名。
-
如果 DNS 正在运行,则发出测试 HTTP 请求。为此,您需要从 API Gateway 控制台获取 API ID。从列表中复制 API ID。API ID 是一个如“chw1a2q2xk.”的字符串。
-
在连接到 Direct Connect 连接的本地计算机上,运行以下命令:
Windows PowerShell:
curl -H @{'x-apigw-api-id' = '<YOUR_API_ID>'} https://<YOUR_VPCE_HOSTNAME>/<STAGE>
-或者-
macOS/Unix:
curl -IX GET -H 'x-apigw-api-id:<YOUR_API_ID>' https://<YOUR_VPCE_HOSTNAME>/<STAGE>
**注意:**将 YOUR_API_ID 替换为私有 REST API ID 或之前创建的 API 的 ID。将 YOUR_VPCE_HOSTNAME 替换为 VPC 端点的主机名,并将 STAGE 替换为之前创建的部署阶段。
请确保以下各项:
- 响应的第一行包括“HTTP/1.1 200 OK”。
- 如果未收到响应,请检查与 Amazon VPC 端点关联的安全组是否允许从来源 IP 地址通过 TCP/443 进行入站连接。此外,请检查是否已正确使用 Direct Connect 连接来进行连接。
- 如果收到“403 Forbidden”响应,请检查是否已设置 <YOUR_API_ID> 标头。确认您正在发送 GET 请求。此外,请检查 <STAGE> 是否已正确添加。
**注意:**由与此 API 不同的域提供服务的客户端 Web 应用程序可能会与此 API 进行交互。在这种情况下,浏览器会生成 CORS 预检请求,从而难以设置 x-apigw-api-id 标头。要解决此问题,请改用 Route53 别名访问私有 API。
相关信息
什么是 CORS?
如何排查 Direct Connect 网关路由问题?
如何设置 Direct Connect 网关?