今回は Windows Azure SDK 1.3 から利用可能になった、Startup Task についてメモ。
Startup Task はその名の通り、各ロールの起動前に処理されるタスクの事です。特徴としては
- ロールの起動前に処理できる
- 管理者特権で起動できる
- ロール起動前に処理されるので、VMの再イメージ展開やインスタンス増減時に自動的に処理できる(リモート接続で毎回手動でやらなくてもよい)
などが挙げられます。管理者権限でロール起動前にいろいろ処理できるということは、O再起動が必要な処理以外はだいたいのことができそうですね。
Startup Task の使い方は簡単で、サービス定義ファイル (.csdef)に必要な要素を追加します。(こちらも参照 → How to Define Startup Tasks for a Role )
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Startup> <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple"> </Task> </Startup> </WebRole> </ServiceDefinition>
Startup 要素は各ロール(WebRole 、 WorkerRole)要素にて定義します。
Task 要素は Startup 要素以下に複数定義することができます。(サンプル見る限り、実行順序は記載順に上からと思われます(未検証))
Task 要素は3つの属性を持っていますが、すべて必須ですので注意ください。(参照:Service Definition Schema )
属性 |
型 |
説明 |
commandLine | string | 必須。実行するCMDファイルへのパス。 指定するCMDファイルはANSIフォーマットで保存されてる必要があります。 バイトオーダーマーク(BOM)が付与されていると正しく処理されません。 |
executionContext | string | 必須。実行する際のコンテキストを以下の2種類から指定します。 limited … ロールをホストするプロセスと同じ権限で実行されます elevated … 管理者権限で実行されます |
taskType | string | 必須。コマンド(タスク)が実行される際の振る舞いを以下の3種類から指定します。 simple …既定。システムはこのタスクが完了するまで他のタスクを起動させるのを待ちます background …システムはタスクが完了するのを待ちません foreground |
taskType は少しややこしいですが、通常はシーケンシャルに処理させたい場合が大半だと思いますので素直にsimpleを選択すればよいかと思います。
commandLine で指定するCMDファイルのパスは、定義しているロールの approot\bin からの相対パスになります。
このCMDファイルはロールの開始前に実行されますので、何らかの方法でWindows Azure 上のVMから見えるようにしておく必要があります。
通常、VMにアップロードするパッケージの展開が先になされていますので、パッケージに含めてしまうのがよさそうですね。
Visual Studio 等で開発する場合はCMDファイルをプロジェクトに追加し、”出力ディレクトリにコピー”を True にすればCMDファイルが approot\bin フォルダに配置されますので commandLine にはファイル名だけ指定すれば良いということになります。
※憶測ですが、たぶん指定したVMイメージの配置→OS起動・もろもろ処理→パッケージ展開→サービス定義ファイルに基づいて処理→Startup Task処理→ロール起動、といった順序な気がします。
ちなみにCMDファイルですが、先頭行に @echo off を書かないとうまく動かないとかいう話がありました。。注意しましょう。(よくわからん。。)
おまけ
この Startup Task ですが、もちろん開発環境(名前変わって Compute Emulator )でも動作します。
CMDファイル内で、例えば notepad とか書いてメモ帳を起動するようにさせたりしておいて実行すると、かなり早いタイミングでメモ帳が起動します。
その後 Compute Emulator で配置が始まりますので、実際にロール展開前に処理されているというのがわかりますね。
※例にメモ帳あげましたがメモ帳起動した段階でバッチ的には処理終わってるので、誤解なきよう
ピンバック: PowerShell で Azure のホストをリモート管理(WinRM)-自動受信 | たんたか
ピンバック: PowerShell で Azure のホストをリモート管理(WinRM)-自動受信 | たんたか