[VULTR] APIを使ってスナップショット、サーバ破棄・生成を自動化しよう
VultrのVPSは使用しないときに破棄しておけば課金されないので、週末などはサーバを破棄しておくことで節約が可能になります。そこで、スナップショットをとってサーバを破棄するまでの一連の手順を自動化してみました。作成したLinuxサーバ用のスクリプトを紹介します。
毎週IPアドレスが変わるのはだるすぎますが、月額費用を2/3程度に抑えられます。自動でできるならアリかなーという感じです。
cronに登録するだけのスクリプト全体を公開したいところなのですが、Shellプログラミングはほぼ初めてで、途中経過のチェックコードが汚すぎるので断念します。必要なポイントのコードを載せておくので、組み合わせて使って下さい。
Vultrって何?
月$20ドルからWindowsを使用できるVPS(Virtual Private Server)サービスです。いわゆる激安VPS(Contabo,WinVPSなど)よりは少し価格帯がアップしますが、機能、性能、安定性、どれをとっても申し分ないところだと思います。特にスナップショット機能を使うことで、現在のサーバ環境をまるごとコピーすることができます。バックアップの代わりや、サーバのスケールアップも楽々できるのがウリです。もちろん筆者も愛用しております。
この記事ではVultr特有のスナップショット機能と外部API機能を駆使して月額費用を2/3程度に押さえ込む方法を紹介します。つまり月$20のプランが月$14程度で使えることになります。年間にすると$72なので地味に嬉しいですね!
①APIの有効化
まず、VultrのAPIを叩ける環境を用意するところから始まります。
・APIキーの有効化
・スクリプトを実行するサーバIPアドレスの登録
を行います。この辺りを参考にして下さい。
②サーバ停止
スナップショットを作成する前に、全サーバを一度停止します。
KEYには①で有効化したAPIキーを記入します。
#! /bin/sh
KEY='*****'
ENDPOINT='https://api.vultr.com'
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/list | tr '}' '\n' | grep -v '^$' |\
sed 's/.*{//' | grep -v '^\[\]' | while read LINE;
do
SUBID=`echo $LINE | tr ',' '\n' | grep -e "SUBID" | sed 's/^.*://' | tr -d '"'`
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/halt --data "SUBID=${SUBID}"
echo "${SUBID} is stopped ."
done
③スナップショット作成
全サーバのスナップショットを作成します。
#! /bin/sh
KEY='*****'
ENDPOINT='https://api.vultr.com'
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/list | tr '}' '\n' | grep -v '^$' |\
sed 's/.*{//' | grep -v '^\[\]' | while read LINE;
do
SUBID=`echo $LINE | tr ',' '\n' | grep -e "SUBID" | sed 's/^.*://' | tr -d '"'`
DCID=`echo $LINE | tr ',' '\n' | grep -e "DCID" | sed 's/^.*://' | tr -d '"'`
locatoin=`echo $LINE | tr ',' '\n' | grep -e "location" | sed 's/^.*://' | tr -d '"'`
VPSPLANID=`echo $LINE | tr ',' '\n' | grep -e "VPSPLANID" | sed 's/^.*://' | tr -d '"'`
vcpu_count=`echo $LINE | tr ',' '\n' | grep -e "vcpu_count" | sed 's/^.*://' | tr -d '"'`
cost_per_month=`echo $LINE | tr ',' '\n' | grep -e "cost_per_month" | sed 's/^.*://' | tr -d '"'`
NOTE="$SUBID/$DCID/$locatoin/$VPSPLANID/$vcpu_count/$cost_per_month"
SNAPSHOTID=`curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/snapshot/create --data "SUBID=${SUBID}" --data "description=${NOTE}"`
SNAPSHOTID=`echo $SNAPSHOTID | sed 's/^.*://' | tr -d '"}'`
echo "${SNAPSHOTID} is created."
done
④サーバ破棄
全サーバを破棄します。
#! /bin/sh
KEY='*****'
ENDPOINT='https://api.vultr.com'
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/list | tr '}' '\n' | grep -v '^$' |\
sed 's/.*{//' | grep -v '"status":"pending"' | grep -v '^\[\]' | while read LINE;
do
SUBID=`echo $LINE | tr ',' '\n' | grep -e "SUBID" | sed 's/^.*://' | tr -d '"'`
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/destroy --data "SUBID=${SUBID}"
echo "${SUBID} is destroyed."
done
⑤復元(スナップショットからサーバ生成)
③のスクリプトで生成されたスナップショットからサーバを生成します。
#! /bin/sh
KEY='*****'
ENDPOINT='https://api.vultr.com'
OSID='164'
os_name='snapshot'
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/snapshot/list | tr '}' '\n' | grep -v '^$' |\
sed 's/.*{//' | while read LINE;
do
SNAPSHOTID=`echo $LINE | tr ',' '\n' | grep -e "SNAPSHOTID" | sed 's/^.*://' | tr -d '"'`
description=`echo $LINE | tr ',' '\n' | grep -e "description" | sed 's/^.*://' | tr -d '"'`
if test `echo ${description} | tr '/' '\n' | wc -l` -eq 6; then
SUBID=`echo ${description} | cut -d '/' -f 1`
DCID=`echo ${description} | cut -d '/' -f 2`
locatoin=`echo ${description} | cut -d '/' -f 3`
VPSPLANID=`echo ${description} | cut -d '/' -f 4`
vcpu_count=`echo ${description} | cut -d '/' -f 5`
cost_per_month=`echo ${description} | cut -d '/' -f 6`
NOTE="$SNAPSHOTID/$DCID/$locatoin/$VPSPLANID/$vcpu_count/$cost_per_month"
NOTE=`echo $NOTE | sed 's/ /%20/g'`
if [ -n "${DCID}" ] && [ -n "${VPSPLANID}" ] && [ -n "${OSID}" ]; then
CREATEID=`curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/create --data 'DCID='${DCID} --data 'VPSPLANID='${VPSPLANID} --data 'OSID='${OSID} --data 'SNAPSHOTID='${SNAPSHOTID} --data 'label='${NOTE}`
echo "${CREATEID} is created."
fi
fi
done
⑥スナップショット削除
⑤で復元済みのスナップショットを削除します。生成済みサーバリストを参照し、ラベルに同じスナップショットIDが含まれるサーバがあれば、そのスナップショットを削除します。関係の無いスナップショットが削除されることはありません。
#! /bin/sh
KEY='*****'
ENDPOINT='https://api.vultr.com'
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/server/list | tr '}' '\n' | grep -v '^$' |\
sed 's/.*{//' | grep -v '"status":"pending"' | while read LINE;
do
#echo $LINE | tr ',' '\n' | grep -e "label" | sed 's/^.*://' | tr -d '"' | cut -d '/' -f 1
label=`echo $LINE | tr ',' '\n' | grep -e "label" | sed 's/^.*://' | tr -d '"'`
SNAPSHOTID=`echo ${label} | cut -d '/' -f 1`
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/snapshot/list | tr '}' '\n' | grep -v '^$' |\
sed 's/.*{//' | grep -v '"status":"pending"' | while read LINE2;
do
if test "`echo $LINE2 | tr ',' '\n' | grep -e "SNAPSHOTID" | sed 's/^.*://' | tr -d '"'`" = "${SNAPSHOTID}"; then
curl -H "API-Key: ${KEY}" ${ENDPOINT}/v1/snapshot/destroy --data "SNAPSHOTID=${SNAPSHOTID}"
echo "${SNAPSHOTID} is deleted."
fi
done
done
最後に
記事がお役に立てれば幸いです。良かったら筆者の販売中の自動売買システム(MT4用エキスパートアドバイザ)も見ていってください^^