Heroku的神秘短暂文件系统不让我从S3获取文件

时间:2015-05-23 01:56:26

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

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

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

在阅读thisthis关于短暂文件系统如何工作之后,我认为该任务实际上正在运行,但文件被破坏(或者实际上已经存在但是我可以我在ls中使用heroku run bash

有人可以解释一下我的情况吗?如果我在Heroku上从S3写入我的应用程序获取文件的努力是徒劳的?如果有其他选择?

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

1 个答案:

答案 0 :(得分:2)

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

在你的情况下,你推动你的应用程序,这会创建一个(或许更多)web dynos,它运行你的Rails应用程序 - 处理Web请求。

您还可以使用下载文件的Heroku Scheduler进行预定任务。运行时会创建一个新的one-off dyno并将文件下载到该dyno的文件系统中。任务完成后,dyno和下载的文件将被丢弃。

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

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