如何将CNAME指向Amazon API Gateway端点

50

我正在尝试在Cloudflare上设置CNAME以指向Amazon API Gateway终端节点。 CNAME用于引用我的一个子域时。Gateway反过来指向DigitalOcean服务器上的IP地址。我非常陌生Amazon Web Services,如果有人能给我一个正确配置DNS,Amazon Gateway和Cloudfront(我认为需要将网关公开给Amazon外部的DNS服务器)的概述,我将不胜感激。任何帮助都将不胜感激。

更新

我一直在做这件事,但进展不大。是否有人知道这是否是可行的方法,或者还可以用其他方法?

更新2

我以为需要将CNAME记录添加到cloudFlare中,结果最终进入了重定向循环,被观察到:

curl -L -i -v https://sub.mydomain.com/

你是否阅读并遵循了使用自定义域名与 API 网关的步骤,网址为 http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html? - Michael - sqlbot
据我所知,这需要我在亚马逊上设置证书。我的 DNS 设置在 Cloudflare 上,因此希望保持简单,因为它可以为我提供 SSL。直接调用 Cloudflare 域时,它可以正常工作,因此似乎只是从 Cloudflare 到 Cloudfront 的调用存在问题。 - Silian Rails
"我的DNS已经在Cloudflare上设置好了"和"Cloudflare为我提供SSL"是完全不相关的事情。要让Cloudflare执行SSL,它不仅必须执行您的DNS,还必须实际代理您的请求。您似乎混淆了这个问题中的不同概念,使得您的问题非常不清楚。请尝试解释您想要实现什么,而不是如何实现它--使用自定义主机名和Cloudflare提供的SSL证书来保护API Gateway端点是您尝试做的事情听起来像。" - Michael - sqlbot
抱歉给您带来困惑。我不是网络方面的专业人士,我猜这也能看得出来!我已经设置了Cloudfront,所以当我通过Cloudfront域查询我的API时它可以正常工作。我的DNS设置在Cloudflare上,并通过页面规则将http转换为https。我正在尝试使用指向Cloudfront域的CNAME记录将子域api.mydomain.com添加到Cloudflare中,但这并没有成功。 - Silian Rails
好的,但这并不能让你得到任何Cloudflare SSL。你能提一下相关的主机名吗?没有明显的原因会导致重定向循环,但是另一方面,在可用信息的基础上也没有明显的原因为什么你需要将CloudFront放在链条中来完成你所尝试的操作...除非你正在尝试使用Amazon证书管理器的SSL证书,它与CloudFront集成(但迄今为止还没有被提到)。 - Michael - sqlbot
无法提及主机名。如果有一种方法让我直接将CloudFlare指向Amazon API端点,那么我就不会担心CloudFront了。然而,该端点的形式为https://endpoint/prod,我无法在Cloudflare的CNAME中指定路径/prod。这就是为什么我想使用CloudFront的原因。我看到您可以使用API进行自定义域名,但这需要证书、私钥和链。据我所知,当我使用https页面规则时,这是由CloudFlare为我执行的,我不确定这些来自哪里。 - Silian Rails
4个回答

54

注意: 看起来这种方法不再起作用了,因为AWS现在只接受某些机构颁发的证书。我自己没有测试过,但Gunar的回答看起来很有前途。

直接将Cloudflare指向你的API Gateway域并称之为一天工作的原因有几个:

  • API Gateway使用共享主机,因此它使用域名来确定要发送请求的API。 它无法知道api.yourdomain.com属于您的API。
  • API Gateway要求您使用https,但它使用的证书仅对默认域有效。

然而,有一个解决方案。 这是我最近设置此功能时遵循的步骤:

  1. 从Cloudflare仪表板的加密选项卡中生成源证书。
  2. 将证书导入到AWS Certificate Manager中,在us-east-1区域中,即使您的API位于不同的区域。 如果提示您提供证书链,则可以从此处复制它。
  3. 在API Gateway控制台中添加您的自定义域,并选择刚刚添加的证书。 有关如何执行此操作,请查看AWS 支持文章
  4. 自定义域通常需要约45分钟才能完成初始化。 完成后,它将为您提供一个新的Cloudfront URL。 请确保通过这个新的URL测试您的API是否仍然可用。
  5. 转到Cloudflare DNS选项卡,并设置指向您刚刚创建的Cloudfront URL的CNAME记录。
  6. 切换到加密选项卡,并将SSL模式设置为“Full (Strict)” 。 如果跳过此步骤,您将会遇到重定向循环问题。

就这样了。享受您的新高可用API,它来自于您的自定义域!


