読者です 読者をやめる 読者になる 読者になる

phpとか

自分用備忘録なので、自分が分かる程度にしか書いてません。

aws スナップショット自動化 複数ボリュームの場合

awsすごい人気ですね

私も使用する機会が多くなりました。

バックアップ(スナップショット)が素早く簡単に取れちゃうのが素晴らしいですね~

そのスナップショットに関して、webで検索すれば、自動化方法がすぐヒットしますが、

複数ボリュームの場合を想定しているソースが見つからず改良しましたので、共有します。

まずは、aws cliの設定から!

1.awsのコンソール上で必要な操作

以下のブログ様が分かりやすかったので、ご参考ください

AWS EC2でスナップショットを定期的に自動で取得する - 怪しい物を開発するブログblog.supersonico.info


2.aws cliの設定

これに関して、awsコマンドが使えるのが前提のサイトばかりでしたので、

そもそものawsコマンドが使えるまでを説明しようとおもいます。

1.aws cliのインストール

まず、「pip」が入ってることが前提となります。

入ってない場合、以下実行

cd /usr/local/src
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
pip install awscli

これは、pipのインストールして、その後、pipによりaws cliをインストールしてます。

python get-pip.py」でエラーが起きる場合、pythonのバージョンアップが必要です。
awsの公式では、pythonのバージョンは2.6.3以上が必須と言っています。

AWS CLI のインストールと設定 - Amazon Kinesis Streamsdocs.aws.amazon.com




なので、めちゃくちゃ面倒ですが、pythonのバージョンアップが必要になります。
以下手順です

1.zlibのインストール

※これを先にやらないで、以下のpythonコンパイルをやってしまうと、エラーが起きます。必ずこの手順通り行ってください

yum install zlib zlib-devel
2.openssl-develのインストール
yum install openssl-devel
3.pythonの2.6.6インストール&コンパイル

※他にやりかたがあるかもしれませんが、2.7だと、pipのインストールがエラーになってしましました

cd /usr/local/src
curl -O https://www.python.org/ftp/python/2.6.6/Python-2.6.6.tgz tar zxf Python-2.6.6.tgz cd Python-2.6.6
./configure
make && make altinstall
4.インストールしたやつのバージョン確認
/usr/local/src/Python-2.6.6/python -V
5.もとのpython避難
mv /usr/bin/python /usr/bin/python{もとのバージョン名とか}
6.新バージョンを常時使用に
cp /usr/local/src/Python-2.6.6/python /usr/bin/python
7.バージョン確認
python -V
8.yumの修正

pythonバージョンアップしてしまうと、yumがエラーを吐くので、修正

vi /usr/bin/yum

「#!/usr/bin/python」の部分を「 /usr/bin/python{もとのバージョン名とか}」に変更(さっき移動したディレクトリ)

さて、やっとaws cliのインストールです。

sudo python get-pip.py 
pip install awscli

2.AWS CLIの初期設定

以下コマンド実行

aws configure

この設定に関しては、またしても以下のブログ様を参照(「AWS CLIの初期設定」の箇所)


AWS EC2でスナップショットを定期的に自動で取得する - 怪しい物を開発するブログblog.supersonico.info

3.いよいよスクリプトです。

以下の「INSTANCE_ID_ARR=("インスタンスID")」を自分のインスタンスIDに変更してください。

複数のインスタンスに対して実行したい場合、()中にカンマ区切りで指定してください

インスタンスIDの変更のみで動くはずですが、一応実行してご確認を。

問題なければcronに登録すれば完了です。



※「SNAPSHOTS_PERIOD」は、保持世代数です。ご自分で変更してください。

※スナップショットはvolumeごとに作成されます。

「SNAPSHOTS_PERIOD=2」で、該当インスタンスに割り当てたボリュームが2個の場合、2×2=4個のスナップショットが保持されます。

#!/bin/sh


#
# init
#

SHELLDIR=`dirname ${0}`
SHELLDIR=`cd ${SHELLDIR}; pwd`
SHELLNAME=`basename $0`

LOG_DIR="/var/log"
LOG_SAVE_PERIOD=14
LOG_FILE="${LOG_DIR}/${SHELLNAME}.log"

AZ=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
LN=`echo $((${#AZ} - 1))`
REGION=`echo ${AZ} | cut -c 1-${LN}`
SNAPSHOTS_PERIOD=2

AWS="/usr/bin/aws --region ${REGION}"

#INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
INSTANCE_ID_ARR=("インスタンスID")
PREFIX="auto-backup"

