2011年5月16日月曜日

Windows Azure Management REST API でホスティング一覧を取得するアクティビティ

Code RecipeMSDN でサンプルが紹介されていたのでアクティビティにしてみました。
Windows Azure 管理ポータルで目視できる内容ですが、定期的に監視などする事を考えるとスクリプトまたはプログラム化する必要が高くなります。また SDK でマネージド DLL 等も配布されていますが、端末にそれを入れるのも億劫ですw
そのような場合は、REST API が提供されているのでこれを利用した監視等々を行う事になるかと思います。実際に REST API を利用するには一つだけ事前準備が必要です。
  • 管理用証明書を作成、設定する

当然と言えば当然ですが、アクセス制限を行うために Windows Azure ではクライアント証明書を利用します。証明書自体は正規のものを購入する、makecert ユーティリティで作成するなど方法があります。今回は makecert ユーティリティで作成しました。その際 MSDNSE の雑記 さんのところを参考にさせてもらいました。ありがとうございます。
できあがった証明書は自分の環境にインストール(作成した cer ファイルをダブルクリック等で実行するとインポートができます)、Windows Azure 管理ポータルからもインポートします。
AzurePortal
インポートすると管理ポータルでこのように確認ができます。ここで表示されている値で、ThumbPrint と書かれている値が後々必要になりますのでメモしておきます。
これでアクティビティの実装を行います。

1: Imports System.Activities
2: Imports System.IO
3: Imports System.Net
4: Imports System.Security.Cryptography.X509Certificates
5: 
6: Public Class GetAzureHostingListActivity
7:     Inherits AsyncCodeActivity
8: 
9:     Public Property SubscriptionID As String
10:     Public Property CertThumbPrint As String
11:     Public Property ServiceName As String
12: 
13:     Public Property ResultDocument As OutArgument(Of String)
14: 
15:     Private Delegate Function AsyncGetWebDataDelegate(ByVal subscription As String, ByVal thumbprint As String) As String
16: 
17:     Protected Overrides Function BeginExecute(context As System.Activities.AsyncCodeActivityContext, callback As System.AsyncCallback, state As Object) As System.IAsyncResult
18:         Dim asyncExecute = New AsyncGetWebDataDelegate(AddressOf GetWebData)
19:         context.UserState = asyncExecute
20: 
21:         Return asyncExecute.BeginInvoke(Me.SubscriptionID, Me.CertThumbPrint, callback, state)
22:     End Function
23: 
24:     Protected Overrides Sub EndExecute(context As System.Activities.AsyncCodeActivityContext, result As System.IAsyncResult)
25:         Dim asyncExecute = TryCast(context.UserState, AsyncGetWebDataDelegate)
26:         Dim getResult = asyncExecute.EndInvoke(result)
27: 
28:         context.SetValue(Me.ResultDocument, getResult)
29:     End Sub
30: 
31:     Private Function GetWebData(ByVal subscription As String, ByVal thumbprint As String) As String
32:         Dim resultStrings As String = ""
33:         Try
34:             Dim certStore As X509Store = New X509Store(StoreName.My, StoreLocation.CurrentUser)
35:             certStore.Open(OpenFlags.ReadOnly)
36: 
37:             Dim certCollection As X509Certificate2Collection = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, False)
38:             certStore.Close()
39: 
40:             If certCollection.Count <= 0 Then
41:                 Throw New ApplicationException("証明書がありません")
42:             End If
43:             Dim certificate As X509Certificate2 = certCollection(0)
44: 
45:             Dim requestUri As New Uri("https://management.core.windows.net/" _
46:                                  + subscription _
47:                                  + "/services/" _
48:                                  + "hostedservices"
49:             Dim localWebRequest = TryCast(HttpWebRequest.Create(requestUri), HttpWebRequest)
50:             localWebRequest.ClientCertificates.Add(certificate)
51:             localWebRequest.Headers.Add("x-ms-version", "2011-02-25")
52: 
53:             Using webResponse = TryCast(localWebRequest.GetResponse(), HttpWebResponse)
54:                 Using responseStream = webResponse.GetResponseStream()
55:                     Using reader As New StreamReader(responseStream)
56:                         resultStrings = reader.ReadToEnd
57:                     End Using
58:                 End Using
59:             End Using
60:         Catch ex As Exception
61:             resultStrings = ex.Message
62:         End Try
63:         Return resultStrings
64:     End Function
65: 
66: End Class
一気に全て載せますがこのようなロジックになります。大まかな流れとしては次のようになります。
  1. ローカル証明書ストアから ThumbPrint プロパティで指定したものと一致する値になる証明書を取得
  2. HttpWebRequest クラスのインスタンスに証明書を追加し、REST API を呼び出す
  3. 結果を返却
これだけの処理ですので、HTTP/S で通信するような AP を作られた方でしたら大したことはないと思います。特に今回は取得した結果をそのまま返却していますのでなおのこと簡単ですが、実際に利用するのであれば XDocument とかその類、もしくは取得結果から値に分割させて返却させるのが良いと思います。
ApiResult
実行結果はこの通りです。私のサブスクリプションでは AzureWrokflow という名前でホスティングさせていまして、その名前が正しく拾えているのがわかります。
これと同様の方法にてホスティングの属性を取得する API ( https://management.core.windows.net/<subscription-id>/services/hostedservices/<service-name> ) も利用可能です。

0 件のコメント:

コメントを投稿