このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開

Azure でスタートアップ タスクを実行する

更新日: 2014年5月

スタートアップ タスクを使用して、ロールの開始前に操作を実行できます。実行する操作には、コンポーネントのインストール、COM コンポーネントの登録、レジストリ キーの設定、長い実行プロセスの開始が含まれています。

noteメモ
スタートアップ タスクは VM ロールに適用できません。

スタートアップ タスクは、ロールが開始される前に実行されるアクションです。スタートアップ タスクは ServiceDefinition.csdef ファイルで Task 要素内の Startup 要素によって定義されます。多くの場合、スタートアップ タスクはバッチ ファイルですが、コンソール アプリケーションであったり、PowerShell スクリプトを開始するバッチ ファイルのこともあります。

環境変数によってスタートアップ タスクに情報を渡すことができ、ローカル ストレージはスタートアップ タスクから情報を渡すために使用できます。たとえば、インストールするプログラムのパスを環境変数で指定することができ、ファイルをローカル ストレージに書き込んで、後でロールから読み取ることができます。

スタートアップ タスクは、TEMP 環境変数で指定されたディレクトリに情報とエラーを記録できます。スタートアップ タスクでは、クラウドで実行されている場合、TEMP 環境変数は C:\Resources\temp\<guid>.<rolename>\RoleTemp ディレクトリになります。

スタートアップ タスクは、システムの再起動までに複数回実行されることもあります。たとえば、スタートアップ タスクはロールが再利用されるたびに実行されますが、ロールの再利用には必ずしも再起動を伴いません。スタートアップ タスクは、問題なく何度も実行できるように記述する必要があります。

スタートアップ タスクは、errorlevel (つまり終了コード) がゼロで終了して、スタートアップ プロセスを完了する必要があります。errorlevel がゼロ以外の値でスタートアップ タスクが終了すると、ロールは開始されません。

Windows Azure のロール スタートアップ手順を以下に示します。

  1. インスタンスが開始中とマークされます。トラフィックは受信しません。

  2. すべてのスタートアップ タスクがその taskType 属性に従って実行されます。

    • 単純タスクは、1 つずつ同期的に実行されます。

    • バックグラウンドおよびフォアグラウンド タスクは、スタートアップ タスクと並列して非同期的に開始されます。

      Warning警告
      スタートアップ処理のスタートアップ タスク段階では IIS が完全に構成されていない可能性があります。そのため、ロール固有のデータが使用できない場合があります。ロール固有のデータが必要なスタートアップ タスクは Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart を使用してください。

  3. ロール ホスト プロセスが開始され、サイトが IIS に作成されます。

  4. Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart メソッドが呼び出されます。

  5. インスタンスが準備完了とマークされ、トラフィックはインスタンスにルーティングされます。

  6. Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run メソッドが呼び出されます。

スタートアップ タスクは ServiceDefinition.csdef ファイルの Task 要素によって定義されます。commandLine 属性はスタートアップ バッチ ファイルまたはコンソール コマンドの名前とパラメーターを指定します。executionContext 属性はスタートアップ タスクの特権レベルを指定し、taskType 属性はタスクの実行方法を指定します。

この例では、スタートアップ タスク用に環境変数 MyVersionNumber が作成され、"1.0.0.0" という値に設定されます。

ServiceDefinition.csdef:

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" >
        <Environment>
          <Variable name="MyVersionNumber" value="1.0.0.0" />
        </Environment>
      </Task>
    </Startup>

次の例では、Startup.cmd バッチ ファイルが、TEMP 環境変数で指定されたディレクトリの StartupLog.txt ファイルに "The current version is 1.0.0.0" という行を書き込みます。EXIT /B 0 という行によって、スタートアップ タスクが errorlevel ゼロで終了することが保証されます。

ECHO The current version is %MyVersionNumber% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT /B 0

noteメモ
Visual Studio では、スタートアップ バッチ ファイルが Windows Azure でプロジェクトに正しくデプロイされるように (Web ロールの場合 approot\bin、ワーカー ロールの場合 approot)、スタートアップ バッチ ファイルの [出力ディレクトリにコピー] プロパティを [常にコピーする] に設定する必要があります。

次に、ServiceDefinition.csdef ファイルの Task 要素の属性について説明します。

