AWS Batchでインスタンスストレージを使う方法


欲しいのはEBSじゃなくてエフェメラルなディスク

AWS BatchでEBSを使う方法なら、どこにでも書いてある。でもインスタンスストレージは? 2020年1月25日調べでは、どうやらどこにも書いてない。
エフェメラルなディスクが欲しいときにEBSを使うと、アホな管理の手間が発生するし、おそらくはインスタンスストレージのほうが速い。

結論

1. BatchのCompute environmentで、Instance typesにc5dなどのインスタンスストレージつきのを選ぶ

2. ジョブが走るコンテナ内でlsblkする

c5d.4xlargeの場合、ログはこうなる:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/nvme2n1 259:0 0 372.5G 0 disk
/dev/nvme1n1 259:1 0 22G 0 disk
└─/dev/nvme1n1p1 259:5 0 22G 0 part
/dev/nvme0n1 259:2 0 8G 0 disk
├─/dev/nvme0n1p1 259:3 0 8G 0 part /etc/hosts
└─/dev/nvme0n1p128 259:4 0 1M 0 part

どう見ても/dev/nvme2n1がインスタンスストレージ。これを直にマウントしようとしても、コンテナ内のファイルシステムからでは見つからない。ファイルシステムから見えないものが、なぜかlsblkでは見えるのだ。この盲点を発見するまで、地獄めぐりをさせられた。

3. Job definitionのLinux Parametersでデバイスをマッピング

ホストもコンテナも、パスは/dev/nvme2n1でOK。パーミッションは当然全部加える。privilegedもオン。

4. ジョブの最初に走るbashスクリプトの冒頭で、フォーマットしてマウント

mkfs.ext4 -E nodiscard /dev/nvme2n1
mkdir $HOME/scratch_dir
mount -o discard /dev/nvme2n1 $HOME/scratch_dir