Amazon Linux2で/var/runが初期化される問題


最初に

Amazon LinuxからAmazon Linux2に移行した時に発生した/var/run問題を書き残しておきます。
躓いているどなたかの参考になれば幸いです。

技術参考

  • AWS EC2
  • Amazon Linux
  • Amazon Linux2

事象

OSを再起動またはAutoScalingで新規起動する時に/var/runに配置したディレクトリが削除されている事象を発見。Amazon Linuxでは特に意識せずに/var/runを利用できていたが、Amazon Linux2では/var/runが初期化される事象が発生した。

この事象が発生したシステムではOS設定済みのAMIを元にEC2に立ち上げる方式にしていたため、EBSやEFSが原因かと思っていたが、調査した結果/var/runがそもそも初期化されているのではないか。にたどり着いた。

原因

Amazon Linux1ではRHEL5/6ベースで構築されていたものが、
Amazon Linux2ではRHEL7ベースに変更されている。
(参考: Amazon Linux2とAmazon Linuxの違いについて(メモ)

↓↓↓ Red Hat公式 - ファイルシステム2.3.3より ↓↓↓

Red Hat Enterprise Linux の前のバージョンでは、一部のプログラムで、起動初期に /var ディレクトリーをマウントする前に、実行時データを /dev ディレクトリーに格納できました。 主な Linux ディストリビューションでは、/dev ディレクトリーはデバイスノードにのみ使用し、/run を代わりに使用することが推奨されています。

したがって、Red Hat Enterprise Linux 7 では、/run ディレクトリーは、/var/run ディレクトリーをバインドマウントする一時ファイルストレージシステム (tmpfs) です。同様に、/run/lock ディレクトリーは /var/lock ディレクトリーをバインドマウントするようになりました。/run と /run/lock に格納されたファイルは、永続的ではなくなり、再起動後に保持されません。つまり、アプリケーションは、インストール時ではなく、起動時に独自のファイルとディレクトリーを再作成する必要があります

公式によるとRHEL7では/var/runが一時ディレクトリ扱いとなっており、再起動後にファイル情報が保持されない仕様と明記してある。これが原因でAmazon Linuxでは/var/runに配置していたシステムが移行した後に動かなく現象が発生した。

対処1 - /var/runに配置しない

/var/runにec2-userがアクセスできるようにディレクトリを作成しているシステムの場合は、/var/runや/tmpなどの一時ディレクトリ以外にsocketファイル等を配置しないようにすると対処できる。

対処2 - 起動時にディレクトリを自動生成するようにする

/usr/lib/tmpfiles.dディレクトリにconfファイルを作成して配置しておくことで起動時に/var/runへディレクトリを作成することができる。

/usr/lib/tmpfiles.d/user_service.conf
# Type  Path            Mode    UID             GID             Age     Argument
d       /var/run/xxxxx  0755    ec2-user        ec2-user        -

まとめ

Amazon Linux2に移行する時はAmazon Linuxの仕様だけではなくRHELの仕様も抑えておく必要があるので注意が必要です。

楽しくインフラ構築していきましょう!!!

参考

/var/run 直下に作ったディレクトリが消えないようにする
お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