如何使用我自己的 CloudFront 分配设置 API Gateway?

上次更新日期:2022 年 6 月 27 日

我希望在 Amazon API Gateway 中使用边缘优化的 API 端点,但我需要更多地控制 Amazon CloudFront 分配。我如何创建和使用自己的分配?

简短描述

如果您的 API 客户端在地理位置上分散,可考虑使用 API Gateway 中的边缘优化 API 端点。此类端点的作用是区域端点,具有 AWS 托管式 CloudFront Web 分配,以改善客户端连接时间。

要使用全球 CloudFront 内容交付网络并保持对分配的更多控制,请将区域 API自定义 CloudFront Web 分配结合使用。

解决方法

在 API Gateway 中创建区域 API。然后执行以下操作:

为您的 API 设置 GET 方法

1.    在 API Gateway 控制台中,选择新区域 API 的名称。

2.    在 Resources(资源)窗格中,选择 Actions(操作)。然后,选择 Create Method(创建方法)。/ resource 节点下会显示一个列表。

3.    从列表中选择 GET。然后,选择复选标记图标。

4.    在 / - GET - Setup(设置)中,对于 Integration type(集成类型),选择 Mock(模拟)。然后选择 Save(保存)。
注意:模拟集成会响应任何到达它的请求,这有助于进行测试。

部署 API 并识别 API 的调用 URL

1.    将您的 API 部署到阶段

2.    将阶段编辑器窗格顶部的调用 URL 复制到您的剪切板。

API Gateway API 调用 URL 示例

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

测试 API 的 200 OK 响应

要确认 API 返回 200 OK 响应,请使用 API Gateway 控制台、Postman 应用程序或 curl 测试 API 的调用 URL。

使用 curl 测试 API 的 200 OK 响应

根据您的操作系统,运行以下命令之一:

注意:在运行以下任一命令之前,将 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 OK 响应,请检查控制台以确认以下信息:
您的 API 已部署到您的阶段。
您的阶段在调用 URL 中指定。

创建 CloudFront Web 分配

1.    在 CloudFront 控制台中,选择创建分配

2.    在 Select a delivery method for your content(为内容选择交付方法)页面上,在 Web 下选择 Get Started(开始使用)。

3.    在 Create Distribution(创建分配)页面上,为 Origin Domain Name(源域名)粘贴您的 API 调用 URL。然后,删除阶段名称。

原始域名示例

https://1a2bc3d456.execute-api.us-east-1.amazonaws.com

4.    对于 Origin Path(源路径),输入您的 API 阶段名称,并在前面加上斜杠 (/stageName)。或者,如果您想在调用 URL 时自己输入阶段名称,请不要输入源路径
注意:在调用 CloudFront 分配时,为源路径输入了不正确的阶段名称,有时会产生错误。 例如,返回消息“Missing Authentication Token”和 403 禁止访问响应代码的未授权请求错误

5.    对于 Minimum Origin SSL Protocol(最低源 SSL 协议),最好的做法是选择 TLSv1.2。请不要选择 SSLv3。API Gateway 不支持 SSLv3 协议。

6.    对于 Origin Protocol Policy(源协议策略),选择 HTTPS Only(仅 HTTPS)。
注意:API Gateway 不支持未加密的 (HTTP) 终端节点。有关更多信息,请参阅 Amazon API Gateway 常见问题

7.    (可选)要将自定义标头转发到您的源,请为 Origin Custom Headers(源自定义标头)输入一个或多个自定义标头。
注意:CloudFront 无法将某些自定义标头转发到您的源

8.    如果适用,请按照如果为您的分配的 API 或自定义域名使用 IAM 身份验证部分的说明进行操作。

9.    (可选)在 Distribution Settings(分配设置)下,配置要自定义的任何其他设置。

10.    选择 Create Distribution(创建分配)。

11.    等待部署您的分配。这需要 15-20 分钟。当控制台中的状态显示为已部署时,表示分配已就绪。

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

测试您的 CloudFront Web 分配

1.    在 CloudFront 控制台中,将分配的域名复制到剪贴板。

非自定义域名示例

a222222bcdefg5.cloudfront.net.

2.    使用前面的测试您的 API 部分中提到的命令之一测试 200 OK 响应的域名。如果您收到 500 服务器错误代码,则该分配可能尚未部署。如果没有响应,则表示 CloudFront DNS 记录尚未传播。无论哪种情况,请确认自创建分配以来已经过去了 15-20 分钟。然后,重试该过程。

重要提示:如果您对特定 API 资源的方法启用 AWS Identity and Access Management (IAM) 身份验证,则您必须在调用 API 时将资源名称附加到分配域名结尾。完整的调用 URL(包括资源名称)类似于以下示例之一。输出取决于创建分配时是否输入了源路径

含源路径的 API Gateway API 调用 URL 示例

