Windows Azure Media Servicesがアナウンスされました

National Association of Broadcasters (NAB) 2012 にてWindows Azure Media Servicesがアナウンスされました。

そもそもWindows Azure Media Servicesってなんでしょう?

発表されたばかりのこのサービスを利用すると、スマートテレビやセットトップボックス、MacOS、iOS、AndroidなどMS以外のプラットフォーム、それからもちろんXBoxやWindows Phone、Windows PCを含むほぼすべてのデバイスへのメディア配信を簡素化できるようです。

もともとこれらの機能はPlayReadyでおなじみのMicrosoft Media Platformで培われた機能ですね。つまり簡単に言うとMicrosoft Media PlatformのサーバーサイドがWindows Azureのサービスとして追加されるということです。

素晴らしいですね~!

さてサービス化されて何ができるんでしょう?まだ細かい機能が公開されてないので公式サイトを適当に見てみます。

End to Endのワークフロー

メディアワークフローが構築できます。ニーズに合わせて構成を組み合わせたり構成済みの設定を利用したり。アップロードやエンコーディング、フォーマット変換、コンテンツ保護(DRM)、配信が行えます。

ハイブリッドワークフロー

複数のフォーマットに変換して3rd Party製のCDNに配信したり外部アプリとREST API経由で連携したりできるみたいです。

Windows、Xbox、iOS、Androidのサポート

各デバイスに必要なメディアの作成や管理、複数デバイス間での配信機能などを提供。

Media Servicesのベネフィット

Windows Azure Media ServicesはMicrosoft Media Platformのクラウドサービス版です。既存のソリューションやカスタムワークフローなどニーズに合わせて簡単にサービスを管理できます。

取り込み

標準的なHTTPや、3rd Party製のエージェントを使用したセキュアで高速なUDP通信を使用してWindows Azure Media Servicesのストレージにメディアをアップロードできます。

エンコード

標準的なコデックとフォーマット、Smooth StreamingやHTTP Live Streaming、MPEG-DASHやFlashなどビルトインで提供されるWindows Azure Media Encoderまたは3rd Party製のエンコーダを利用できます。

フォーマット変換

ストリームの入力と出力を制御してライブラリ全体や個々のストリームを変換できます。

コンテンツ保護

Liveやオンデマンドの音声やビデオを標準的なMPEG Common EncryptionやMicrosoft Play Readyを使って暗号化することができます。業界でも最も受け入れられているDRMをコンテンツに追加できます。またウォーターマークや電子透かしを追加することもできます。

オンデマンドストリーミング

Windows Azure CDNや3rd Party製のCDNを経由してコンテンツをシームレスに提供することができます。

ライブストリーミング

ライブチャンネルのストリーミングやMedia Servicesを使ったエンコード、外部フィードからの配信などを簡単に作成し、配信できます。サーバー側DVRやリプレイ機能なども利用できます。

価格など

今時点ではプレビュー版なのでコストはかかりません。(但しストレージやネットワーク転送料、CDNなどの既存のWindows Azure機能に関するコストは発生します)

サインアップするにはメールしましょう!(※想定してるシナリオも書いてねとのこと)

開発するには

この辺参照 → Windows Azure Media Services Preview for Developers

おまけ

この辺の詳細はWindows Developer DaysのSC-008 Windows Azure Platformでの動画配信アプリケーション開発で聞けるみたいですよ!

Team Foundation Service Previewに接続してるソリューションが開かない

現在Preview公開中のTeam Foundation Serviceですが、このTFS Previewに接続してるVisual Studioのソリューションを開こうとするとソース管理のステータスを更新しています的なメッセージ(Updating source control status..)の状態で止まってうんともすんとも言わなくなるケースがあるみたいです。

どうもNuGetのバグっぽいようで、最新のNuGet 1.7にアップデートすることで解消するらしいとのこと。

実際アップデートしたらすんなりと開くように直りました。。。

もし嵌ってる人が居ればお試しあれ。

Azure Blob Storageのコンテナのパーミッションを変更する

