如何通过自己的 CloudFront 分配设置 API Gateway?

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

我想在 Amazon API Gateway 中拥有边缘优化的 API 终端节点,但我还需要更好地控制 Amazon CloudFront 分配。我可以创建并使用自己的分配吗?

简短描述

如果您的 API 客户端的地理分布分散,您可能需要在 API Gateway 中有边缘优化的 API 终端节点。此类终端节点将充当区域终端节点,但在它前面部署 AWS 托管 CloudFront Web 分配有助于改善客户端的连接时间。

不过,您可以利用全球 CloudFront 内容分发网络的优势,并且同时更好地对分配进行控制。对于此设置,使用区域 API,并在它前面手动分配自定义 CloudFront 分配。

解决方法

在 API Gateway 中创建区域 API,然后按照以下说明进行操作。

为您的 API 设置 GET 方法

  1. API Gateway 控制台中,选择您的新区域 API 的名称。
  2. 资源窗格中,选择操作,然后选择创建方法
  3. 在 / resource 节点下的列表中,选择 GET,然后选择选中标记图标。
  4. /- GET – 设置中,为集成类型选择模拟,然后选择保存。模拟集成会响应任何到达它的请求,这有助于以后进行测试。

部署您的 API 并获取调用 URL

  1. 将您的 API 部署到阶段
  2. 阶段编辑器窗格的顶部,将调用 URL 复制到您的剪切板。该 URL 与以下类似:
    https://restApiId.execute-api.region.amazonaws.com/stageName

测试您的 API

使用 API Gateway 控制台Postman 应用程序或命令行界面的 curl 对您的 API 的调用 URL 进行 “200” HTTP 状态代码测试。如需关于 curl 的更多信息,请参见 curl 项目网站

使用 curl,可以执行以下任一操作:

注意:将这些命令中的 https://restApiId.execute-api.region.amazonaws.com/stageName 替换为您的 API 的调用 URL。

在 Linux 中运行此命令:

curl -IX GET https://restApiId.execute-api.region.amazonaws.com/stageName

在 Windows PowerShell 中运行此命令:

curl https://restApiId.execute-api.region.amazonaws.com/stageName

注意:如果返回的状态代码不是 “200”,确认将 API 部署到您的控制台阶段。另外,请确认您在 URL 中指定了阶段。

创建 CloudFront Web 分配

  1. CloudFront 控制台中,选择创建分配
  2. 为内容选择交付方法页面上的 Web 下,选择开始使用
  3. 创建分配页面上,为源域名粘贴您的 API 调用 URL,但删除阶段名称。例如:
    https://1a2bc3d456.execute-api.us-east-1.amazonaws.com
  4. 对于源路径,输入您的 API 阶段名称,并在前面加上斜杠 (/stageName)。或者,如果您想在调用 URL 时自己输入阶段名称,请不要输入源路径
    注意:如果您为源路径输入了不正确的阶段名称,您会在调用 CloudFront 分配时收到错误。例如,返回消息 "Missing Authentication Token" 和 403 禁止响应代码的未授权请求错误。
  5. 对于最低源 SSL 协议,最好的做法是仅选择 TLSv1.2。请不要选择 SSLv3。API Gateway 不支持该协议。
  6. 针对源协议策略,选择仅 HTTPS
    注意:API Gateway 不支持未加密的 (HTTP) 终端节点。如需更多信息,见 Amazon API Gateway 常见问题
  7. (可选)要将自定义标头转发到源,为源自定义标头输入一个或多个自定义标头。
    注意:CloudFront 无法将某些自定义标头转发到您的源
  8. 如果您在 API 上启用了 IAM 身份验证,或者您计划稍后启用它,您必须将授权请求标头添加到允许列表。在基于所选的请求标头进行缓存中,选择白名单。对于白名单标头,请将授权添加到允许的标头列表中。
    重要提示:如果您将基于选定的请求标头进行缓存设置为全部,或者您允许主机标头,那么,您的设置将无法正常启用。如需更多信息,请参阅根据请求标头缓存内容
  9. (可选)要为分配使用您自己自定义的域名,而不是 CloudFront 分配给它的域名,在备用域名 (CNAME) 中输入一个或多个域名。如需更多信息,请参阅通过添加备用域名 (CNAME) 将自定义 URL 用于文件
  10. (可选)配置您想要自定义的任何其他设置。
  11. 选择创建分配
  12. 等待分配部署。这可能需要 15-20 分钟。当控制台的状态显示为已部署时,说明分配已就绪。

有关更多信息,请参阅创建分配

测试您的 CloudFront Web 分配

  1. CloudFront 控制台中,记下分配的域名。如果未使用自定义域名,则域名应该与以下类似:a222222bcdefg5.cloudfront.net
  2. 使用前面的测试您的 API 部分中提到的命令之一测试 "200" HTTP 状态代码的域名。
    注意:如果您对特定 API 资源的方法启用 IAM 身份验证,您必须在调用 API 时将资源名称附加到分配域名结尾。带有资源名称的完整调用 URL 类似于以下 URL 之一,具体取决于您是否在创建分配时输入了源路径https://distributionDomainName/resourceNamehttps://distributionDomainName/stageName/resourceName。有关测试此使用案例的更多信息,请参阅我如何为 API Gateway API 启用 IAM 身份验证?

注意:如果返回 “500” 服务器错误代码,说明分配可能未完全部署。如果您未获得响应,CloudFront DNS 记录可能还没有完全填充。在任一情况下,请验证您的分配已创建完成 15-20 分钟,然后再重试该流程。

您的 API 现在使用您创建的分配,而且您可以通过 CloudFront URL 访问 API 上的任何资源。