本文へジャンプします。

APIを活用しよう - PHPで簡易コントロールパネルを作る

今回は前回までの非公式PHP SDKの解説を踏まえて、CakePHPで簡易的なコントロールパネルを作ってみたので紹介してみたいと思います。

今回実装したのは以下の3つの機能になります。

  • サーバーの一覧表示
  • サーバーの起動
  • サーバーの停止

今回はCakePHPのブラグインとして実装したので、比較的簡単に皆さんのプロジェクトにも組み込んで使っていただけるのでは無いかと思います。

*今回公開するプラグインには認証機能などは含まれていませんので、制限のかかっていない環境への配置は絶対にしないでください!

ではまずはインストール方法から説明します。

CakePHPの設定

まずは、通常通り最新のCakePHPを以下からダウンロードし展開し、通常通りの初期設定をします。

cd [インストール先]
wget --output-document=cakephp-1.3.11.tgz https://github.com/cakephp/cakephp/tarball/1.3.11
tar xvfz cakephp-1.3.11.tgz
mv cakephp-cakephp-3b830a4 controllpanel
cd controllpanel
chmod -R go+w ./app/tmp
vim ./app/config/core.php
# Security.saltとSecurity.cipherSeedを修正
cp ./app/config/database.php.default ./app/config/database.php
# defaultのデータソースに接続可能なデータベースを設定

CakePHPの設定に関しては、以前書いた記事設定用スクリプトも参考にしてみてください。

設定完了後、CakePHPを配置したURLにアクセスすると以下のように表示されると思います。

20110831_112617

今回のプラグインを試用するだけであればデータベースは使用しないのですが、なにも設定しないとエラーが出てしまうので接続可能なデータベースの設定をしてください。

 

PHP SDK/プラグインの設置

つぎに、以下の手順で非公式PHP SDKと今回作成したプラグインをダウンロードして配置します。

# SDKの配置
cd APP/vendors
wget --output-document=phpsdk-0.2a.tgz https://github.com/kaz29/unofficial-niftycloud-sdk-for-php/zipball/v0.2a
mv kaz29-unofficial-niftycloud-sdk-for-php-e051b0f niftycloud
# プラグインの配置
cd APP/plugins
wget --output-document=nifty_cloud_controll_panel_plugin.tgz https://github.com/kaz29/nifty_cloud_controll_panel_plugin/tarball/master
mv kaz29-nifty_cloud_controll_panel_plugin-ee66b20 nifty_cloud_controll_panel
API認証キーの設定

次に、使用するNifty Cloud アカウントのAPI認証キーを登録します。
NiftyCloudのコントロールパネル上の「API認証」よりREST用認証キーを作成し以下のように設定します。

cd APP
vim config/core.php
# ファイルの最後に以下の様に認証キーの設定を追加します。
Configure::write('nifty_cloud', array(
'secret_key' => "シークレットアクセスキーを入力",
'access_key' => "アクセスキーを入力",
));

これでプラグインの準備は完了です。

サーバー一覧

CakePHPを配置したURL配下の以下のURLにアクセスすると、サーバーの一覧が表示されます。

http://[path to cakephp]/nifty_cloud_controll_panel/instances

20110831_112644

 

解説

一覧表示用の処理は、instances_controller.php の indexアクションになります。CakePHPを使った事がある方ならお分かりかと思いますが、普通にデータベースからデータを表示する場合と全く同じで、Instance モデルの findメソッドを呼んでビューにセットしています。

# controllers/instances_controller.php - indexメソッド
function index()
{
$this->Instance->recursive = 0;
$this->set('instances', $this->Instance->find('all'));
}

では、findメソッドは何をしているかというとこんな感じ…

# models/instance.php
public function find($type)
{
  if (is_null($this->api)) {
    $config = Configure::read('nifty_cloud');
    $this->api = new NiftyCloud($config);
  }
 
  $result = false ;
  $api_result = $this->api->describe_instances();
  if ( $this->api->isError() ) {
    $result = array();
  } else {
    $result = array();
    foreach($api_result->reservationSet->item as $item) {
      $launch_time = date('Y/m/d H:i:s',strtotime((string)$item->instancesSet->item->launchTime));
      $result[] = array(
        $this->alias => array(
          'id' => (string)$item->instancesSet->item->instanceId,
          'type' => (string)$item->instancesSet->item->instanceType,
          'image_id' => (string)$item->instancesSet->item->imageId,
          'global_ip' => (string)$item->instancesSet->item->dnsName,
          'local_ip' => (string)$item->instancesSet->item->privateDnsName,
          'status' => (string)$item->instancesSet->item->instanceState->name,
          'launch_time' => $launch_time,
          'description' => (string)$item->instancesSet->item->description,
        )
      );
    }
  }
 
  return $result;
}

