【问题标题】:The Mystical Ephemeral File System of Heroku is Not Letting Me Get Files from S3Heroku 的神秘临时文件系统不允许我从 S3 获取文件
【发布时间】:2015-08-05 03:37:15
【问题描述】:

所以,我这几天一直在努力解决这个问题...我需要从 S3 获取一个文件并将其写入 Heroku 上我的 Rails 应用程序的目录中。我必须有一个对 Heroku 上的临时文件系统的误解,因为我不知道为什么它不工作。

我正在运行 s3.bucket('bucket').object('file.csv').get(response_target: 'file.csv') 从 S3 获取文件并将其写入我的应用程序。最初我只是写了一个.rb 来执行此操作并使用Heroku Scheduler 运行它,但无济于事。然后,我将脚本变成了一个 rake 任务,并在 scheduler 上再次运行,但无济于事。我能够在我的开发环境中完美地运行 .rb 脚本和 rake 任务。

在阅读thisthis 了解临时文件系统的工作原理后,我认为该任务实际上正在运行,但文件被破坏(或者实际上存在但我看不到它?) 当我在heroku run bash 中使用ls 时。

谁能解释一下我发生了什么事?如果我从 S3 获取文件写入 Heroku 上的应用程序的努力是徒劳的?如果有其他选择吗?

如果在此之后我无法弄清楚,那么我将在 EC2 中设置我自己的环境。

【问题讨论】:

  • 绝对有可能。您可以查看著名的 Hartl 教程 here,通过他的微博示例查看它的实际效果。如果我记得,当我阅读本教程时,我自己对此有点挣扎,我遇到的问题是政策(确保你有一个到位并且它足够广泛以允许你想要的行动)。
  • Heroku 不支持你想做的事情。可以将tmp文件写入本地文件系统,但是这些文件会被自动删除。
  • @steve 你能发布一个简单的例子吗?
  • @spickerman 从 S3 中提取此文件至关重要,每次用户使用该应用程序时都会使用这些内容...因此,您是否建议从 S3 中提取文件,并将其写入临时文件,将结果提供给用户,然后每次都销毁它,否则这不是一个好习惯。该文件是一个相当小的.csv 表。
  • 为什么您不能直接从 Amazon S3 提供文件,就像您可以从内容交付网络提供引导程序或 JavaScript 一样。您会发现这种方法更具可扩展性。

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


【解决方案1】:

使用 Heroku,您无需运行单个应用程序,而是有多个 dynos,每个都有您的代码副本并运行应用程序的某些方面,并且每个都独立于其他应用程序。特别是每个 dyno 的文件系统都是独立的。

在您的情况下,您推送您的应用程序,这将创建一个(或更多)网络测功机,它运行您的 Rails 应用程序 - 处理网络请求。

您还有一个使用Heroku Scheduler 下载文件的计划任务。当它运行时,会创建一个新的one-off dyno,并将文件下载到该测功机的文件系统中。任务完成后,dyno 以及下载的文件将被丢弃。

当您运行 heroku run bash 时,您又创建了另一个一次性测功机,显然该文件不在该测功机的文件系统中。

解决方案将取决于您正在尝试做什么,但一个建议是将文件中的数据放入您的数据库中,以便其他 dynos 可以轻松访问它。

【讨论】:

  • 谢谢。我以前听过这个,但由于某种原因,它只是点击了。所以基本上,Heroku 是这个应用程序的错误平台。
  • @Dixon11111:我认为你的设计是错误的。 Web 服务器应该是无状态的。如果您依赖下载到本地文件系统的文件,您的应用程序将无法水平扩展。 Heroku 让这一点非常明显。
  • 我怀疑是这样的。
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2013-03-19
  • 2019-11-11
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多