見出し画像

[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用エキスパートアドバイザ)も見ていってください^^


いいなと思ったら応援しよう!