BLOGTIMES
2013/12/14

さくらのクラウド API を使って日次でアーカイブをとるスクリプトを書いてみた

  sakura  sh  cli  systemmanagemant  integration 
このエントリーをはてなブックマークに追加

先日の「さくらのクラウド API を使ってローカルにバックアップを取る」の続き。

ローカルにバックアップを引っ張ってくるというのも大事なことではあるんですが、通常の運用としては日次でディスクのアーカイブを自動的に取得しておいて、そこから復旧というパターンの方がお手軽なわけです。現状のさくらのクラウドのコントロールパネルでは自動的にアーカイブを作成する機能はありませんが、自動アーカイブについてはOSC2013 Kansai@Kyotoで触れられていた*1ので、後々標準になるものを今さら作るまでもないかなと思っていました。

ところが、先日のバックアップスクリプトを書いたら API の使い方がいろいろ分かってしまったので、ついでに日次アーカイブを取るスクリプトを書いてみました。

さくらのクラウド日次アーカイブスクリプト

起動すると全てディスクのアーカイブを作成します。作成されたアーカイブの名前は (ディスク名)-YYYYMMDD 、説明は daily autobackup となるので、手動で取った他のアーカイブと区別できます。また、最新以外のアーカイブについては自動的に削除されます(説明文と元ディスクIDによってアーカイブの情報を検索して、該当するものだけを削除しています。手動で作成したアーカイブを削除することはありません。)。このスクリプト cron 等にしかけて、日次で実行すると毎日アーカイブを作成して、古いものは自動的に消えるという運用ができるはずです。

アーカイブ一覧 - さくらのクラウド API を使って日次でアーカイブをとるスクリプトを書いてみた

前回と同じく Token と Secret は予め取得しておいてください。
相変らずエラーハンドリングが甘いので、実際に仕込む前にもうちょっとそのあたりを直した方がいいかも。

2015/2/3 追記

さくらのクラウドの中の人から以下のツッコミをいただいたので、スクリプトを修正しました。

スクリプト内:95~98行の部分で’available’となるまで繰り返す仕様となっておりますが、アーカイブ作成時に’failed’(失敗)となった場合に無限ループに陥る事象が発生しております。当該箇所にて無限ループとならないよう繰り返し回数の上限を設けていただくなどの修正や、記事中に当該箇所が無限ループにつながることを注意喚起をいただけませんでしょうか?

ソースコートは GitHub に移動していますので、以下からご利用ください。




実行結果

こんな感じで実行できるはずです。

2013-12-14 14:22:56 [8151]: ----- START: 999999999999 (hsur-test1) ----- 2013-12-14 14:22:56 [8151]: archive:17641.archive.json 2013-12-14 14:22:56 [8151]: create_archive() 2013-12-14 14:23:12 [8151]: ARCHIVE_ID: 999999999999 2013-12-14 14:23:42 [8151]: waiting... 2013-12-14 14:24:13 [8151]: waiting... 2013-12-14 14:24:43 [8151]: waiting... 2013-12-14 14:25:13 [8151]: waiting... 2013-12-14 14:25:44 [8151]: waiting... 2013-12-14 14:26:15 [8151]: waiting... 2013-12-14 14:26:46 [8151]: waiting... 2013-12-14 14:27:16 [8151]: waiting... 2013-12-14 14:27:47 [8151]: waiting... 2013-12-14 14:28:17 [8151]: waiting... 2013-12-14 14:28:18 [8151]: deleting old archive: 999999999999 hsur-test1-20131213 2013-12-14 14:28:19 [8151]: {"Archive":null,"Success":true,"is_ok":true} 2013-12-14 14:28:19 [8151]: ----- END: 999999999999 (hsur-test1) ----- 2013-12-14 14:28:19 [8151]: ----- START: 999999999999 (hsur-test2) ----- 2013-12-14 14:28:19 [8151]: archive:1385.archive.json 2013-12-14 14:28:19 [8151]: create_archive() 2013-12-14 14:28:22 [8151]: ARCHIVE_ID: 999999999999 2013-12-14 14:28:53 [8151]: waiting... 2013-12-14 14:29:23 [8151]: waiting... 2013-12-14 14:29:53 [8151]: waiting... 2013-12-14 14:30:24 [8151]: waiting... 2013-12-14 14:30:54 [8151]: waiting... 2013-12-14 14:31:24 [8151]: waiting... 2013-12-14 14:31:55 [8151]: waiting... 2013-12-14 14:31:56 [8151]: deleting old archive: 999999999999 hsur-test2-20131213 2013-12-14 14:31:58 [8151]: {"Archive":null,"Success":true,"is_ok":true} 2013-12-14 14:31:58 [8151]: ----- END: 999999999999 (hsur-test2) ----- 2013-12-14 14:31:58 [8151]: ===== END =====

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6333
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
ina (2016/11/29 15:10) <%HatenaAuth()%>

日次アーカイブスクリプト、利用させていただいています。
ありがとうございます。

get_old_archive_list()
ですが、SourceDiskがnull(例えば、アーカイブの元となるサーバーとディスクを削除したけど、アーカイブだけ残している、というケース)の場合、JSONtoolsで
「TypeError: Cannot read property 'ID' of null」
のエラーとなり、古いアーカイブのリストが取得できません。
その結果、日次アーカイブスクリプトを実行しても、古いアーカイブが削除されず残ってしまう、という現象が発生します。

get_old_archive_list()
で、
&& this.SourceDisk.ID == '${1}
の部分を
&& this.SourceDisk != null && this.SourceDisk.ID == '${1}
とするとよいようです。

hsur (2016/11/29 23:08) <%HatenaAuth()%>

ありがとうございます。
早速取り込ませていただきました。

Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン