土下座しながら探索中

主に競技プログラミング

herokuのサーバー上に一時ファイルを作ったこと

herokuのサーバー上に一時ファイルを作る必要があり、それが出来るようになるまでに困ったところと解決策をメモ

1. 一時ファイルを作成できるのは /tmp 内だけ

それ以外の場所にファイルを作成しようとしても無駄です

例えば、 java で一時ファイルを作るためには次のようにする

try {
  File file = new File("/tmp/X.txt"); // /tmp 内なのでOK
  PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
  pw.println("XXXXXXX");
  pw.close();
} catch(IOException e) {}


以下のようにしても一時ファイルは作成されない

try {
  File file = new File("X.txt"); // カレントディレクトリが/tmpでないならファイルは作成されない
  PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
  pw.println("XXXXXXX");
  pw.close();
} catch(IOException e) {}

2. dynosは3つある
一時ファイルがちゃんと作成されているか確認したい
では、heroku run "ls /tmp" で確認してみよう -> 見当たらない...
見当たらないのでてっきり出来ていないものかと思いきや、そういうわけではない
dynosは3つ存在するのだ
1つ目は Web Dynos, 2つ目は Worker Dynos, 3つ目は One-off Dynos (これらの詳細は下記のリンク先で確認できる)
heroku runは(多分)One-off Dynos
1.のプログラムが実行され、ファイルを書き込んでいるのは Web Dynos か Worker Dynos のどちらか (知らない)
1.のプログラム実行後に heroku run で /tmp の中身を見ても、それらのDynosは相互に影響を与えないため確認できない
heroku公式の以下のリンク先にある Types of dynos を読むとそれが分かる
Dynos and the Dyno Manager | Heroku Dev Center
経緯
一時ファイルが作成できない
/tmpにしかファイルは書き込めないらしい
/tmpにjavaでファイルを作成して、heroku runでファイルが作成されたか確認
ない
stack overflowにそれっぽい記事がある
heroku公式の説明をちゃんと読めとある、読もう
herokuは3つのdynos上で動くらしい
One-off Dynos は temporary dynos で administrative tasks を処理するために使われる...と書いてあるのでなんとなく heroku run はここっぽい
また、javaのプログラムはadministrative taskでもないしここではなさそう
Web DynosとWorker Dynosの説明を見るかぎりjavaはこのどちらかっぽい
ひょっとしてheroku runにファイルが存在しないのは、作られてないんじゃなくて作られたサーバーが違うのでは...? => その通りだったっぽい