AWSのEC2を利用するときに基本として設定するものをまとめる。
WebサーバでもBatchサーバでも以下をとりあえず以下を設定しておくとよいのではないでしょうか。
[設定する内容]
- マシン起動時スクリプト(per-boot)
- SWAPファイル設定
- HOST名設定
- ファイルディスクプリタ設定、スレッド設定
- limit.conf
- sysctl.conf
[マシン起動時スクリプト(per-boot)]
SWAPファイル設定を起動時に実施。EC2はデフォルトでSWAP設定がない。
(ほぼ参照:http://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/)
create_swap.sh
#!/bin/sh
SWAPFILENAME=/swap.img
MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
MEMSIZE_D=`expr $MEMSIZE \* 2`
MEMSIZE_H=`expr $MEMSIZE / 2`
if [ $MEMSIZE -lt 2097152 ]; then
SIZE=${MEMSIZE_D}k
elif [ $MEMSIZE -lt 8388608 ]; then
SIZE=${MEMSIZE}k
elif [ $MEMSIZE -lt 67108864 ]; then
SIZE=${MEMSIZE_H}k
else
SIZE=4194304k
fi
fallocate -l $SIZE $SWAPFILENAME && chmod 600 $SWAPFILENAME && mkswap $SWAPFILENAME && swapon $SWAPFILENAME
HOST名設定を起動時に実施 EC2のタグ:NameがそのままHost名になるため、SSHログイン後の判別が簡単。
set_hostname.sh
#!/bin/sh
REGION=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/.$//'`
INSTANCE_ID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id`
NAME_TAG=`/usr/bin/aws ec2 describe-instances --region ${REGION} --instance-ids ${INSTANCE_ID=} --query 'Reservations[].Instances[].Tags[?Key==\`Name\`].Value' --output text`
INSTANCE_NAME="${NAME_TAG}"
hostname ${INSTANCE_NAME}
sed -i -e "s/^HOSTNAME=.*\$/HOSTNAME=${INSTANCE_NAME}/g" /etc/sysconfig/network
[ファイルディスクプリタ設定、スレッド設定]
FD設定。大体やり忘れてアプリケーション実行時に足りなくなる。
また、スレッド数も同じことになるので、kernel.threads-maxで設定しておく。
/etc/security/limits.conf
#以下を末尾に追加
* soft nofile 65536
* hard nofile 65536
/etc/sysctl.conf
fs.file-max = 100000
kernel.threads-max = 100000