如何对 Amazon API Gateway 终端节点进行 CNAME
Posted
技术标签:
【中文标题】如何对 Amazon API Gateway 终端节点进行 CNAME【英文标题】:How to CNAME to Amazon API Gateway Endpoint 【发布时间】:2016-08-12 17:58:24 【问题描述】:我正在尝试在 Cloudflare 上设置 CNAME 以指向 Amazon API Gateway 端点。 CNAME 用于引用我的一个子域时使用。网关又指向 DigitalOcean 上服务器的 IP。我对 Amazon Web 服务非常陌生,如果有人能给我概述 DNS、Amazon Gateway 和 Cloudfront 的正确配置(我认为需要将网关暴露给 Amazon 外部的 DNS 服务器),我将不胜感激。任何帮助将不胜感激。
更新
我已经做了一段时间了,但没有取得太大进展。有没有人知道这是否是一种可行的方法或其他方法?
更新2
我认为我需要将 CNAME 记录添加到 cloudFlare 并最终进入重定向循环,观察者:
curl -L -i -v https://sub.mydomain.com/
【问题讨论】:
您是否阅读并按照docs.aws.amazon.com/apigateway/latest/developerguide/…docs.aws.amazon.com/apigateway/latest/developerguide/…API 网关使用自定义域名的步骤操作? 据我所知,这需要我在亚马逊上设置证书。我的 DNS 是在 cloudflare 上设置的,因此希望保持简单,因为它为我做 ssl。 cloudflare 域在直接调用时有效,因此问题似乎只是从 cloudflare 到 cloudfront 的调用。 “我的 DNS 是在 Cloudflare 上设置的”和“Cloudflare 为我做 SSL”是完全不相关的事情。 Cloudflare 要执行 SSL,它不仅必须执行您的 DNS,而且还必须为您实际代理请求。你似乎在这个问题中混淆了不同的概念,让你很不清楚你在问什么。请尝试解释您要完成的任务,而不是您尝试完成的方式——在 API 网关端点前使用自定义主机名和 Cloudflare 提供的 SSL 证书听起来像是您要尝试的内容做。 很抱歉给您带来了困惑。我不是网络人,我想它表明了!我已经设置了 Cloudfront,因此当我通过 cloudfront 域查询我的 API 时它可以工作。我的 DNS 是在 Cloudflare 上设置的,并通过页面规则将 http 转换为 https。我正在尝试使用 CNAME 记录将子域 api.mydomain.com 添加到 Cloudflare,但它不起作用。 好的,但这不会让您获得任何 Cloudflare SSL。你能提到有问题的主机名吗?重定向循环没有明显的原因,但是同样也没有明显的原因为什么您需要链中的 CloudFront 才能执行您想做的事情……至少,不是基于可用信息,除非您'正在尝试使用来自 Amazon Certificate Manager 的 SSL 证书,该证书与 CloudFront 集成(但到目前为止尚未另外提及)。 【参考方案1】:注意:这种方法似乎不再适用,因为 AWS 现在只接受来自某些机构的证书。我自己没有测试过,但 Gunar 的回答看起来很有希望。
简单地将 Cloudflare 指向您的 API Gateway 域并收工,这有几个原因:
API Gateway 使用共享主机,因此它使用域名来确定将请求发送到哪个 API。它无法知道api.yourdomain.com
属于您的API。
API Gateway 要求您使用https
,但它使用的证书仅对默认域有效。
但是,有一个解决方案。以下是我最近设置时遵循的步骤:
-
从 Cloudflare 仪表板的加密选项卡生成原始证书。
将证书导入
us-east-1
区域中的 AWS 证书管理器,即使您的 API 位于不同的区域。如果系统提示您输入证书链,您可以从 here 复制它。
在 API Gateway 控制台中添加您的自定义域并选择您刚刚添加的证书。查看 AWS support article 了解有关如何执行此操作的更多信息。
自定义域完成初始化通常需要大约 45 分钟。完成后,它将为您提供一个新的 Cloudfront URL。继续并确保您的 API 仍然可以通过这个新 URL 工作。
转到 Cloudflare DNS 选项卡并设置指向您刚刚创建的 Cloudfront URL 的 CNAME 记录。
切换到加密选项卡并将您的 SSL 模式设置为“完全(严格)”。如果您跳过此步骤,您将获得一个重定向循环。
就是这样。享受从您的自定义域提供的新的高可用性 API!
【讨论】:
该死的!我可能花了 10 多个小时试图弄清楚为什么这不起作用,所需要的只是神秘的第 6 步。先生,你应该得到奖励。 如果我有其他子域实际上没有通过 HTTPs 服务怎么办?! Full(严格)不会破坏它们吗? 是否需要创建证书的步骤,或者您可以在 AWS Certificate Manager 中创建证书吗? 对此答案的补充是只能使用 1024 或 2048 个 RSA 原始证书 - aws.amazon.com/premiumsupport/knowledge-center/… 如果您无法直接在 AWS Certificate Manager 中创建证书,则创建证书的步骤是一种解决方法。【参考方案2】:使用 CloudFlare 设置 Amazon 的 API Gateway 自定义域
在您的 AWS 管理控制台中,转到 API Gateway 服务并从左侧菜单中选择 Custom Domain Names
。
点击Create
按钮。
登录 CloudFlare,选择您的域并打开 Crypto
选项卡
转到 SSL
并将您的 SSL 模式设置为“完全(严格)”以避免重定向循环。
转到Origin Certificates
并点击Create Certificate
让CloudFlare生成一个私钥和一个CSR,并选择RSA作为私钥类型
确保包含自定义 API 域的主机名。 (例如api.mydomain.com
。您可以专门配置此自定义域或使用通配符,例如默认配置的 *.mydomain.com。
选择PEM
作为默认选择的密钥格式。
在 AWS 中切换到区域 US-EAST-1
并转到 Certificate Manager
。
点击Import a Certificate
。
将证书正文从您的 CloudFlare 证书复制到证书正文到 AWS 管理控制台中自定义域的配置。
将私钥复制到控制台中的证书私钥字段
在证书链中复制 Cloudflare Origin CA - RSA Root,可以找到 here。
在 AWS 控制台中输入您的自定义域名和证书名称
现在将在 AWS CloudFront 中创建自定义域名。域变为活动状态最多可能需要一个小时。
接下来您需要在 AWS 控制台中设置自定义域的映射。
最后一步是在 CloudFlare 中创建一个新的 CNAME Record
以将您的域链接到 CloudFront url。当您在 AWS 控制台中打开自定义域的设置页面时,复制分发域名。这是您在创建新的CNAME Record
时需要使用的域。
Source
【讨论】:
我同意。中和! ;-) 不幸的是,我的主网站没有启用 SSL(这就是我使用 CloudFlare 来做网站前端的原因)。因此 Full 不起作用... 您能详细说明第 15 步和第 16 步吗?我创建了自定义域,但没有得到任何云端 url @VinayPrabhu 这可能有助于为您感兴趣的 CloudFront 域提供一些见解。docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…【参考方案3】:这个问题的两个现有答案都是正确的,但如果即使完全遵循这些指示后问题仍然存在,请尝试进入 API Gateway 设置,导航到“自定义域名”并配置基本路径映射。
这是解决我所有问题的缺失步骤。
【讨论】:
【参考方案4】:我无法得到任何其他答案。所以我最终让 AWS 生成证书,而不是使用 Cloudflare Origin 证书。那是因为 AWS 不会接受我的 Cloudflare 证书,即使提供了链。我在 Mozilla 的 Certificate Authority list 中看不到 Cloudflare(根据文档,这是 AWS 所依赖的),所以我想这是有道理的。
这是我的解决方案的大纲:
-
创建 AWS Route53 区域
使用验证方法 DNS 创建 AWS ACM 证书(必须在 us-east-1 中)
使用 (2) 的输出创建 Cloudflare DNS 记录
创建 AWS API 网关域名
创建 Cloudflare DNS CNAME 记录,将“@”(根域)指向步骤 (4) 中的 Cloudfront 域名
创建 AWS API Gateway 基本路径映射
大概是这样。愿这对某人有所帮助。随时提问。
【讨论】:
这是我实施的解决方案。在 Cloudflare 中创建的 CNAME 记录只需要 DNS(不是代理),现在当我在其中启用 Cloudflare 限速规则时,该规则永远不会生效。我们将不胜感激。 Cloudflare 需要成为代理才能应用速率限制。 已解决,将记录更改为代理。以前这不起作用,因为我错过了为其创建记录的 3 级子域的证书。以上是关于如何对 Amazon API Gateway 终端节点进行 CNAME的主要内容,如果未能解决你的问题,请参考以下文章
如何将参数从 POST 从 Amazon API Gateway 传递到 AWS Lambda
在 Amazon API Gateway 中使用 API 密钥
如何通过 Amazon API Gateway (JAVA) 检索用户的公共 IP 地址
使用 API Gateway 导入 API 对资源启用 CORS