ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

ニフティクラウド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 に上げておきましたので興味のある方はみてみてください。