AWS Elastic Beanstalk のウェブコンソールではメモリ容量はインスタンスタイプ設定でできるものの swap 設定はできません。
なので、ebextension に書くことで設定します。
swapを設定するところまではネットに転がっていたのですが、永続化まで考慮に入れている記事がなかったのでこの記事を書きました。
swaponコマンドで実行したものは再起動すると設定が巻き戻ってしまうので、fstabファイルに設定を書いておきます。
書き方
アプリケーションのトップディレクトリに.ebextensions
ディレクトリを作成し、その中に swap.config
とでも名前をつけて以下の内容を配置します。
commands:
000_create_file:
test: test ! -e /swapfile
command: dd if=/dev/zero of=/swapfile bs=1M count=1024 && chmod 600 /swapfile
001_mkswap:
command: mkswap /swapfile
ignoreErrors: true
002_swapon:
command: swapon /swapfile
ignoreErrors: true
003_fstab:
test: test `grep -c swap /etc/fstab` -eq 0
command: echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
ステップ順に軽い解説をしておきます
- 000_create_file
- /swapfile という名前の0埋めされたファイルを作ります
- swapはメモリの拡張のためにファイルを使う方式なので、ストレージサイズがタイトな場合には予め増量しておいた方が良いと思います。筆者の環境ではサーバに8G、使用中4G程度あったので、2Gのスワップを割り当てると残りがかなりタイトになってしまう状態でした
-
test ! -e /swapfile
はファイルがなかったら作るためのshellコマンドです
- 001_mkswap
- ファイルを元にswap領域を作成します
- ignoreErrors しないとすでに転換が済んでいる場合にエラーが出るので入っています
- 002_swapon
- スワップ領域を使用します
- 003_fstab
- 以下に記述
fstabに記述がすでにある場合には次のデプロイで書き込む必要がないので、存在チェックをしています。
test `grep -c swap /etc/fstab` -eq 0
grep -c swap /etc/fstab
がfstabファイルに存在するswap
と書かれている行数で、-eq 0
はそれが0行であることをチェックしています
fstab の中身は最終的に以下のようになります。
[ec2-user@ip-172-31-26-7 ~]$ cat /etc/fstab
#
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/swapfile swap swap defaults 0 0
おまけ
ebextension はデプロイしないといけないので動作確認の負荷が高いです。
test コマンドの実行などは手元環境で試した方が楽です。
こちらのebextensionの内容の確認をしたいケース。
003_fstab:
test: test `grep -c swap /etc/fstab` -eq 0
command: echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
以下のようにシェルのワンライナーでだいたい確認することができます。
if test `grep -c swap /etc/fstab` -eq 0 ; then echo "/swapfile swap swap defaults 0 0" >> /etc/fstab; fi