本文へジャンプします。

ニフティクラウドAPIを使ってみよう(PHP編)

はじめまして、株式会社イーツーのわたなべです。
普段はWebアプリの開発やiPhoneアプリの開発などをやってます。

今回、ニフティクラウド ユーザーブログに記事を書く機会を頂いたのでがんばって書いてみようと思います。

ニフティクラウドAPI

昨年秋、待望のニフティクラウドAPIが公開されました。APIを使用する事で、独自のコントロールパネル拡張やオートスケールなどニフティクラウドを便利に使いこなす機能を自前で実装する事が出来る様になります。
現状ニフティクラウドAPIへのアクセスには、SOAPインターフェースを使用する方式のみの提供となっております。
このため、ニフティクラウドAPIの紹介ページにも書かれている通り以下の様なかなり広範な前提知識が必要となります。

  • XMLに関する知識
  • Webサービスの基本構造に関する知識
  • SOAP通信に関する知識
  • WS-Securityに関する知識
  • X.509に関する知識

また、現状ニフティクラウドにはSDKが存在しないため、公式にはAPIヘのアクセスを自前で構築しようとするとそれなりの手間が必要になります。

しかし、ニフティクラウドAPI は、AWS(Amazon Web Service)互換であるため、AWSのチュートリアルに手を入れれば比較的簡単にAPIへのアクセスを実現できます。

今回は、AWSのチュートリアル(Introduction to AWS for PHP Developers)を元に、ニフティクラウドAPI にアクセスする方法を解説したいと思います。

証明書の作成、ダウンロード

APIの利用には「クライアント証明書」が必要になります。下記の要領で「秘密鍵」と「クライアント証明書」を準備してください。

「アカウント」メニューをクリック

001

「セキュリティ」セクションの「新規作成」をクリックし証明書を発行

002

「秘密鍵」と「クライアント証明書」をダウンロード

003

* なお、当然の事ながら証明書があればニフティクラウドAPIへのアクセスが出来てしまうので「秘密鍵」と「クライアント証明書」の取り扱いには十分注意してください。

実行環境の説明

今回のサンプルの動作環境は下記の通りです。

  • PHP 5.1.2以降
  • XSL 拡張モジュール
  • DOM 拡張モジュール
  • SOAP 拡張モジュール
  • mcrypt 拡張モジュール
  • sha1 Hashing Engine

なお、チュートリアルを利用できる環境かを簡単に確認するスクリプトが用意されていますので、下記の様に実行してみてください。

$ curl --silent http://s3.killersoft.com/AWSforPHP/compatibility.php | php
チュートリアルの設定
チュートリアルファイルの配置

まずは、チュートリアルのファイルを取得し、展開します。

$ wget "http://s3.killersoft.com/AWSforPHP/awsfiles.zip"
$ unzip awsfiles.zip
アカウントの設定

次に、チュートリアルで使用するアカウントの設定を行います。
AWSのチュートリアルでは、 /etc 以下、もしくは実行ユーザーのホームディレクトリ以下のどちらかに設定ファイルを配置する事が可能ですが、今回はホームディレクトリに配置する事にします。
設定ファイルの書式は、Windowsの初期化ファイルに良く似た ‘キー = 値’ の形式です。
今回設定が必要な項目は以下の2つになります。

  • private_key_file => 秘密鍵
  • cert_file => クライアント証明書
$ cd ~
$ mkdir .aws
$ vim ~/.aws/aws.conf
; X.509 Certificate Path
cert_file = "/[証明書フォルダ(フルパス)]/XXXNNNNN-CERT.pem"
; RSA private key
private_key_file = "/[証明書フォルダ(フルパス)]/XXXNNNNN-PK.pem"

*証明書のファイル名は各自の環境用に書き換えてください。

証明書を配置

最後に、先ほどダウンロードした機密鍵とクライアント証明書を上記 aws.conf ファイルで指定した場所にコピーします。

これでようやく準備完了です。

APIを使ってみる

チュートリアルには、SOAPインターフェースを使用した以下のサンプルが含まれていますので、これをニフティクラウド用に修正してみましょう。

利用可能なゾーンの情報の取得

最初に ‘avail-zones-soap.php’ を使用して利用可能なゾーンの情報の取得を取得してみましょう。
以下が、チュートリアルに含まれている ‘avail-zones-soap.php’ のソースコードです。

