AWS の EC2 上に構築したメールサーバーを運用していて、メールのデータはマウントされた別のディスク(EBS)に蓄積するようにしています。
料金を抑えるために EBS の容量も実際の使用量に合わせて設定し、定期的に空き容量を確認・足りなくなってきたら手動で少しずつ増やすという運用をしていました。
せっかくオートスケーリングができる AWS を使っているので、自動化してみようという事でスクリプトを組んだので記録しておきます。
環境
- CentOS Linux release 7.9.2009 (Core)
- awscli.noarch 1.14.28-5.el7_5.1
- xfsprogs.x86_64 4.5.0-22.el7
※メールのデータは /home/maildata にマウントした EBS に蓄積される。
シェルスクリプト
ポイント
CentOS 7 で構築しているので、パーティションは XFS、マウントしている EBS のタイプは gp2 で運用している場合のスクリプトです。
ポイントとしては空き容量の単位を GB で固定したいので、df コマンドは BG オプションを付けて取得します。
また、aws cli を使ってボリュームサイズを変更後にパーティションサイズを拡大する流れなのですが、aws ec2 modify-volume を実行するとステータスが modifying となり、その後しばらく optimizing となります。この間はパーティションサイズが変更できませんので、EBS ボリュームのステータスが completed になるのを待機してから、ファイルシステムを拡張する必要があります。
実際のスクリプト
#!/bin/bash
##############################
# 空き容量の閾値(GB)
LIMIT=10
# 追加する容量(GB)
ADD=5
# Elastic Block Store
VOLID=vol-xxxxxxxxxxxxxxxxxx
TYPE=gp2
#The parameter iops is not supported for gp2 volumes.
#IOPS=900
# メールデータのマウントポイント
PARTITION=/home/maildata
##############################
# 監視パーティションのSizeを抽出
SIZE=`df -BG | grep $PARTITION | awk '{print $2}' | awk -F 'G' '{print $1}'`
# 監視パーティションのUsedを抽出
USED=`df -BG | grep $PARTITION | awk '{print $3}' | awk -F 'G' '{print $1}'`
# 監視パーティションのAvailを抽出
AVAIL=`df -BG | grep $PARTITION | awk '{print $4}' | awk -F 'G' '{print $1}'`
# 変更後のパーティションサイズ
MODIFIED=$(($SIZE+$ADD))
# 空き容量チェック
if [ $AVAIL -lt $LIMIT ]
then
echo -e "メールデータ空き容量レポート\n"
# EBSボリューム変更
echo -e "$PARTITION の現在の容量は $USED / $SIZE GB です。\n空き容量が閾値の $LIMIT GBを下回ったため、EBSのボリューム変更を開始します...\n"
# gp2 の場合
aws ec2 modify-volume --volume-type $TYPE --size $MODIFIED --volume-id $VOLID
# gp2 以外の場合
#aws ec2 modify-volume --volume-type $TYPE --iops $IOPS --size $MODIFIED --volume-id $VOLID
# 進行状況チェック
while [ `aws ec2 describe-volumes-modifications --volume-ids $VOLID | awk '{print $2}'` = 'modifying' ]
do
sleep 1m
done
while [ `aws ec2 describe-volumes-modifications --volume-ids $VOLID | awk '{print $2}'` = 'optimizing' ]
do
sleep 5m
done
# ファイルシステム拡張
if [ `aws ec2 describe-volumes-modifications --volume-ids $VOLID | awk '{print $3}'` = 'completed' ]
then
# XFS の場合
xfs_growfs -d $PARTITION
# Nitro System の場合
#DEVICE=`df | grep $PARTITION | awk '{print $1}'`
#growpart $DEVICE 1
echo -e "\n$PARTITION のパーティションサイズを $ADD GB拡大しました!\n"
fi
# 経過時間を表示
i=$SECONDS
((sec=i%60, min=(i%3600)/60, hrs=i/3600))
timestamp=$(printf "%d:%02d:%02d" "$hrs" "$min" "$sec")
echo "処理にかかった時間 $timestamp \n"
echo "$PARTITION の現在の容量は $USED / $MODIFIED GB です。\n"
fi定期実行
このスクリプトを /etc/cron.weekly/autoscaling として配置し、実行権限を付与しました。
chmod +x /etc/cron.weekly/autoscalingCron により毎週実行されるので、空き容量の監視をしたり、EBS の容量を手動で変更する手間がなくなりました。


コメント