Cloudfront 和 EC2

Posted

技术标签:

【中文标题】Cloudfront 和 EC2【英文标题】:Cloudfront and EC2 【发布时间】:2016-01-13 06:39:07 【问题描述】:

如何在 EC2 实例前设置 Cloudfront? 我有兴趣让用户点击 Cloudfront 网址而不是 EC2 来源。

因此,用户不会点击 ec2-52-64-xxx-xxx.ap-southeast-2.compute.amazonaws.com,而是点击 d111111abcdef8.cloudfront.net。

我的目的是通过减少 EC2 实例上的流量和 CPU 负载来节省托管费用,同时为海外用户提供更快的加载时间。

我是否只需将我的 DNS 指向 Cloudfront url 而不是 EC2 源?

【问题讨论】:

【参考方案1】:

我是否只需将我的 DNS 指向 Cloudfront url 而不是 EC2 源?

差不多。

从技术上讲,您不会将 DNS 指向 URL,而是将其指向主机名或 IP 地址,这与 CloudFront 的做法略有不同。

不过,首先...在 CloudFront 分配设置中,您需要在“备用域名”框中配置 CloudFront 应该期望看到浏览器发送的任何主机名。

对于来源,输入ec2-...-compute.amazonaws.com 主机名。

此时,10-15 分钟后,访问 CloudFront 分配的 URL 应该会将您带到您的服务器。

下一步...如果您的 DNS 托管在 Route 53 中,那么您将转到托管区域并为这些主机名创建新的“A”记录,将“别名”设置为“是”,这应该会导致目标要使用 CloudFront 分配填充的框,然后您将选择它并保存记录。

如果您的 DNS 不是由 Route 53 托管,您将改为在 DNS 中创建 CNAME 记录,指向分配给 CloudFront 分配的主机名,例如jozxyqkexample.cloudfront.net。这里的问题是您不能使用域的顶点/根执行此操作,因为 CNAME 在那里无效......所以 www.example.com 可以工作,但 example.com 不会.这是 DNS 的限制,唯一的解决方法是为您的 DNS 使用 Route 53,因为它与 CloudFront 具有内部集成(因此上面提到的“别名”记录使用内部查找而不是外部引用,如 CNAME )。

您可能还希望将 CloudFront 配置为将 Host 标头转发回源服务器;否则,当请求到达时,在 HTTP 请求中呈现给您的服务器的主机名将不是您的域名,而是您配置为源主机的主机名。