<?php
// use the AWS-aware extension of PHP 5's SoapClient
require_once 'AWSforPHP/AWSSoapClient.php';
// use the EC2 WSDL
$wsdl = 'http://s3.amazonaws.com/ec2-downloads'
      . '/2008-05-05.ec2.wsdl';
$ec2 = new AWSSoapClient($wsdl);

// call a method
$result = $ec2->DescribeAvailabilityZones();
foreach ($result->availabilityZoneInfo->item as $z) {
    echo "{$z->zoneName}: {$z->zoneState}n";
}

当然の事ながら、このままでは正常に動作しませんので修正していきます。
まずは、WSDL ファイルのURLをニフティクラウド用にURLに変更します。

### 修正前
// use the EC2 WSDL
$wsdl = 'http://s3.amazonaws.com/ec2-downloads'
      . '/2008-05-05.ec2.wsdl';

### 修正後
// use the Nifty Cloud WSDL
$wsdl = 'http://cloud.nifty.com/api/wsdl/NiftyCloud.wsdl';

次に取得結果表示部分を修正します。
ニフティクラウドの利用可能なゾーンは現状は一つしか存在しないため、利用可能なゾーンアイテムに配列ではなくオブジェクトが返されるためチュートリアルのままではエラーになってしまいます。
そこで下記の様に修正してみました。

### 修正前
// call a method
$result = $ec2->DescribeAvailabilityZones();
foreach ($result->availabilityZoneInfo->item as $z) {
    echo "{$z->zoneName}: {$z->zoneState}n";
}

### 修正後
if ( !is_array($result->availabilityZoneInfo->item) ) {
    echo "{$result->availabilityZoneInfo->item->zoneName}: ";
    echo "{$result->availabilityZoneInfo->item->zoneState}n";
} else {
    foreach ($result->availabilityZoneInfo->item as $z) {
        echo "{$z->zoneName}: {$z->zoneState}n";
    }
}

これで修正は完了です。早速実行してみましょう。
修正に問題が無ければ、下記の様に ap-japan-1a というゾーン名が表示されるはずです。

$ php awsfiles/avail-zones-soap.php
ap-japan-1a: available
取得可能なすべてのサーバー情報の取得

次に、’ec2-launch-soap.php’ を改造してサーバー情報を取得してみましょう。
先ほどと同じ様にWSDLファイルのURLを変更した上で 15行目の検索するOSイメージ名の指定を下記の様に修正してみてください。

$ami = 'CentOS 5.3 64bit Plain';

実行すると下記の様に、取得したサーバーのグローバルIPアドレスが表示されます。

$ php ec2-launch-soap.php
111.171.XXX.XXX
111.171.XXX.XXX

「CentOS 5.3 64bit Plain」を使用したインスタンスが無い場合には、適宜イメージ名を変更して確認してみてください。

AWSSoapClientの解説

チュートリアルで提供されているSOAP通信用のクラス AWSSoapClient は SoapClient を継承して実装されています。
SoapClientは、WSDLモードと非WSDLモードの2つのモードがありますが、今回はWSDLモードで使用しています。

WSDLモードの場合は、下記の様にWSDLファイルのURLを第一引数に渡しインスタンスを生成します。

// use the Nifty Cloud WSDL
$wsdl = 'http://cloud.nifty.com/api/wsdl/NiftyCloud.wsdl';
$ec2 = new AWSSoapClient($wsdl);

SOAPリクエストの送信は、例えば "DescribeInstances" というリクエストを送信したい場合は下記の様にリクエスト名をメソッド名に指定して呼び出す事でリクエストを送信する事が出来ます。

$result = $ec2->DescribeInstances();

リクエストにパラメータがある場合は、以下の様に配列にパラメータを詰めて渡します。

// RunInstancesリクエスト(インスタンス生成) を行う
$param = array(
    'imageId' => 1,
    'keyName' => 'default',
    'instanceType' => 'mini',
    'instanceId' => 'testinstance',
    'password' => 'dummypasswd',
   
    'minCount' => 1,
    'maxCount' => 1,
    'groupSet' => null,
);
$result = $ec2->RunInstances($param);
まとめ

ニフティクラウドAPIで使用しているSOAPでの認証は、実際はとても面倒なのですが、AWSのチュートリアルを使う事で比較的簡単に使用できる事がお分かり頂けたかと思います。

ニフティクラウドの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などを担当しています