EC2 にアタッチした EBS の空き容量を監視して、自動的に拡張する方法

Amazon Elastic Block Store(EBS)オートスケーリング Amazon Linux
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

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/autoscaling

Cron により毎週実行されるので、空き容量の監視をしたり、EBS の容量を手動で変更する手間がなくなりました。

参考にしたサイト

Amazon EBS ボリュームの変更をリクエスト - Amazon EBS
Amazon EBS ボリュームのサイズ、パフォーマンス、タイプを変更します。
Amazon EBS ボリュームのサイズ変更後にファイルシステムを拡張 - Amazon EBS
ファイルシステムを拡張し、拡張された Amazon EBS ボリュームで利用可能なスペースを埋める方法について説明します。

コメント

タイトルとURLをコピーしました