AWS:如何为自定义域名配置 Cloudfront

Posted

技术标签:

【中文标题】AWS:如何为自定义域名配置 Cloudfront【英文标题】:AWS: How to configure Cloudfront for Custom Domain Names 【发布时间】:2021-07-27 22:21:16 【问题描述】:

我的设置:

API 网关 - 10 个 API(api1、api2、...),全部映射到一个自定义域名 (api.xxx.com)

Route53 - api.xxx.com 指向我的 Cloudfront 分布

Cloudfront - 已创建发行版,将 api.xxx.com 设置为 CNAME

我需要知道的内容 - 我想将这个 Cloudfront 的 Origin 设置为这个自定义域名,这样我就可以调用像 api.xxx.com/api1/endpoint,api.xxx.com/api2/endpoint。但是怎么做?我使用我的 api.xxx.com 自定义域名 (xxxxxxx.execute-api.us-east-1.amazonaws.com) 的 API 网关名称作为默认行为来源名称,并假设对所有 10 个 API 的请求都将被正确路由,但它没有发生,

工作原理:我使用 api1 的 Invoke Url 创建了 Origin 名称并将其分配给 Default 行为。所以现在,当我调用“https://api.xxx.com/endpoint”时,会调用 api1。这是有道理的,但问题是 - 我需要将 API 的路径作为 URL 的一部分,例如“https://api.xxx.com/api1/endpoint”,以便区分它们.

什么不起作用:但我需要在分发中设置几个 API,以便我可以将它们称为“https://api.xxx.com/api1/endpoint”等。如果我使用调用 URL 作为 API 的源名称,我不能将此 API 名称也附加到返回 403 的 URL。我希望如果我使用“自定义域名”的“API 网关域名”(之后所有,它的格式为 xxxxx.execute-api.us-east-1.amazonaws.com),然后我可以在 URL 中使用 API,但这不起作用。我什至不能使用这个“API 网关域名”通过 Postman 调用单个 api。有人可以建议我怎么做吗?如何配置 Cloudfront 以便它可以调用各种 API 并在 URL 中使用它们的路由?

【问题讨论】:

【参考方案1】:

终于找到了一个解决方案,在这个讨论帖中有更详细的描述。我的问题是我试图直接从 Cloudfront 使用指向自定义域名 (xxxxxxxxxxxx.execute-api.us-east-1.amazonaws.com) 的链接,但我应该使用“不错”、可读的地址作为 Origin 名称和在 Route53 中进行重定向

工作设置:

    在 API 网关中,创建自定义域名区域-api.xxx.com,端点类型区域 (xxxxxxxxxxxx.execute-api.us-east-1.amazonaws.com)。 在 Route53 中,A 和 AAAA 记录将 region-api.xxx.com 映射到区域端点目标域名。 创建的 Cloudfront 分发使用 region-api.xxx.com 作为源域名,使用 api.xxx.com 作为 CNAME。 在 Route53 中,A 和 AAAA 记录将 api.xxx.com 映射到新创建的 CF 分发的域名。

【讨论】:

【参考方案2】:

我的设置与你的有点不同,但我们似乎想要实现相同的目标。

我有四个通过云端提供服务的 S3 存储桶。 一桶是根网站;其他 3 个存储桶包含 3 个不同的管理面板

我为每个 s3 存储桶创建了一个单独的来源;我相信您应该为每个单独的 api 创建一个来源。

我为每个源组添加了两个路径模式;我相信对于您的 api,每个 api 可以有一个模式。路径模式可能看起来像 /api1/*,它指向 api1 的原点

不确定您是否尝试为所有 api 添加来源。

【讨论】:

您好,暂时还没有尝试过,甚至一个 api 也不起作用。我为 /api1/* 添加了模式,但由于某种原因被忽略了,唯一有效的是默认模式。所以对“api.xxx.com/endpoint”的请求有效,但对“api.xxx.com/api1/endpoint”的请求却没有…… 也许在这里说明很明显:模式部分之后的所有内容,因此 /api1/* 将在您的来源之后添加。所以 cloudfront.net/api1/endpoint 会变成 xxxxxxx.execute-api.us-east-1.amazonaws.com/api/endpoint 实际上,这就是我没有意识到的——调用我的 api 的 URL 已经“包含”它,所以当我在 url 中添加另一个 /api1/ 时,链接变得无效。这也是为什么只使用我的默认路径的原因,因为它直接针对端点,中间没有“/api1/”。现在只是为了了解如何能够调用 api 并将其名称用作路径的一部分,因为我需要将多个 API 分配给该云端分发 啊,是的,这可能是您所做的事情和我所做的事情之间的关键区别。每个模式路径都链接到不同的原始 url,您在其中尝试使用相同的原始 url。 如果你确实让它工作了;不要忘记启用查询字符串转发,因为它不会自动转发 ?q= 例如,您可能在某些 API 路由上需要它! :)

以上是关于AWS:如何为自定义域名配置 Cloudfront的主要内容,如果未能解决你的问题,请参考以下文章

如何为外部字体请求设置 AWS Cloudfront 缓存?

如何为 AWS API Gateway 自定义授权方配置 CORS?

不可预测的 Cloudfront 502 错误

如何为自定义 cloudwatch 指标使用多个单独的维度?

使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?

AWS Cloudfront 作为具有自定义域的 Heroku 站点的 CDN