#
# log
#
rotate_log() {
    (( cnt=${LOG_SAVE_PERIOD} ))
    while (( cnt > 0 ))
    do
        logfile1=${LOG_FILE}.$cnt
        (( cnt=cnt-1 ))
        logfile2=${LOG_FILE}.$cnt
        if [ -f $logfile2 ]; then
            mv $logfile2 $logfile1
        fi
    done

    if [ -f $LOG_FILE ]; then
        mv ${LOG_FILE} ${LOG_FILE}.1
    fi
    touch $LOG_FILE
}

#
# print message
#
print_msg() {
    echo "`date '+%Y/%m/%d %H:%M:%S'` $1" | tee -a ${LOG_FILE}
}

#
# create
#

create_snapshot() {
    ## start message
    print_msg "Create snapshot Start"

    ## volume get
    VOL_ID_ARR=`${AWS} ec2 describe-instances --instance-ids $1 --output text | grep EBS | awk '{print $5}'`
    for VOL_ID in ${VOL_ID_ARR}
    do
     ## init
     NM=`${AWS} ec2 describe-volumes --volume-id ${VOL_ID} --output text --query 'Volumes[*].{Tag:Tags}'`
     DATE=`date '+%Y/%m/%d'`
     DESCRIPTION="[${PREFIX}] of ${NM:9}(${VOL_ID}) for $1 at ${DATE}"

     ## error
     if [ -z ${VOL_ID} ] ; then
         echo ${VOL_ID}
         print_msg "ERR:ec2-describe-instances"
         logger -f ${LOG_FILE}
         exit 1
     fi

     ## volume message
     print_msg "ec2-describe-instances Success : ${VOL_ID}"

     ## create
     ${AWS} ec2 create-snapshot --volume-id ${VOL_ID} --description "${DESCRIPTION}" >> ${LOG_FILE} 2>&1
     if [ $? != 0 ] ; then
         print_msg "ERR:${SHELLDIR}/${SHELLNAME} ec2-create-snapshot"
         logger -f ${LOG_FILE}
         exit 1
     fi
    done

    ## end messge
    print_msg "Create snapshot End"
}

#
# delete
#

delete_old_snapshot() {
    ## start message
    print_msg "Delete old snapshot Start"

    ## snapshot get
    VOL_ID_ARR=`${AWS} ec2 describe-instances --instance-ids $1 --output text | grep EBS | awk '{print $5}'`
    for VOL_ID in ${VOL_ID_ARR}
    do
      SNAPSHOTS=`${AWS} ec2 describe-snapshots --output text | grep $1 | grep ${PREFIX} | grep ${VOL_ID} | wc -l`

       while [ ${SNAPSHOTS} -gt ${SNAPSHOTS_PERIOD} ]
       do
          ## delete
          #SNAP_ID=`${AWS} ec2 describe-snapshots --query 'Snapshots[0].SnapshotId'  --query 'sort_by(Snapshots,&StartTime)[0].SnapshotId' --filters Name=volume-id,Values=${VOL_ID} Name=description,Values=*${PREFIX}*`
          SNAP_ID=`${AWS} ec2 describe-snapshots --output text | grep ${VOL_ID} | grep ${PREFIX} | sort -k13 | awk 'NR==1 {print $12}'`
          ${AWS} ec2 delete-snapshot --snapshot-id ${SNAP_ID} >> ${LOG_FILE} 2>&1
          if [ $? != 0 ] ; then
              print_msg "ERR:${SHELLDIR}/${SHELLNAME} ec2-delete-snapshot"
              logger -f ${LOG_FILE}
              exit 1
          fi
          SNAPSHOTS=`${AWS} ec2 describe-snapshots --output text | grep $1 | grep ${PREFIX} | grep ${VOL_ID} | wc -l`
       done
    done

    ## end message
    print_msg "Delete old snapshot End"
}

#
# excute
#

rotate_log
print_msg "INF:$SHELLDIR/${SHELLNAME} START"

for INSTANCE_ID in ${INSTANCE_ID_ARR}
do
         create_snapshot ${INSTANCE_ID}
         delete_old_snapshot ${INSTANCE_ID}
done

print_msg "INF:$SHELLDIR/${SHELLNAME} END"

exit 0

デバイスジャパン Apple iPad専用レザーケース スタンド型

デバイスジャパン Apple iPad専用レザーケース スタンド型

アップル iPad 2 Wi-Fiモデル 16GB MC769J/A (ブラック)

アップル iPad 2 Wi-Fiモデル 16GB MC769J/A (ブラック)

iPad mini 16GB Wi-Fiモデル ホワイト&シルバー MD531J/A

iPad mini 16GB Wi-Fiモデル ホワイト&シルバー MD531J/A

[rakuten:ec-current:12189686:detail]