小ネタです。Azure Storage Explorerだと出来なさそうだったのでPowerShellでサクッとAzure Blob Storageのコンテナのパーミッションを変更します。

  • Windows Azure PowerShell Cmdlets を利用するので、あらかじめインストールしておいてください。
  • 理屈的には大したことしてませんのでAzure SDKを使ったマネージコードでもできます。

Windows Azure PowerShell Cmdletsを起動して、Get-Containerコマンドでコンテナを取得します。

$container = Get-Container -StorageAccountName ***YourAzureStorageAccount*** -StorageAccountKey ***YourStorageKey***

 

取得できたらInstance(コンテナ)のGetPermission()メソッドを呼んで現在の権限を取得します。

$permission = $container[3].Instance.GetPermissions()

 

PublicAccessプロパティが現在の値です。(OffがPrivateコンテナ、ContanierがPublic Contanier、BlobがPublic Blobになります)

今現在はOffなのでPrivate(非公開)です。

image

image

このPublicAccessプロパティに”Container”等をセットし、Instanceプロパティ(コンテナ)のSetPermissions()メソッドを呼び出して設定を反映させます。

$permission.PublicAccess = "Container"
$container[3].Instance.SetPermissions($permission)

 

image

無事コンテナのアクセスレベルが変わりました。

image

Microsoft Endpoint Protection for Windows Azure CTP

Windows Azureのセキュリティが心配で心配で夜も眠れない人に朗報。 クライアントPC等で企業向けに提供されているMicrosoft Endpoint Protection(以下MEP)がWindows Azureでも利用できるようになりました。(※2012年3月19日現在ではCTP)

続きを読む

MS12-020 リモート デスクトップの脆弱性により、リモートでコードが実行される (2671387)

「緊急」のセキュリティ更新プログラムが公開されてました。

みなさんご推察の通り、RDPを有効にしたWindows Azureのインスタンスも例外ではないと思います。

というわけで、このセキュリティ更新プログラムが適用されたGuestOS(1.17/2.9)がリリースされています。

※手動での適用はイメージが伝播するまでしばらく待ちましょう。(自動更新の場合は適用が開始される場合があるかと)

※ホスト側のリブートもありそうですね。

Windows Azure サービス中断の話

2月29日に発生したWindows Azureサービス中断ですが、Microsoftから公式として以下のRCA(根本原因分析)が出ていました。

詳細はリンク元を見て頂くとして、やはり発端はうるう日(2月29日)に証明書を発行できなかったのが原因のようですね。有効期限1年の証明書発行に問題があると。(うるう日なので)

これだけならせいぜい新規のインスタンス起動が出来ない程度じゃ?と思ったんですがFabricController側への障害通知が繰り返し行き、本来ソフトウェアの問題のはずがハードウェアの問題と捉えられてどんどん影響範囲が広がって行ったみたいですね。

時系列でも解説されていますが、なるほどという感じです。共用型で自動化されたPaaSならではな印象もうけますが、、、

バグそのものは早期に修正されたみたいですが、更新の過程で2次停止も起こったあたりも興味深いです。それだけPaaSのインフラを管理するのは複雑で大変なのかというのがわかりますね。

ただ今後の対策なども明確になっているようですので、再発の防止とより良いサービスの提供を目指してもらえるといいかな~。

サポートについてはパンクっぽい様子だったようで、利用者から見ても改善の余地はあるかと思ってます。(スパイクに対応させるのは難しいと思いますけどね…さばき方の問題かな)

技術者目線だとなるほど、ですが利用者目線だともう少し違う説明をしないといけないんだろうなぁ。もうひと踏ん張りですね。

以下余談。

問題の発生当初は実はグロサミでWelcome Receptionまっただ中だったわけです。でそのパーティーのさなか某はうはう氏がノートPC広げてAzureの障害が~と日本の仕事の対応してたんですね。で症状を聞くにその場にいた抱き枕氏と「これって閏年(うるう日)だからじゃないのー?日本はもう29日だよね。こっち(PST)はまだ28日だし大事になってないし。つまり閏年なバグじゃね?」「まさかー。ねぇ」とか冗談で言ってたわけですがドンぴしゃとは…