PHP SDKを使用し describe_instances メソッドを呼んで、レスポンスデータを元に標準的なCakePHPの形式の配列を生成しているだけです。

サーバー起動

サーバーの起動画面は下記のようになっています。

20110831_112658

 

解説

以下がコントローラ、モデルのコードですが、こちらもコントローラのアクションは通常のCakePHPアプリとほぼ同様です。Instanceモデルのstopメソッドでは、PHP SDK用のパラメータを生成して、start_instancesを呼び出しています。

* 今回は、OSイメージの一覧やサーバータイプ一覧は実装を出来るだけシンプルする為に、instances_controller内に固定データとして定義しています。

# controller/instances_controller.php - startアクション
public function start($id=null)
{
  if ( empty($this->data) ) {
    $this->data = array(
      'Instance' => array(
        'id' => $id,
      )
    );
   
  } else {
    $this->Instance->create();
    $this->Instance->set($this->data);
    $result = $this->Instance->start();
    if ( $result === true ) {
      $this->Session->setFlash(__('The instance has been started', true));
      $this->redirect(array('action' => 'index'));
    } else {
      $this->Session->setFlash(__('The instance could not be start. Please, try again.', true));
    }
  }
}
# models/instance.php - startメソッド
public function start()
{
  if (is_null($this->api)) {
    $config = Configure::read('nifty_cloud');
    $this->api = new NiftyCloud($config);
  }

  $params = array(
    'InstanceId'      => array($this->data[$this->alias]['id']),
    'InstanceType'    => array($this->data[$this->alias]['instance_type']),
    'AccountingType'  => array($this->data[$this->alias]['accounting_type']),
  );
 
  $api_result = $this->api->start_instances($params);
  return !$this->api->isError();
}

stop_instancesはstart_instanceと内容的にあまり差異もないので説明は省略します。

おまけ

今回、web経由でのサーバー起動/停止のみですが、おまけとしてCakePHPのシェルコマンドでも同様の操作が出来る機能も実装しました。
それぞれ下記のようにコマンドラインから実行出来ます。

# サーバーの起動
# accounting_type: 1=月額課金,2=従量課金
cake start_instance -id サーバー名 -instance_type mini -accounting_type 2
# サーバーの停止
# コマンドラインパラメータに '-force' を指定すると強制終了になります
cake start_instance -id サーバー名

CLIを使えば色々な操作がコマンドラインからできますが、まぁPHPからも出来たら良いよねってことでおまけでした。

まとめ

APIを使えばサーバーの操作はとても簡単に実装出来るのでいろいろ試して自動化出来ると面白いのではないかと思います。
今回作成したプラグインはgithubにあげてあります。これを拡張すれば例えば、ユーザー毎に操作出来るサーバーを限定するとかいろいろ出来ると思います。是非試してみてください。

ニフティクラウド 導入相談窓口
ニフティクラウド 無料セミナー

閉じる

閉じる

クラウドブログ編集部

クラウドブログ編集部

ニフティクラウド ユーザーブログ編集部のアカウントです。 編集部からのお知らせや、レギュラーライター以外のゲストによる寄稿記事を掲載していきます。

浜中 慶

浜中 慶

1980年、神奈川県生まれ。2003年ニフティ入社。 ポータルサイト開発を中心に、音楽配信サービス、CGMサービスなど様々なプロジェクトに企画/デザイン/システム担当として参加。現在は@niftyのポータルサービス向けコンテンツ管理システムの企画/開発/運用を担当。

吉田 雄哉

吉田 雄哉

