VPSやクラウドでいろいろ遊ぼうのblog

地方でIT屋やってます。IT全般を勉強しつつ、いろいろ遊んでみます。 情報セキュリティスペシャリスト。twitterは @hogefuga123

クラウド勉強12

saklientを使った、サーバ起動&削除スクリプトのまとめ。


[長文になります]


やりたいこと:
あるサーバを、必要な時だけ起動し、不要な時は削除しておく。
クラウドのメリットを活かし、サーバ料金を節約する形だ。


概念図1:
f:id:cloud_hobby:20141123085629j:plain

つまり、なんらかのトリガで、サーバを起動したり削除したりする。



さくらのクラウドでの実現例は、このようになるのではないか。

概念図2:
f:id:cloud_hobby:20141123085752j:plain

サーバ+ディスクを起動していない時間帯は、ディスク内容をアーカイブにしておくわけだ。
アーカイブの方が、時間コストが安いためだ。


以前の記事から実験を行っているが、

上図のトリガ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の値に注意。(こちらのエラーが先に出てしまう)


ではまた。