请确保,当您通过 CloudFront 连接时,服务器不会将您重定向回 EC2 主机名或 IP(如果发生,浏览器中的地址栏会发生变化,并且您需要修复您的网络服务器的配置(如果发生这种情况)。

【讨论】:

感谢您的回复迈克尔。 DNS 由 NameCheap 管理。使用 NameCheap 将 URL 指向主机名或 IP 地址很简单。但我想您还必须在 AWS CloudFront 控制面板中进行一些配置?就像将它指向一个 URL。所以是双向配置? 对于源,输入 ec2-...-compute.amazonaws.com 主机名。这就是您配置 CloudFront 以访问您的服务器的方式。上面的步骤是告诉 CloudFront,当它看到浏览器在传入请求中发送的主机名时,您将指向它的主机名应该与此特定分配相关联。 NameCheap 的 DNS 服务将正常工作,除非此站点是您的裸域名(www.example.com ok,example.com not ok)。 我收到此错误,无法满足请求。 CloudFront 尝试与源建立连接,但尝试失败或源关闭了连接。由云端(CloudFront)生成请求ID:9FQvbTDRYQvDABh1FgbmeMdMBA5JQmcH29bQd_yLQJ90Mf3cytZilg== @JihinRaju 检查***.com/a/35258911/1695906 或***.com/a/40519649/1695906 或***.com/a/38725089/1695906 或serverfault.com/a/779723/153161。不正确的源 SSL 配置是造成这种情况的常见原因。 除上述之外,您还可以将 Namecheap 指向使用您的 Route53 DNS,以便您可以从那里进行管理。这将为您省去最头疼的问题!希望这可以帮助! 【参考方案2】:

使用以下步骤将 ec2-52-64-xxx-xxx.ap-southeast-2.compute.amazonaws.com 路由到 d111111abcdef8.cloudfront.net。

按照以下步骤操作:

    登录到您的 aws 控制台并搜索 CloudFront

    转到 CloudFront:创建分发(请选择 Web 分发

    Origin Settings 下:选择 Origin 域名(您可以分配实例的公共 DNS,例如 ec2-52-64-xxx-xxx.ap-southeast-2.compute.amazonaws.com) 在默认缓存行为设置下:选择查看器协议策略:将 HTTP 重定向到 HTTPS 在对象缓存下:选择自定义(在最小 TTL、最大 TTL 和默认 TTL 中保持默认设置) 转发 Cookies:全部 查询字符串转发和缓存:全部 分发设置: 选择价格等级:(使用所有边缘位置(最佳性能))。 备用域名 (CNAME)s:添加您的域名 URL 名称(如果有) SSL 证书:在 SSL 下,您可以选择默认证书或您的自定义证书,具体取决于您的要求。(选择默认。)

注意:对于自定义 SSL 证书(证书应位于 us-east-1 区域)。

    可能需要 10 到 15 分钟

【讨论】:

我得到'参数来源名称不能是IP地址' 请多解释一下,以便我可以帮助你。 @AnoopKumar 按照您的指示,我在 CDN pullzone 上收到错误 502:deya3mlcjkmrf.cloudfront.net 任何想法?【参考方案3】:

IP in Origin 会给出错误:com.amazonaws.services.cloudfront.model.InvalidArgumentException:参数源名称不能是 IP 地址。 (服务:AmazonCloudFront;状态代码:400;错误代码:InvalidArgument;

尽管 AWS 文档说您可以使用 IP。

作为 Origin 的公共 DNS (IPv4) 给出“504 错误无法满足请求” 当 Origin 是 S3 并且 S3 的权限有限时,我就有过这种情况。但是 EC2 没有权限控制。它是公开的。

【讨论】:

@Manly 你是怎么解决这个问题的? @Manly 你是怎么解决这个问题的? 使用公共 IPv4 DNS 名称作为源。从 EC2 面板 - 实例 - 详细信息选项卡复制它。它看起来像 ec2-XX-XX-xxx-***compute.amazonaws.com 首先确保它是公开可用的(在浏览器中加载)。我只是指出 IP 地址不起作用,这与 AWS Docs 和上面的建议相反。有趣的是,ec2 Public IPv4 DNS 不会像 S3 地址那样在 Origin 编辑字段中弹出。 EC2 未公开时出现 504 错误,例如未配置 VPC 网络接口和子网时。不过,这是一个不同的大问题。【参考方案4】:

把这个答案留给同样面临错误的人

502 错误 无法满足请求。 CloudFront 无法 连接到原点。我们无法连接到此应用的服务器 或此时的网站。可能有太多的流量或 配置错误。请稍后再试,或联系应用或网站 所有者。如果您通过 CloudFront 向客户提供内容,您可以 通过查看查找故障排除步骤并帮助防止此错误 CloudFront 文档。

如果您 100% 确定您的源已打开 443 端口并且源上的证书有效,则可以在不创建 Route 53 记录的情况下测试您的 Cloudfront 分发。

假设您拥有在您的 EC2 上运行的“mywebiste.com”,并且您的 Cloudfront DistributionID 是 a1b2c3d4e5。

试试这个:

curl https://a1b2c3d4e5.cloudfront.net -H 'host: mywebiste.com' -I

这就是host 标头的全部内容。它必须与您的原始 SSL 证书中的一个匹配。

【讨论】:

你是如何解决这个问题的?我已经在 ec2 上运行了 react 应用程序

以上是关于Cloudfront 和 EC2的主要内容,如果未能解决你的问题,请参考以下文章

为啥需要 Amazon S3 和 Cloudfront?

如何开通 CloudFront 和 Route 53

CloudFront 缓存持续时间和最小 TTL

如何将 CloudFront 和 S3 与备用域一起使用?

使用 Amazon S3 和 Cloudfront 的 CORS

Cloudfront、ELB 和 SSL