3
该死!我大概花了10个小时以上试图弄清楚为什么这个不起作用,而所需的只是神秘的第六步。您,先生,应该得到一份奖励。 - Alix Axel
1
需要补充的是,只有1024或2048 RSA原始证书才能使用-https://aws.amazon.com/premiumsupport/knowledge-center/elb-ssl-tls-certificate-https/。 - user3607758
创建证书的步骤是一种解决方法,如果您无法直接在 AWS 证书管理器中创建证书,则可以采用此方法。 - nponeccop
这还能用吗?我从CloudFront得到了“不受信任的授权”,并发现了这个链接:https://www.reddit.com/r/aws/comments/bb8bpg/cloudfront_cannot_use_certificates_in_acm_from/。看起来Cloudflare证书不再被接受了。 - mRcSchwering
@mRcSchwering 我已经多年没有研究过这个了。你可以随意编辑帖子。我认为现在Gunar Gesser可能有更好的答案。 - BonsaiOak
显示剩余2条评论

27

使用CloudFlare设置Amazon API Gateway的自定义域名

  1. 在AWS管理控制台中,转到API Gateway服务,并从左侧菜单中选择Custom Domain Names

  2. 单击Create按钮。

  3. 登录CloudFlare,选择您的域名并打开Crypto选项卡

  4. 转到SSL并将SSL模式设置为“Full (Strict)”,以避免重定向循环。

  5. 进入Origin Certificates并单击Create Certificate

  6. 让CloudFlare生成一个私钥和一个CSR,并选择RSA作为私钥类型

  7. 确保为您的自定义API域名提供了主机名。(例如,api.mydomain.com。您可以专门配置此自定义域名,也可以使用默认配置的通配符,如*.mydomain.com。

  8. 选择默认选择的PEM作为密钥格式。

  9. 在AWS中切换到区域US-EAST-1并进入Certificate Manager

  10. 单击Import a Certificate

  11. 将CloudFlare证书中的证书正文复制到AWS管理控制台自定义域配置的Certificate body字段中。

  12. 将私钥复制到控制台中的证书私钥字段中

  13. 在证书链中复制Cloudflare Origin CA - RSA Root,可以在此处找到。

  14. 在AWS控制台中输入您的自定义域名和证书名称

  • 现在,在AWS CloudFront中将创建自定义域名。域名生效前可能需要多达一小时的时间。

  • 接下来,您需要在AWS控制台中设置自定义域名的映射。

  • 最后一步是在CloudFlare中创建一个新的CNAME记录,将您的域名链接到CloudFront URL。当您在AWS控制台中打开自定义域名的设置页面时,请复制分发域名。这就是您创建新的CNAME记录时需要使用的域名。

  • 来源


    2
    我同意。中立了!;-) - Geek Stocks
    1
    很不幸,我的主要网站没有启用SSL(这就是为什么我使用CloudFlare作为网站前端的原因)。因此,Full无法正常工作... - TrickiDicki
    你能详细说明第15步和第16步吗?我创建了自定义域名,但没有得到任何CloudFront URL。 - Vinay Prabhu
    @VinayPrabhu 这可能有助于提供您感兴趣的CloudFront域名的一些见解.. https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html - Tyler Rafferty

    6

    我无法让其他答案起作用,因此最终由AWS生成证书而不是使用Cloudflare Origin证书。这是因为即使提供了链,AWS也不接受我的Cloudflare证书。根据文档,我无法在Mozilla的证书颁发机构列表中看到Cloudflare,所以这很有道理。


    以下是我的解决方案概述:

    1. 创建AWS Route53区域
    2. 使用DNS验证方法创建AWS ACM证书(必须位于us-east-1)
    3. 创建Cloudflare DNS记录,并将其输出到第2步
    4. 创建AWS API Gateway域名
    5. 创建Cloudflare DNS CNAME记录,将“@”(根域)指向步骤4中的Cloudfront域名
    6. 创建AWS API Gateway基本路径映射

    大致就是这样。希望这能帮助某些人。如有疑问,请随时提问。


    这是我实施的解决方案。在Cloudflare中创建的CNAME记录需要仅使用DNS(而不是代理),现在当我启用Cloudflare限流规则时,规则从未生效。如有任何问题,请指教。 - Ritesh Kumar Reddy Kuchukulla
    1
    Cloudflare需要作为代理才能应用速率限制。 - Gunar Gessner
    1
    已解决,将记录更改为代理。之前由于我错过了为创建记录的第三级子域获取证书,因此这并没有起作用。 - Ritesh Kumar Reddy Kuchukulla

    4

    这个问题的两个现有答案都是正确的,但如果即使完全按照这些指示进行操作后问题仍然存在,请尝试进入API Gateway设置,导航到“自定义域名”并配置基本路径映射。

    这就是解决我所有问题的缺失步骤。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接