で、その後自分が関わってるサービスもぐるぐる祭りが続いたりそれなりに大変だったわけで(おそらく2次停止のほうに巻き込まれた感じ)。まぁ大変といってもインフラの問題なので出来ることはReImageやら再デプロイ程度でぐるぐる祭りを眺めてる程度なんですが。

さて日本人的に気になるのは世間体ですかね。SLA99.95%に何を求めてるかわかりませんがやたら要求だけは厳しい日本の企業にはどう映るかな、という心配はあります。1秒でも止まったらアウトなミッションクリティカルなシステムだとそもそも99.95%で保証なしなんて論外でしょうし、そうじゃないなら、自社運用でも何でも好きなのコストかけてがんばって運用すればいいじゃないですかとか思いますが。。このあたり思考停止してベンダーになすりつけてるところ多い気がするので心配ですね。そんなことなければいいんですが。

サービスをうまく使うには利用者側も勉強しましょう。これは大変ですけどその見返りも当然あるわけで。そこをないがしろにしてたらうまく行かないと思いますよと昨今のSI業界にも通じるような思いがあったりなかったり。(とはいえどっちの言い分もある程度わかるのでなんともですけどね。)

どんどん本筋とそれてしまった感がありますが、今後の展開次第では本筋と違う話ばっかりになる可能性もあるのでそんなのは嫌だなというのだけわかって頂けると嬉しいです。

たぶん後半は言葉足らずで的外れな部分もあるでしょうけど、まいっか。

2012年3月13日追記

日本語公式サイトで翻訳された内容が公開されたので追記。公式発表は大事ですよね。ちゃんと根本原因分析ができて公開できるのは凄いことだと思いますよ…

Windows Azureの価格改定

というわけで唐突ですが価格改定があったようです。

Announcing Reduced Pricing on Windows Azure Storage and Compute

  • Windows Azure Storage値下げ
    Pay-As-You-Goの場合、12%オフ(0.14ドル⇒0.125ドル) … GBあたり約11円/月に
  • Windows Azure ComputingのXSインスタンス値下げ
    従来の50%に(0.04ドル⇒0.02ドル) … 1XSインスタンスあたり約1,312円/月に

image

XSサイズはSサイズと比較すると1/6になりました。Sインスタンス1台分で6台分のXSが動かせます。多少スペック低くても台数欲しい時とか上手く活用すればかなりコスト削減になると思います。

SQL Azureの値引きも先月発表されましたし、現実的な使いやすいプランになるのはいいことですね。

参考:

Microsoft 2012 MVP Global Summitに参加してきました

というわけで2月28日~3月2日に米国で開催されたMicrosoft 2012 MVP Global Summitに参加してきました。

一応思い出なんぞをつらつらと書いておこうと思います。(内容はNDAなので書けません)

今回は初参加だったのですが、時間に追われるのが嫌いなのと人見知りで団体行動が苦手なのでツアーはやめてちょっと期間を延長して行ってきました。

続きを読む

Worker RoleのCLRバージョン

Worker Role上の.NET Frameworkの動作CLRバージョンに関した質問がMSDNフォーラムにあがってたので見てみました。

とりあえず適当にですね、Worker Roleを作ります。

		public override void Run()
		{
			while (true)
			{
				Thread.Sleep(10000);
				string clrVersionRuntime = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();
				System.Diagnostics.Trace.WriteLine("CLRVersion:\t" + clrVersionRuntime);
			}
		}

 

寂しいので適当にCLRバージョンを吐き出すようにしました。

さてこいつを既定のママ(.NET Framework 4設定)で動作させてみます。

エミュレータ上

Windows Azure上

v4.0.30319 ですね。

では.NET Framework 3.5にしてみましょう。

エミュレータ上

Windows Azure上

