Azureをプログラムする:Windows Azure REST APIを使う (第一回目)

プログラマ日山です。
これから何回かに分けて、Windows Azure REST APIの使い方について説明します。


Windows Azure REST APIってなに?

Microsoftが提供する、Windows Azureを操作するためのAPIです。このAPIを使えば、例えば以下のようなことができます。

  • 作成したクラウドサービス名称一覧
  • 現在起動中の仮想マシンのステータス
  • 仮想マシンの起動/停止/作成/削除
  • 指定したWebサイトのパフォーマンス情報(CPU時間等)

管理ポータルで可能なことはほとんど、REST APIを通じて実行することができます。


Windows Azure REST APIを使うとなにが嬉しい?

管理ポータルで行う作業を自動化したいとき、などに使用することができます。
例えば、定期的に仮想マシン10台を起動/停止する必要がある場合、人力で決められた時間に仮想マシン10台に同じ操作をする、というのはちょっと面倒くさいし、ヒューマンエラーが発生する可能性がでてきます。そこで、定期的に仮想マシン起動/停止に相当するREST APIを呼び出すプログラムまたはスクリプトを作成しておくことで、先ほどの作業を自動化することができます。


どうやって使うの?

REST APIを使うためには、以下の5種類の方法が挙げられます。

  1. Windows Azure Management Librariesを使う (C#)
  2. Windows Azure PowerShellを使う (PowerShell)
  3. Windows Azure SDK for PHPを使う (PHP)
  4. Windows Azure SDK for Node.jsを使う (Javascript)
  5. REST APIを呼び出すライブラリを自作する (すべての言語)

Windows Azure Management Libraries

Microsoftから提供されているライブラリです。対応言語はC#です。
2014/01/15時点ではプレビュー版ですが、動作はかなり安定しているのですごくおすすめです。
Nuget Gallary経由でダウンロードすることができます。
(リリース前のパッケージも含めて検索を行わないと見つかりません)
これからこのライブラリを使ってREST APIを呼び出していきます。

Nuget Gallary
https://www.nuget.org/packages/Microsoft.WindowsAzure.Management.Libraries

GitHub
https://github.com/WindowsAzure/azure-sdk-for-net

Windows Azure PowerShell

Windows Azure用のPowerShellモジュールをインストールすることで、
PowerShellからREST APIを呼び出すことができます。
ちょっとした操作自動化であれば、このPowerShellでスクリプトを作成する、いうのもいいかもしれないです。
今回、使い方の説明は行いません。以下のサイトが、使い方をわかりやすく説明しています。

蒼の王座 – Windows Azure PowerShell を使ってみる
http://sqlazure.jp/b/windows-azure/1485/

ダウンロードページ
http://www.windowsazure.com/en-us/downloads/?fb=ja-jp

Windows Azure SDK for PHP / Node.js

PHP用ライブラリと、なんとNode.js用のライブラリも用意されています。
(Node.js用ライブラリはAzureモバイルサービス上でも使えるのでしょうか・・・気になります。)

CodePlex
http://phpazure.codeplex.com/
GitHub
https://github.com/WindowsAzure/azure-sdk-for-php
https://github.com/WindowsAzure/azure-sdk-for-node

自作ライブラリ

秘密鍵での認証でHTTPアクセスするプログラムを作成すれば、REST APIを呼び出すことができます。
応答結果はXML形式で返ってきます。
もし得意な言語のライブラリが提供されていない場合は、自作するのもいいかもしれないです。(わりと簡単です)

サンプルコード (C#, msdn)

http://msdn.microsoft.com/en-us/library/windowsazure/ee460781.aspx#sectionSection4


Windows Azure Management Librariesを使って呼び出してみる

Windows Azure Management Librariesを使った、REST API呼び出しの流れを簡単に説明します。
指定したサブスクリプションのクラウドサービス一覧を表示するプログラムを作ります。

下準備

サブスクリプションファイルをダウンロードします。

以下のページにアクセスし、
今回の操作対象となるサブスクリプションに紐づくMicrosoftアカウントでログインしてください。
https://manage.windowsazure.com/publishsettings/

ログイン後、勝手にサブスクリプションファイル(.publishsetting)のダウンロードが始まります。
アカウントが複数のサブスクリプションと紐付けられている場合、

ダウンロードするサブスクリプションを選択するよう促されます。
ドロップダウンリストで今回の操作対象となるサブスクリプションを選択し、
ログインボタンをクリックしてダウンロードしてください。

publishsetting

プロジェクトを作成する

Visual Studioにてプロジェクトを新規作成してください。
テンプレートは「コンソールアプリケーション」とします。名前は任意です。
(今回は「AzureLibrarySampleProgram」とします)

vs_project

Windows Azure Management Librariesをインストールする

パッケージマネージャコンソールを表示(※1)して、以下のコマンドを実行します。

PM> Install-Package Microsoft.WindowsAzure.Management.Libraries -Pre

いろいろとライブラリが追加されていることを確認します。
vs_nuget

(※1) 表示(V)→その他のウィンドウ(E)→パッケージマネージャコンソール(O)で表示できます。

コーディング

ProgramクラスのMainメソッドを以下の通りにコーディングします。
静的変数”subscriptionId”と”encodedManagementCertificate”の値は
サブスクリプションファイルから参照してください。

Program.cs

static void Main(string[] args)
{
    // サブスクリプションファイルからサブスクリプションIDと
    // Base64形式でエンコードされた管理証明書を参照して、指定しておきます
    const string subscriptionId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
    const string managementcertificate = "MIIKDAIBAzCCCcwGCSqGS...";

    // REST APIアクセスで使用する認証情報を用意します
    var managementCertificateBytes = Convert.FromBase64String(managementcertificate);
    var certificate = new X509Certificate2(managementCertificateBytes);
    var credential = new CertificateCloudCredentials(subscriptionId, certificate);
    var client = CloudContext.Clients.CreateComputeManagementClient(credential);

    // REST APIにアクセスし、クラウドサービス一覧を取得します
    var token = new CancellationToken();
    var services = client.HostedServices.ListAsync(token).Result;

    // クラウドサービス一覧を表示します
    foreach (var service in services)
    {
        Console.WriteLine(service.ServiceName);
    }
}

サブスクリプションファイルの中身

<?xml version="1.0" encoding="utf-8" ?>
<publishdata>
    <publishprofile schemaversion="2.0"
                    publishmethod="AzureServiceManagementAPI">
        <subscription servicemanagementurl="https://management.core.windows.net"
                      id="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
                      name="XXXXXXXX"
                      managementcertificate="MIIKDAIBAzCCCcwGCSqGS...." />
  </publishprofile>
</publishdata>

プログラムの説明

実行すると、REST APIを呼び出し、クラウドサービス一覧を取得して、画面に表示します。

vs_result

まずREST APIにアクセスするためにはサブスクリプションIDと管理証明書が必要になります。
先ほどダウンロードしたサブスクリプションファイルには、以下の情報がXML形式で記述されています。

  • サブスクリプションID
  • サブスクリプション名
  • Base64形式でエンコードされた管理証明書

Base64形式でエンコードされた管理証明書をデコードし、X509Certificate2インスタンスを作成します。
X509Certificate2インスタンスを用いて、CertificateCloudCredentialsインスタンスを作成、
これを用いることで、REST APIのクライアントクラスにあたるComputeManagementClientクラスを
作成することができるようになります。

クライアントクラスからHostedServices.ListAsyncメソッドを呼び出すことで、
クラウドサービス一覧を非同期(async)で取得することができます。(今回は簡単にするため非同期処理していません)


今回のまとめ

  • Windows Azure REST APIでは、管理ポータルで行えるほとんどの操作が可能になる。
  • REST APIを使うことで、Azureでの操作を自動化させることができるようになる。
  • ライブラリはたくさん出ている。C#使いならWindows Azure Management Librariesがおすすめ。
  • REST APIを使うために必要なものは、サブスクリプションIDと管理証明書(秘密鍵)

TechTarget

クラウドエンジニア  日山 雅之による記事「Microsoft Azure スマート解説」がTechTarget Japanにて好評連載中です (全7回)