以前、VPSのVultrのインスタンスでのVultr APIを利用したスナップショット取得について記事にしました。
Vultr APIを使ったお手軽スナップショット取得
上記記事の時点では使われていたAPI v1は2023年6月には廃止予定で、API v2への移行時期が迫っています。API v2ではRESTベースでAPIの体系が作り直されたためそこそこの修正が必要となります。
APIのリファレンスは以下になります。
Vultr API (2.0)
ここで、以前の記事で作成したスナップショット作成・削除スクリプトのAPI v2版を公開しておきます。curlとjqはインストールされている前提になります。
なお、共通インクルード中の"YOUR_VULTR_API_PERSONAL_ACCESS_TOKEN"は各自のアクセストークンに置き換えてください。
アクセストークンですが、Vultrの管理画面(my.vultr.com)の左メニューから「Account」を選択し、「API」タブを表示すると"Personal Access Token"の項目に表示されています。
また、同じページにある「Access Control」の項目でAPIを発行するインスタンスのIPv4アドレス、IPv6アドレスを追加しておかないとAPI呼び出し時に {"error":"Unauthorized IP address: アクセスしたIPアドレス","status":401}
のようなエラーが発生します。
共通インクルード
#!/bin/bash
METADATA='http://169.254.169.254'
API='https://api.vultr.com'
KEY='YOUR_VULTR_API_PERSONAL_ACCESS_TOKEN'
スナップショット取得
#!/bin/bash
SRCPATH=`dirname ${0}`
source ${SRCPATH}/settings.sh
echo '------------------- create snapshot'
date
SERVERID=$(curl -sS ${METADATA}/v2/meta-data/SUBID)
INSTANCEID=$(curl -sS ${METADATA}/v2/meta-data/instance-v2-id)
echo ${SERVERID}, ${INSTANCEID}
EPOCH=$(date +%s)
echo ${EPOCH}
# create a snapshot of this server with server name and current time as description
SNAPSHOTID=$(curl -sS "${API}/v2/snapshots" -X POST \
-H "Authorization: Bearer ${KEY}" -H "Content-Type: application/json" \
--data "{
\"instance_id\" : \"${INSTANCEID}\",
\"description\" : \"${SERVERID}-${EPOCH}\"
}" |jq -r '.["snapshot"]["id"]')
echo new snapshot id=${SNAPSHOTID}
# show a list of snapshots for this server
echo current snapshots are:
curl -sS "${API}/v2/snapshots" -X GET -H "Authorization: Bearer ${KEY}" \
|jq -r '.["snapshots"][]|[.description, .id]|@tsv'|grep ${SERVERID}|sort
スナップショットの概要としてインスタンスメタデータから取得したインスタンスの識別子と作成時のunixタイムを付与しています。好みに応じてyyyyMMdd形式などにしてもいいと思います。
ただし、スナップショット名が時系列に対して昇順で並ぶようにしないと後続のスナップショット整理で古い方から消していく処理がうまくいきません。
スナップショット整理
#!/bin/bash
SRCPATH=`dirname ${0}`
source ${SRCPATH}/settings.sh
# maximum number of snapshots to keep
SNAP_MAX=3
echo '------------------- trunc old snapshots'
date
SERVERID=$(curl -sS ${METADATA}/v2/meta-data/SUBID)
echo ${SERVERID}
# get a list of older snapshots for this server that have exceeded the max count
LIST_REMOVE=$(curl -sS "${API}/v2/snapshots" -X GET -H "Authorization: Bearer ${KEY}" \
|jq -r '.["snapshots"][]|[.description, .id]|@tsv'|grep ${SERVERID}|sort \
|awk '{print $2}'|head --lines=-${SNAP_MAX})
echo "[ ${LIST_REMOVE} ]"
# let's remove old sunapshots
for SNAPID in ${LIST_REMOVE}; do
curl -sS "${API}/v2/snapshots/${SNAPID}" -X DELETE -H "Authorization: Bearer ${KEY}"
done
自分自身のスナップショットの一覧を取得し、指定の本数以上のスナップショットを古い方から削除します。
シェル変数のSNAP_MAXが残すスナップショットの本数になります。
Vultrではスナップショットには \$0.05/GB/month のコストが発生するため、あまり無分別に取得すると意外に大きな出費になります。
なお、感覚的に一瞬で終わるAWS EBSのスナップショットなどとは異なり、相変わらずスナップショットの取得には\$6インスタンスの32GB SSDで20~30分くらいかかる様子なので(AWSのスナップショット取得の速さが異常)、スナップショット整理は取得の30分くらい後に走らせたほうが安全でしょう。