※DebugViewでなぜかキャプチャできなかったのでProcess Explorerで。(最初からこうすれば(ry

v2.0.50727 でした。

想定通りと言えば想定通りです。

Azure上の非.NET アプリケーションからRoleEnvrionmentを触る

たんたかさんが PHPでRoleEnvironmentを使う というへんたい素晴らしいPostをしてたのでもっと手軽にできないかなーと。

もともとWindows Azure SDK 1.5以上でサービス定義ファイルにxPathを使用してRoleEnvironmentの値を環境変数にセットできるのですが、これがちょっと曲者。

というのもサービス定義ファイルのEnvironment要素に指定した環境変数はプロセス環境変数で、つまりRoleEntryPointがあるプロセスでしか見れません。

これはどういうことかというと、別プロセスとして動作するFull IISや、たとえばPHPなどからはせっかくの値が見れないってことですね。
これは不便極まりない!ということで冒頭のたんたかさんのBlogにあるようなHackが必要なわけですが、もっとお手軽にできるんじゃない?ということで試してみました。

まずサンプルということで、ASP.NET MVCで環境変数を出力するようなアプリを作っておきます。

<h1>Machine</h1>

<table>

@foreach (System.Collections.DictionaryEntry env in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine)) {

         <tr>

                 <td>@env.Key</td>

                 <td>@env.Value.ToString()</td>

         </tr>

}

</table>

</p>

<p>

<h1>Process</h1>

<table>

@foreach (System.Collections.DictionaryEntry env in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process)) {

         <tr>

                 <td>@env.Key</td>

                 <td>@env.Value.ToString()</td>

         </tr>

}

</table>

</p>

<p>

<h1>User</h1>

<table>

@foreach (System.Collections.DictionaryEntry env in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User)) {

         <tr>

                 <td>@env.Key</td>

                 <td>@env.Value.ToString()</td>

         </tr>

}

</table>

</p>

 

適当にViewにはっておきましょう。

さてやること1つ目。サービス定義ファイルに環境変数を追加します。

<ServiceDefinition name="WindowsAzureProject3" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="MvcWebRole1" vmsize="ExtraSmall">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Runtime>
      <Environment>
        <Variable name="EnvironmentTest1">
          <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='Endpoint1']/@address" />
        </Variable>
        <Variable name="EnvironmentTest2" value="EnvironmentTest2Value" />
      </Environment>
    </Runtime>
    <Startup>
      <Task commandLine="env.bat" executionContext="elevated" taskType="simple">
        <Environment>
        <Variable name="ENVIRONMENT3">
              <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='Endpoint1']/@address" />
           </Variable>
        </Environment>
      </Task>
    </Startup>
  </WebRole>
</ServiceDefinition>

 

上記のEnvrionmentTest1、EnvrionmentTest2、Envrionment3はそれぞれテスト用です。後で見たらわかりますが、これらの値はASP.NETなアプリ(別プロセス)からは参照できません。

で、ここでのポイントはStartup要素以下のEnvrionmentですね。ここでスタートアップタスクに環境変数を渡してるのですがこのままだとStartupTaskのプロセスが終わったら消えてしまいます。

ということで、StartupTask内でプロセス環境変数をシステム環境変数につけかえましょう。

@echo off

setx ENVIRONMENT4 %ENVIRONMENT3% /M

Setxコマンドに/M引数つけてシステム環境変数に設定してるだけです。簡単!

注意点はシステム環境変数に設定するのでStartupTaskを管理者権限(Elevated)で動作させてるのと、システム環境変数を参照するには設定終わった後にプロセスが起動しないといけないのでtaskTypeをsimpleにして他のプロセスより先に実行されるようにしてるところでしょうか。

もし他にもStartupTaskがあるのであれば、優先順位を付けたりするといいかもです。

さて実際にデプロイして確かめてみましょう。

他の環境変数は取れてませんが、StartupTaskで付け替えたシステム環境変数はバッチリ取れてますね。

これで非.NETアプリ等でもシステム環境変数さえ触れればRoleEnvrionmentの値を触ることができますね!