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の値を触ることができますね!

Windows Azure Platform 2周年!

2月1日はWindows Azure Platformの日!

ということで、2010年2月1日から商用スタートしたWindows Azureも早いもので今日で2周年!おめでとうございます!

まだ2年か~とも言えますが、Windows Azureも少しは使える子になりました。憶測もいろいろありますが今後のアップデートも期待ができそうですし、何よりもっと世の中面白いことができるんじゃないかな~と思います!

個人的には実案件でノウハウ貯めたり吐き出したりしつつ今後も付き合っていこうかと思います。まぁ面白そうなこと(人柱的なこと)は飛びついてやりたいですね。※長期間するスタミナがなくなってきた&飽き性ともいう

というわけで3年目もがんばりましょー

※厳密にはUS時間なんでもうちょっと遅い感じですが(・ε・)キニシナイ!!

あの日デプロイしたパッケージのReadyを僕たちはまだ知らない

Windows Azure でデプロイするとぐるぐる祭りになることは非常によくあることだと思います。

というわけで今日はぐるぐる祭りの嵌りどころなどを少し。

OnStartで起動時の処理に失敗したりしてFalseを返すと再試行されます。このときStartup Taskなども再度走りますので、リトライが考えられてないと変なことになってしまいます。
※StartupTaskで嵌った場合はそもそもOnStartまで来なかったりしますけど(Simpleの場合)
※1回しか走らない想定のアプリケーションのインストール処理とかが該当するかと

ちなみにローカルPCのCompute Emulatorでデバッグ実行などを行うとデバッガが終わって再試行されないので気付きにくいですね。但し、CSRunコマンドから実行した場合はちゃんとエミュレートしてくれます。

OnStartが繰り返し呼ばれてるのがわかるかと思います。

そんなわけでOnStartのエラー処理はちゃんと考えて適切にしましょう。ただ変なまま起動するのがいいのか、このケースみたいにずっとビジーがいいのかは要件次第ですね。(というあたりが難しいところ)

あと、Windows Azureの管理ポータルで表示されるインスタンスのメニューですが、「再起動」はOSの再起動じゃなくて配置をもう一度最初からする的な意味の再起動です。

つまりStartup Taskも走ればOnStartも走るということで。OS上の再起動とは異なるので注意。
※エラートラップちゃんとしてなくて安易にやられるとOnStartでFalseかえってぐるぐる祭り開催!になります。
対処方法としては「初期状態にリセット」でReImageするとかですね。。

という感じで今日は自分が嵌った点をお伝えしました。とほほ。

 

※ぐるぐる祭りとは

ビジーやAbortのままReady状態にならない時の管理ポータルの見た目(アイコン)の事

例:

こんな感じでぐるぐる繰り返します。。。切ない。

Azure のインスタンスの状態を弄ろう

今日も平和についったー。

たまたま目についたツイートがこちら

image

※もともとの発端は原発の話だったと思われます

このツイートだけ切り出すのもどうかと思ったのですが。。で、TLとしてはたとえば例外全キャッチせずに本当の想定外ならアプリしんじゃえーとかにするとかそういうこと考えないといけないよねという話に。

で一例としてたとえば安全側に倒すなら、サービスがちゃんと生きてる間にアプリをサービスから切り離すとか(例:ロードバランサのクラスタから切り離す、サービスのみオフラインにする等)すればいいんじゃないですかね、Azureなら簡単にロードバランサから切り離せますよという話になりました。というかそんなネタを振ってみました。

幸いAzureにはインスタンスの状態をBusyに設定してロードバランサから切り離してくれる機構があるので、今日はそのへんを見てみようと思います。

以上前ふり。

続きを読む

定例外のセキュリティアップデート MS11-100

12月30日に公開されたマイクロソフト セキュリティ アドバイザリ (2659883) 「ASP.NET の脆弱性により、サービス拒否が起こる」 の件ですが定例外としてMS11-100のセキュリティアップデートが公開されました。

2659883の脆弱性に加えて合計4件の脆弱性も解決されてるようです。

  • ハッシュテーブルの衝突がサービス拒否を引き起こす可能性のある脆弱性 CVE-2011-3414
  • .NET フォームの認証の安全ではないリダイレクトの脆弱性 CVE-2011-3415
  • ASP.NETフォームの認証バイパスの脆弱性 CVE-2011-3416
  • ASP.NET フォームの認証のチケットをキャッシュする脆弱性 CVE-2011-3417

対象は.NET Framework 1.1 / 2.0 / 3.5 / 3.5.1 / 4 なのでかなり広範囲ですね。注意しましょう。

参照 → セキュリティホールmemo

さて Windows Azureではどうすればいいのかというと、サービス設定ファイルでOSのバージョン指定を*指定つまり自動アップグレードを選択している場合はどこかのタイミングで(たぶんすでに実施されちゃってると思われますが)MS11-100が適用されたバージョンになります。

※リビジョン(?)が03になっています
※2012/01/02 1.16が1.8になってたので修正(指摘ありがとうございます)