株式会社co-meetingの創業メンバー。「取締役&External- facing Technologist」と名乗り新しいIT技術を広く伝える活動とWebアプリケーション開発を行う毎日。パッケージベンダーでのSaaS立上げ・製造業の情報システム部門で企画やPM・受託開発と従事してきたため、ベンダーサイドとユーザサイド の両方の視点を持ち合わせる。

石田 健亮

石田 健亮

株式会社ドリーム・アーツで小売事業者向けSaaS「Shopらん」を企画、開発。メインの仕事はプログラマーだがサーバー管理や営業もこなすユーティリティプレイヤー。最近好きな事はパフォーマンスチューニング。特に並列化プログラミングがマイブーム。キライなことはデータセンターでの作業。騒音と乾燥が弱点。ニフティクラウドでデータセンターに行く必要が無くなったことが本当の利点だ と思っている。

五月女 雄一

五月女 雄一

ニフティでは「インフラを守る簡単な様で奥が深いお仕事」をしています。 夢はインフラの気持ちが読めるエンジニアになること。

わたなべ かずひろ

わたなべ かずひろ

専門学校卒業後、ソフトウェア開発会社で電力系統制御システムの開発に従事。その後、CD-ROM等マルチメディア系PCソフトの開発を経て、1998年フリーランスに。 2000年8月に株式会社イーツーの設立に参画。携帯を含む様々なWeb系のシステム開発に携わる。現在はiPhone/Androidアプリなどの開発も手がけている。

市角

市角

ニフティクラウドのコントロールパネル設計・開発をメインに、たまにインフラの運用やお手伝いもやっていたりします。コントロールパネルや新機能の活用方法、アイデアなどを中心に書いていく予定です。

仲山 昌宏

仲山 昌宏

歌って踊れるインフラエンジニア兼、PHPもRubyもJavaも書くPerl使い。 物理サーバの運用に飽きて、フルラックに格安サーバ詰めて自宅プライベートクラウドを構築中。 今年は個人的には分散処理を攻めていきます。

猪飼 賢広

猪飼 賢広

1984年、愛知県名古屋市生まれ。大学は福島県にある某大学。2008年ニフティに入社。 開発系部署に配属後、主に各種テーマサイト開発のシステム面調整、開発進行管理役などとして参加。 現在もPC・ガラケーサイトの開発まわりを担当。インフラまわりを触る案件にも携わっており、日々修行中。 好きな芸人はなかやまきんに君とレイザーラモンRG。

久江 裕之

久江 裕之

ニフティクラウドのインフラ運用、OS提供の仕事をしています。 新しいOSやイメージが出る時にこのブログでご紹介いたします。入社5年目。一流のインフラエンジニアを目指して日々勉強中。

竹内 豪

竹内 豪

ニフティクラウド エンジニア

山口

山口

ニフティクラウドの基盤設計、新サービス/アライアンス/インフラ企画、その他雑用全般を担当しています。 クラウドに欲しい機能や、こんなふうに使ってほしいという想いが共有できれば良いですね。

芳中 隆幸

芳中 隆幸

ニフティクラウドの開発、運用を担当しています。

酒井 浩平

酒井 浩平

ニフティクラウドの中にいます。 ネットワークまわりの運用・開発や自動化などに取り組んでいます。 すべてのエンジニアを幸せにすることを目指しています。

higebu

higebu

ニフティクラウド IaaSのエンジニアです。 ネットワーク、DRサービス with VMware vCloud® Air™ Technology辺りの担当をしています。

武田

武田

ニフティクラウドの開発・運用を担当しています。 各種機能の内容についてなどで執筆させていただく予定です。

福澤真

福澤真

ニフティクラウドのコンパネ開発、運用をしています。

森藤 大地

森藤 大地

データに関する仕事が好きです。

宮原徹

宮原徹

日本仮想化技術株式会社 代表取締役社長兼CEO。仮想化技術に関するコンサルタントとして長年活動しており、特にベンチマークテストによる性能評価を得意としている。

荒谷翔

荒谷翔

株式会社はてなでMackerelのセールスデベロッパーとして勤務しています

東條 望

東條 望

2014年にニフティへ中途入社。 入社後から現在まで、ニフティクラウドのサービス企画・開発を担当しています。 各サービスの紹介を執筆させていただく予定です。

世良迪夫

世良迪夫

ニフティクラウドのRDBなどを担当しています