tabimoba.net

とあるエンジニアの雑記帳

さくらのクラウドでアーカイブのゾーン間転送を低コストかつ高速に行う方法(APIを利用)

はじめに

さくらのクラウドは、アーカイブ(スナップショット)のゾーン間転送に対応していますが、現時点(2019年10月5日時点)における公式な手順としては、コントロールパネル上から行う方法しかなく、APIのみでゾーン間転送を行う方法がありません。

代替となる方法はありますが、その手順は非常に冗長かつコスト高なものとなっています。具体的には次のような手順で行うことになります。

1.転送元ゾーンでアーカイブを作成する 2.アーカイブのFTP転送(FTPS)を有効化する 3.転送先にバックアップサーバのようなものを用意し、FTPでアーカイブをダウンロードする 4.バックアップサーバから転送先ゾーンへアーカイブをアップロードする 5.アーカイブのFTP転送(FTPS)を無効化する

以下のURLがイメージ掴みやすいでしょう。

この手順の問題点は、アーカイブファイルを一時的に処理(ダウンロード、アップロード)するための中間サーバが必要なことです。

まず、一旦ファイルをダウンロードして、アップロードするという手順がボトルネックとなります。ダウンロードとアップロードという余計な処理が発生するため、コントロールパネル上からゾーン間転送を行った場合と比較して、およそ3倍以上の処理時間が必要となります。例えば、1TBのような大容量のアーカイブイメージの場合、1日以内に処理が完了しない恐れがあります。

また、中間サーバを用意しなければならないという点がコストになります。例えば、1TBのような大容量のアーカイブイメージをを転送する場合は、2TB以上のディスクを中間サーバ上に用意しておく必要があります。特に、さくらのクラウドの場合、ディスク(ボリューム)の料金が高額ですので、このコストは無視できません。

公式な手順としては上記のとおりで、このままでははっきり言って実用に耐えないのですが、実はさくらのクラウドは既にAPIによるアーカイブのゾーン間転送に対応しています。非公式な手順ではありますが、その手順について、以下で解説します。

手順

cURLの場合は、以下のコマンドを実行します。

curl -X POST \
        --user "<アクセストークン>:<アクセストークンシークレット>" \
        -d "{\"Archive\":{\"Name\":\"<転送元アーカイブ名>\",\"Description\":\"\",\"Tags\":[],\"SizeMB\":<転送元アーカイブサイズ(MB)>,\"Icon\":{}},\"Count\":0}" \
        <転送元API URL>archive/<転送元アーカイブID>/to/zone/<転送先ゾーンID>

入力値について

アクセストークン

さくらのクラウドコントロールパネルのホーム画面の「API」キーより確認可能です。

アクセストークンシークレット

さくらのクラウドコントロールパネルのホーム画面の「API」キーより確認可能です。

API URL(エンドポイント)

https://developer.sakura.ad.jp/cloud/api/1.1/ より

https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1/ (東京第1ゾーン) https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/ (石狩第1ゾーン) https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/ (石狩第2ゾーン) https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/ (Sandbox)

アーカイブID, アーカイブ名

さくらのクラウド コントロールパネルの各ゾーンの「アーカイブ」の一覧より、アーカイブを選択し「詳細」をクリックすることで確認可能です。

または、以下のコマンドで確認可能です。(usacloudがインストールされていること) 「Name」キーの値がアーカイブ名、「SizeMB」キーの値がアーカイブサイズ(MB)となります。

$ usacloud --zone <ゾーン名> archive ls --scope user

なお、ゾーン名は以下のコマンドで確認可能です。 Nameというキーに対応する値がゾーン名となります。

$ usacloud zone

ゾーンID

以下のコマンドで確認可能です。(usacloudがインストールされていること) IDというキーに対応する値がゾーンIDとなります。

$ usacloud zone

注意点

さくらのクラウドのアーカイブ機能は、アーカイブ作成やアーカイブのゾーン間転送が、1ゾーンあたり同時4実行までしか行なえません。(4つを超えてアーカイブ作成やゾーン間転送を行うとエラーになります)

このため、cronなどで自動実行させたい場合は、アーカイブの実行状況(同時実行数)を定期的に確認のうえ、処理を進める必要があります。

例えば、処理前に次のようなスクリプトを実行し、次のコードを実行することで、実行数が超過する場合は処理待ちとする等の工夫が必要となります。

while [ `usacloud --zone tk1a archive ls --scope user | jq .[].Availability |grep -e transfering -e migrating | wc -l` -gt 2 ]
do
        echo "Waiting Jobs..."
        sleep 600
done

最後に

本手順はさくらのクラウドの公開APIとして用意されている(公式ドキュメント等に記載されている)ものではありません。コントロールパネルからアーカイブのゾーン間転送を行う際の出力結果をもとにしています。

(コントロールパネル上から確認できますので)完全な非公開APIというわけではありませんが、公式でもありませんので、APIの仕様変更や、APIの機能制限等により、予告なしに本機能(API)が利用できなくなる場合も可能性として考えられますので、その点予めご理解ください。