クラウド勉強12
saklientを使った、サーバ起動&削除スクリプトのまとめ。
[長文になります]
やりたいこと:
あるサーバを、必要な時だけ起動し、不要な時は削除しておく。
クラウドのメリットを活かし、サーバ料金を節約する形だ。
概念図1:
つまり、なんらかのトリガで、サーバを起動したり削除したりする。
さくらのクラウドでの実現例は、このようになるのではないか。
概念図2:
サーバ+ディスクを起動していない時間帯は、ディスク内容をアーカイブにしておくわけだ。
アーカイブの方が、時間コストが安いためだ。
以前の記事から実験を行っているが、
上図のトリガAでは、
・以前作ったアーカイブをディスクソースとして、サーバ+ディスクを作成する。
・アーカイブを削除する。
上図のトリガBでは、
・今動いているサーバを停止し、
そのサーバのディスクをアーカイブ化し、サーバ+ディスクを削除する。
という動きになる。
トリガAのsaklientソースは、
<?PHP //ここから上は割愛 $api = API::authorize($token,$secret,$zone); //サーバを起動させる echo "searching archives<br>"; $archives = $api->archive ->withTag('myarchive') //適当なタグで。 ->limit(1) ->find(); $archive = $archives[0]; echo "creating a disk from archive<br>"; $disk = $api->disk->create(); $disk->name = "mydisk"; $disk->plan = $api->product->disk->ssd; $disk->source = $archive; $disk->save(); echo "creating a server<br>"; $server = $api->server->create(); $server->name = "myserver"; $server->plan = $api->product->server->getBySpec(1,1); //1core , 1GB $server->save(); echo "connecting the server to shared segment<br>"; $iface = $server->addIface(); $iface->connectToSharedSegment(); if (!$disk->sleepWhileCopying()) { die('failed'); } echo "waiting disk copy is done.<br>"; echo "connecting the disk<br>"; $disk->connectTo($server); echo "booting the server<br>"; $server->boot(); echo "delete archive.<br>"; $archive->destroy(); ?>
となり、標準出力は
searching archives creating a disk from archive creating a server connecting the server to shared segment waiting disk copy is done. connecting the disk booting the server delete archive.
となる。
トリガBのsaklientソースは、
<?PHP //ここから上は割愛 $api = API::authorize($token,$secret,$zone); echo "searching servers<br>"; $servers = $api->server ->limit(1) //1つしかないので簡単に ->find(); $server = $servers[0]; //var_dump($server); sleep(3); echo "stopping the server...<br>"; $server->stop(); if (!$server->sleepUntilDown()) { die('failed'); } echo "server was stopped.<br>"; echo "searching disks<br>"; $disks = $api->disk ->limit(1) //1つしかないので簡単に ->find(); $disk = $disks[0]; echo "creating a archive<br>"; $atag = "myarchive"; $archive = $api->archive->create(); $archive ->name = 'Copy:'."hoge"; $archive ->tags = [$atag]; $archive ->source = $disk; $archive ->save(); echo "deleting the server<br>"; $server->destroy(); if (!$archive->sleepWhileCopying()) { die('failed'); } echo "waiting archive copy is done.<br>"; echo "deleting the Disk<br>"; $disk->destroy(); ?>
となり、標準出力は
searching servers stopping the server... server was stopped. searching disks creating a archive deleting the server waiting archive copy is done. deleting the Disk
となる。
注意事項:
今回のテスト環境はxamppであったが、
・全ての処理が終わってからまとめてechoが出たので、
ob_flush()やflush()を使うと良いかもしれない。
・ディスクコピー時間が長い場合、php.iniの
max_execution_timeの値に注意。(こちらのエラーが先に出てしまう)
ではまた。