https://distributionDomainName/stageName/resourceName

不含源路径的 API Gateway API 调用 URL 示例

https://distributionDomainName/resourceName

有关测试的更多信息,请参阅我如何为 API Gateway API 激活 IAM 身份验证?

您的 API 现在使用您创建的 Web 分配。资源可以在 API CloudFront URL 上访问。

如果为您的 CloudFront Web 分配的 API 或自定义域名使用 IAM 身份验证

默认情况下,CloudFront 不会将传入的授权标头转发到源(对于此使用案例,源为 API Gateway)。如果为您的分配的 API 或自定义域名使用 IAM 身份验证,则必须执行以下一项操作:

(对于 IAM 身份验证)将授权标头添加到 CloudFront 允许列表中

1.    如果之前尚未完成,请按照本文中创建 CloudFront Web 分配部分的步骤 1-7 进行操作。

2.    在 Create Distribution(创建分配)页面上,对于 Cache and origin request settings(缓存和源请求设置),选择 Use a cache policy and origin request policy(使用缓存策略和源请求策略)。然后,在 Cache Policy(缓存策略)下,选择现有缓存策略或者创建一个新的缓存策略,将授权标头添加到您的 CloudFront 允许列表中。

3.    如果您使用现有的缓存策略,对于 Cache Based on Selected Request Headers(基于选择的请求标头进行缓存),请选择 Whitelist(白名单)。然后,对于 Whitelist Headers(白名单标头),请将 Authorization(授权)添加到允许的标头列表中。

重要提示:如果您将 Cache Based on Selected Request Headers(基于选定的请求标头进行缓存)设置改为 All(全部),或者您允许主机标头,那么,您的设置将无法工作。如需更多信息,请参阅根据请求标头缓存内容

4.    (可选)要测试设置,请执行以下操作:
以编程方式为 API Gateway 终端节点创建所需的 Signature Version 4 签名。对于 host(主机)值,输入您的 API Gateway 调用 URL。对于 endpoint(终端节点)值,输入您的 CloudFront Web 分配 URL。

API Gateway 调用 URL 示例

<api-id>.execute.<region>.amazon.com

CloudFront Web 分配 URL 示例

dxxxxx.cloudfront.net

注意:如果您使用的是 Postman 应用程序,请在 Authorization(授权)选项卡中为 Type(类型)选择 AWS Signature。然后,输入访问密钥私有密钥。必需的标头由 Postman 使用您输入的凭证生成。

然后,使用从 Signature Version 4 流程生成的授权标头(以及所有 SignedHeaders)将 API 请求发送到 CloudFront 分配。

(对于自定义域名或 IAM 身份验证)在 API Gateway 中设置区域自定义域名以访问您的 API

1.    在 API Gateway 中创建新的区域 API将边缘优化的 API Gateway API 更改为区域 API

2.    为 API 设置区域自定义域名为 API 创建 API 映射
注意:当您通过 CloudFront 访问 API 时,请使用此自定义域名。

3.    按照本文创建 CloudFront Web 分配部分的说明创建一个 CloudFront Web 分配,但有一种例外情况。在步骤 3 中,对于 Origin Domain Name(源域名),请输入 API Gateway 目标域名,而不是 API 的调用 URL。
注意:请在自定义域详细信息的端点配置中找到 API Gateway 目标域名。

API Gateway 目标域名示例

d-xxxx..execute-api.<region>.amazonaws.com

4.    在 Create Distribution(创建分配)页面上,对于 Cache and origin request settings(缓存和源请求设置),选择 Use a cache policy and origin request policy(使用缓存策略和源请求策略)。然后,在 Cache Policy(缓存策略)下,选择现有缓存策略或者创建一个新的缓存策略,将授权主机标头添加到您的 CloudFront 允许列表中。

5.    如果您使用现有的缓存策略,对于 Cache Based on Selected Request Headers(基于选择的请求标头进行缓存),请选择 Whitelist(白名单)。然后,对于 Whitelist Headers(白名单标头),请将 Authorization(授权)和 Host(主机)添加到允许的标头列表中。

6.    在 Distribution Settings(分配设置)下,为 Alternate Domain Name(备用域名)输入您创建的自定义域名。

7.    对于 SSL Certificate(SSL 证书),选择 Custom SSL Certificate(自定义 SSL 证书)。然后,为该域添加 AWS Certificate Manager (ACM) 证书

8.部署 CloudFront Web 分配后,将 DNS 记录配置为将自定义域映射到 CloudFront Web 分配。为此,请创建别名或 CNAME 记录。如需更多信息,请参阅通过添加备用域名 (CNAME) 将自定义 URL 用于文件

9.    (可选)要测试设置,请以编程方式为您的自定义域名创建 Signature Version 4 签名的请求
注意:Postman 应用程序可用于测试设置。