在没有asset_sync的情况下自动将资产上传到S3

时间:2015-09-06 01:41:26

标签: ruby-on-rails ruby heroku amazon-s3

我刚刚第一次部署到Heroku,除了我的图像,资产也起作用。当我发现这个要点时,我正在阅读有关如何将资产移至s3(然后使用cloudfront缓存它们)的信息:

https://gist.github.com/schneems/9374188 "我讨厌asset_sync"

  

使用资产同步可能会导致失败,难以调试,不需要,并且会增加额外的复杂性。不要使用它。而是使用https://devcenter.heroku.com/articles/using-amazon-cloudfront-cdn

问题是,我无法像宝石一样自动同步资产。什么是使用asset_sync gem的最佳替代方案?

2 个答案:

答案 0 :(得分:0)

虽然一个老问题,如果有人发现这个问题并且希望得到答案,这是我自己的发现。

Cloudfront现在已经允许用户在其配置上设置origin值。您想将其设置为您的应用程序主机。如果您要部署到可通过https://myapp.com访问的网站,那么您可以将其用作您的Cloudfront origin。然后,来自Cloudfront的任何缓存未命中都将路由到https://myapp.com处的应用层,附加​​请求中存在的任何路径信息(例如/assets/css/whatever.css。这意味着您的应用必须能够提供这些静态资产。如果可以,那么你已经完成了设置。如果没有,请查看Rails指南,了解如何启用它。

<强>买者!您无法使用{_ 1}}的非公开访问网址。那是什么意思?例如,如果要配置隐藏在VPC后面的自己的预生产应用程序实例,则不能将这些实例用于origin。无法为Cloudfront授予对您的实例的特殊访问权限。如果您在serving private content上阅读Cloudfront的文档,则有一种解决方法;基本上,您可以向具有相应链接的任何人公开访问您的应用程序,但是您强制执行应用程序级约束以禁止访问不使用特殊签名URL或cookie的任何人。

答案 1 :(得分:0)

这很老了,但是这里的答案并不令人满意。要点和链接的文章并非要说asset_sync gem不好。本文的目的是说,您不应该在任何地方(无论是否为S3)为您的资产服务,而应从您的应用程序开始。无论您是否使用此特定的gem,将资源上传到任何地方都会遇到要点中提到的相同问题。

建议从您的应用程序服务您的资产,然后使用CDN(例如Cloudfront)减轻服务器上的负载。您无需将任何内容上传到Cloudfront。相反,Cloudfront会按需向您的应用程序请求资产并自动缓存。

但是,Cloudfront(或任何CDN)并未解决asset_sync的所有用例。如果您遇到了块大小问题,并且已经清理了存储库和不必要的依赖项,则可能仍然需要使用asset_sync将块的大小控制在500MB以下,并使Heroku保持满意。当然,您可以放弃asset_sync并使用自定义实现将其上传到S3(或其他任何地方)。