手動の場合はすぐにアップデートしましょうね。

参考 → Windows Azureのセキュリティ情報 MS11-100 への対応 ( S/N RATIO [BY SATO NAOKI] )

image

image

VMロールの場合は、OSのイメージ管理は利用者の自己責任なので、パッチを適用した差分か元イメージを再アップロードするなどで対応してください。

ちなみに、セキュリティホールmemoのEffective DoS attacks against Web Application Plattforms ? にあるようにPerlを除く代表的なWebプログラミング言語、フレームワークで発生するそうです。

なので、Windows Azure上でPHPを使ってる場合は上記パッチに加えて、Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策 (徳丸浩の日記)を参考にまずはPHP.iniを修正したりするのがよいかと思います。

※mod_security使えないので。

2011年振り返り

2011年ももう終わりですね。今年もたくさんの人とたくさんの事が出来た!ということで自分用メモとしてまとめてみました。

意外と少ない感…

でもいろんな出会いから始まってここまで来れました。今年1年かかわることができた皆様に感謝感謝ありがとうございました!
引き続き宜しくお願い致します。

2012年はもっといろいろできるといいなー。あとアレとかソレとかコレとかを発表できるといいな~

Windows Azure Advent Calendar jp: 2011 完成~

Windows Azure Advent Calendar jp: 2011 が無事完成しましたー( ゚Д゚ノノ"☆パチパチパチパチ

当初は @k1hashが一人で25日分やるイベントだったんですけどねー(・∀・)ニヤニヤ
みんな優しいですねw

image

来年はきっと一人で25日分+みんなでやるのにも参加してくれると信じてる!

というわけでサマリです。

12/01 あまりにも良くあるAzure問答集 @k1hash
12/02 Windows Azure Tabale Storage へのローベルなアクセス @takekazuomi
12/03 Windows Azureを始める方へ @kekekekenta
12/04 「WindowsAzureへの正しいデプロイとVIPスワップ」 @kazumihirose
12/05 ユーザーを作成して、Windows Azure にリモートデスクトップ接続する @sleepy_taka
12/06 Windows Azure Table Storage の キャッシュ機能を検証する @A_Ym
12/07 広告代理店とくらうど(序章) @takabayashi_tsu
12/08 Azure History @ClaudiaInformal
12/09 VM Role と Windows Azure Connect で AD FS Proxy を公開してみる @Masayuki_Ozawa
12/10 【WP/Azure for ITPro】Windows Phone から Windows Azure AppFabric ACS を使用する @junichia
12/11 インストールマニアックス5決勝大会に参加しました @snicker_jp
12/12 MASHUP AWARD7で日本マイクロソフト賞を受賞しました @david9142
12/13 SQL Azure管理ポータルを楽しく利用するために知っておくべきこと @SQLAzureJP
12/14 Windows Azure の大幅更新 ~Node.js編~ @normalian
12/15 F# で書いた ASP.NET MVC3 アプリを Windows Azure にデプロイする @jsakamot
12/16 SQL Azure Federationの課金モデル @orz_yuki
12/17 Windows Azure は Auto Scale の夢を見るか? ひとりでもやってやるです編 @kamebuchi
12/18 Windows Azure で Windows Storage Server 2008 R2 を動かす @bakecat
12/19 アカウントの作り方と消し方 @harutama
12/20 2011年 Azure 新語・流行語大賞は? @kunyami
12/21 Azure ServiceBus の負荷分散 @statemachine
12/22 【+超裏話】mixi XmasのベルはWindows Azureの上で鳴り響く、大規模ソーシャルアプリの舞台裏 @shin135
12/23 Active Directory on AWSのドメインにWeb Roleを参加させてみよう @sao_a
12/24 Windows Azure で彼女が出来ました @shibayan
12/25 Webアプリのセッション管理 / Azure Plugin for Eclipseのセッション アフィニティ @satonaoki

みなさん楽しんでいただけたでしょうか!参加した人も参加しなかった人も感謝をこめてメリーデプローーイ!

Windows Azure は Auto Scale の夢を見るか? ひとりでもやってやるです編

※この投稿は Windows Azure Advent Calendar jp: 2011 の17日目です。 ただいま17日の27時過ぎですキリッ(ごめんなさい・・・)
しょっぱなからぶっ飛んだネタが展開されたAdvent Calendarですが、ネタ方向ではいいのが思いつかなかったので淡々と機能紹介でもすることにしますw

ということで Microsoft Enterprise Library 5.0 Integration Pack for Windows Azure – Autoscaling Application Block 、通称WASABiを簡単に紹介した前回に続き、実際に触ってみてAuto Scaleはどんなものか見てみようと思います。正式リリースしましたしね。
今のところ英語情報しかありませんし、全部把握できてるわけではないので細かいところで間違いがあるかもしれませんのであくまで参考まで。
ちゃんと元ドキュメント見て実装等は自己責任で宜しくお願いします。

という逃げ口上もしたうえで早速。

続きを読む