Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Azure 仮想マシン(VM)の再起動ログを表示

元ネタは、以下のブログからです。VMの再起動ログを表示できるとのことです(いつからあったんだっけ?ちょっと前に聞いた記憶はうっすらあるけど)。

クラウドサービスのダッシュボード(仮想マシンではないところがミソ)に、「再起動ログを表示」というのがあります。

f:id:StateMachine:20150406162346p:plain

これをクリックすると、検索ダイアログが開きますが、手持ちの仮想マシンで試したところログは見つかりませんでした。(同期元、同期先ってのは多分誤訳で、英語版でみるとFROM、TOとなっています)

f:id:StateMachine:20150406162512p:plain

Azure Poshでも Get-AzureDeploymentEvent コマンドレットで参照できるみたいですが、何も出ない仮想マシンしかありませんでしたので、情報を得られずじまい。以下、60日前~本日の間のイベントをゲッツする例です。

PS C:\> Get-AzureDeploymentEvent -ServiceName hogehoge -StartTime ((get-date).AddDays(-60)) -EndTime (get-date)
詳細: 16:28:32 - Begin Operation: Get-AzureDeploymentEvent
詳細: 16:28:34 - Completed Operation: Get-AzureDeploymentEvent

引用しますと、以下のように表示されるそうです。

OperationDescription : Get-AzureDeploymentEvent
OperationId          : 1153476a-9696-2e4a-8819-19ec662edbdc
OperationStatus      : Succeeded

DeploymentName       :
DeploymentSlot       : Production
InstanceName         : KenazDemo-D4
RebootReason         : Virtual machine rebooted due to planned maintenance event.
RebootStartTime      : 9/13/2014 10:22:03 PM
RoleName             : KenazDemo-D4
ServiceName          : kenaztestdemoservice
OperationDescription : Get-AzureDeploymentEvent
OperationId          : 1153476a-9696-2e4a-8819-19ec662edbdc
OperationStatus      : Succeeded

サービス管理APIでのVM一覧の取得

サービス管理APIでAzure VM一覧の取得APIを探していたのですが、見当たらなくてググっていたらStackOverflowに同じ質問が出てました。

stackoverflow.com

以下のような手順を踏まないといけないぽいです。

  1. HostedService一覧を取る
  2. HostedService の Production Slotをみて PersistentVMRoleのを探す

Get-AzureVMの様子をFiddlerでのぞいてみたら、そのとおりででございました。Get-AzureVM のレスポンス遅いよなぁと漠然と思ってましたが、なんどもAPI呼び出しすれば遅くもなるかと思いました。

f:id:StateMachine:20150402191355p:plain

P.S. 4K で画面キャプチャとると無駄にでかくなる気がします。

Windows Azure Active Directory で認証して管理API 呼ぶとか

Windows Azure Active Directoryで認証して管理API(Azure Service Management API)を呼んだりするための備忘録。

ライブラリは以下が必要です。

NuGet Gallery | Active Directory Authentication Library 2.14.201151115

AADには、アプリの登録とユーザーの追加 (xxxx@yyyonmicrosoft.com 的) を行っておきます。例によってCredentialをプログラム上から行う場合、組織アカウントの必要あります。

参考:

statemachine.hatenablog.com

以下、LINQPadでのコード例ですので、VSで実行するときは、適宜修正を。ざっくり説明すると、ADで認証してTokenをゲッツして、そのあとManagement APIを呼び出してサブスクリプション一覧を取得しています。

void Main() 
{
    var tenantId = "テナントID";
    var clientId = "クラアントID";
    var organizationAccount = "組織アカウント";
    var password = "パスワード";
    
    string token = GetAuthorizationHeader(tenantId, clientId, organizationAccount, password);

    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    client.DefaultRequestHeaders.Add("x-ms-version", "2013-08-01");
    
    var uri = new UriBuilder("https://management.core.windows.net/subscriptions");
    uri.Uri.Dump();
    var response = client.GetAsync(uri.Uri).Result;
    response.Content.ReadAsStringAsync().Result.Dump();
    
}
    
private  string GetAuthorizationHeader(string tenantId,
                                       string clientId,
                                       string organizationAccount, 
                                       string password)
{
    var context = new AuthenticationContext(
                  "https://login.windows.net/" + tenantId + "/");
    
    var user = new UserCredential(organizationAccount, password);
    
    var result = context.AcquireTokenAsync(
                 "https://management.core.windows.net/",
                 clientId, user).Result;
    
    if (result == null)
    {
        throw new InvalidOperationException("Failed to obtain the JWT token");
    }

  return result.AccessToken;
}