commandLine - スタートアップ タスクのコマンド ラインを指定します。

  • スタートアップ タスクを開始するコマンド。コマンド ライン パラメーターも指定できます。

  • 多くの場合、これはファイル名が .cmd または .bat のバッチ ファイルです。

  • コンソール アプリケーションまたは PowerShell スクリプトを開始するバッチ ファイルも指定できます。スタートアップ タスクとして PowerShell スクリプトを使用する方法の詳細については、「スタートアップ タスクとして PowerShell スクリプトを使用する」を参照してください。

executionContext - スタートアップ タスクの特権レベルを指定します。特権レベルは制限することも昇格させることもできます。

  • limited - スタートアップ タスクはロールと同じ特権で実行されます。executionContext 要素の Runtime 属性が limited である場合、ユーザー特権が使用されます。

  • elevated - スタートアップ タスクは管理者特権で実行されます。これにより、スタートアップ タスクは、ロールの特権レベルを高めることなく、プログラムをインストールし、IIS の構成を変更し、レジストリを変更し、その他の管理者レベルのタスクを実行できます。

noteメモ
スタートアップ タスクの特権レベルはロールの特権レベルより上でもかまいません。スタートアップ タスクは、プログラムをインストールしたり IIS 設定を変更するために elevated 特権を使用することがありますが、ロールはセキュリティ上の理由から limited 特権を使用することがあります。

taskType - スタートアップ タスクを実行する方法を指定します。

  • simple タスクは、ServiceDefinition.csdef ファイルに指定されている順序で、1 つずつ同期的に実行されます。ある simple スタートアップ タスクが errorlevel ゼロで終了すると、次の simple スタートアップ タスクが実行されます。実行する simple スタートアップ タスクがなくなると、ロール自体が開始されます。

    noteメモ
    simple タスクが errorlevel ゼロ以外で終了すると、インスタンスはブロックされます。それ以後の simple スタートアップ タスクは開始されず、ロール自体も開始されません。

    バッチ ファイルが errorlevel ゼロで終了することを保証するには、バッチ ファイルの処理の最後に EXIT /B 0 コマンドを実行します。

  • background タスクは、ロールのスタートアップと並行して、非同期的に実行されます。

  • foreground タスクは、ロールのスタートアップと並行して、非同期的に実行されます。foreground タスクと background タスクの主な相違点は、foreground タスクが実行されている間は foreground タスクがロールの実行を続行するという点です。つまり、foreground タスクが終了しない場合、ロールはシャットダウンせず、再利用もされません。background タスクではこの制限がないため、background タスクが完了しない場合でもロールは再利用できます。

環境変数はスタートアップ タスクに情報を渡す方法です。たとえば、インストールするプログラムを含む BLOB のパスや、ロールで使用するポート番号、スタートアップ タスクの機能を制御する設定を渡すことができます。

スタートアップ タスク用の環境変数には 2 種類あります。静的環境変数と、RoleEnvironment クラスのメンバーによる環境変数です。どちらも ServiceDefinition.csdef ファイルの Environment セクションで定義され、どちらも Variable 要素と name 属性を使用します。

静的環境変数は、value 要素の Variable 属性を使用します。上記の例では、"1.0.0.0" という静的な値を持つ環境変数 MyVersionNumber を作成しています。別の例としては、"staging" または "production" という値に手動で設定できる StagingOrProduction 環境変数を作成して、StagingOrProduction 環境変数の値に応じて異なるスタートアップ操作を実行することができます。

RoleEnvironment クラスのメンバーによる環境変数は、value 要素の Variable 属性を使用しません。代わりに、RoleInstanceValue 子要素に適切な xPath 属性値を指定して、RoleEnvironment クラスの特定メンバーによる環境変数は作成されます。さまざまな RoleEnvironment 値にアクセスする xPath 属性の値は、「Azure の xPath 値」で参照できます。

たとえば、インスタンスがコンピューティング エミュレーターで実行されていると "True" で、クラウド内で実行されていると "False" である環境変数を作成するには、次の Variable 要素と RoleInstanceValue 要素を使用します。

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>
          
          <!-- Create the environment variable that informs the startup task whether it is running 
               in the Compute Emulator or in the cloud. "%ComputeEmulatorRunning%"=="true" when 
               running in the Compute Emulator, "%ComputeEmulatorRunning%"=="false" when running 
               in the cloud. -->

          <Variable name="ComputeEmulatorRunning">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>

        </Environment>
      </Task>
    </Startup>

関連項目

表示:
© 2015 Microsoft