Python 用 Azure クラウド サービス プロジェクト

Visual Studio は、Python を使用して Azure Cloud Services の作成に使用できるテンプレートを提供しています。

クラウド サービスは、任意の数の worker ロールWeb ロールから構成され、それぞれが概念的に独立したタスクを実行しますが、規模拡張の必要に応じて仮想マシン間で個別にレプリケートできます。 Web ロールでは、フロントエンド Web アプリケーションのホスティングが提供されます。 Python が接続されている場合、WSGI をサポートする任意の Web フレームワークを使用して、このようなアプリケーションを作成できます (Web プロジェクト テンプレートでサポート)。 worker ロールは、ユーザーと直接対話しない長時間実行されるプロセスを意図しています。 通常、これらは pip install azure でインストールできるデータ ライブラリとアプリ サービス ライブラリを利用します。

このトピックでは、Visual Studio 2017 のプロジェクト テンプレートとその他のサポートについて詳しく説明します (以前のバージョンも同様ですが、いくつかの違いがあります)。 Python からの Azure の操作について詳しくは、Azure Python デベロッパー センターをご覧ください。

プロジェクトを作成する

  1. クラウド サービス テンプレートを使用するために必要な Azure .NET SDK for Visual Studio をインストールします。
  2. Visual Studio で、[ファイル] > [新規] > [プロジェクト...] を選択し、"Azure Python" を検索して [Azure クラウド サービス] を一覧から選びます。

    Python 用 Azure クラウド プロジェクト テンプレート

  3. 含める 1 つ以上のロールを選びます。 クラウド プロジェクトは、異なる言語で記述されたロールを結合できるため、アプリケーションの各部分を最も適した言語で簡単に記述できます。 このダイアログの完了後に新しいロールをプロジェクトに追加するには、ソリューション エクスプローラーで [ロール] を右クリックし、[追加] の下で項目の 1 つを選びます。

    Azure クラウド プロジェクト テンプレートでのロールの追加

  4. 個々のロール プロジェクトが作成されるときに、Django、Bottle、Flask フレームワークなどの追加の Python パッケージの 1 つを使用するロールを選んだ場合は、これらをインストールするように求めるプロンプトが表示されることがあります。

  5. プロジェクトに新しいロールを追加すると、構成手順がいくつか表示されます。 構成の変更は通常必要ありませんが、プロジェクトの将来のカスタマイズに役立つ場合があります。 同時に複数のロールを追加する場合は、最後のロールについての説明のみ開いたままになります。 ただし、他のロールの手順とトラブルシューティングのヒントは、ロールの ルートまたは bin フォルダーにあるそれぞれの readme.mht ファイルで参照できます。

  6. プロジェクトの bin フォルダーには、Python のインストール、プロジェクトの requirements.txt ファイル、必要な場合に IIS の設定など、リモート仮想マシンの構成に使用する 1 つまたは 2 つの PowerShell スクリプトも含まれています。 デプロイでの必要に応じてこれらのファイルを編集できますが、最も一般的なオプションは他の方法で管理できます (下の「ロールのデプロイを構成する」をご覧ください)。 これらのファイルが使用可能でない場合はレガシ構成スクリプトが代わりに使用されるため、これらのファイルの削除はお勧めしません。

    worker ロールのサポート ファイル

    これらの構成スクリプトを新しいプロジェクトに追加するには、プロジェクトを右クリックし、[追加] > [新しい項目...] を選び、[Web ロール サポート ファイル] または [worker ロール サポート ファイル] のいずれかを選びます。

ロールのデプロイを構成する

ロール プロジェクトの bin フォルダー内の PowerShell スクリプトは、そのロールのデプロイを制御し、編集して構成をカスタマイズできます。

  • ConfigureCloudService.ps1 は、通常は従属物をインストールして構成し、Python のバージョンを設定するために Web ロールと worker ロールに使用されます。
  • LaunchWorker.ps1 は worker ロールにのみ使用され、起動の動作の変更、コマンドライン引数の追加、環境変数の追加に使用されます。

どちらのファイルにも、カスタマイズの手順が含まれます。 メインのクラウド サービス プロジェクトの ServiceDefinition.csdef ファイルに別のタスクを追加し、PYTHON 変数をインストールされている python.exe (または同等の) パスに設定することで、独自のバージョンの Python をインストールすることもできます。 PYTHON が設定されている場合、Python は NuGet からインストールされません。

追加の構成は、次のように実行できます。

  1. プロジェクトのルート ディレクトリ内の requirements.txt ファイルを更新することで、pip を使用してパッケージをインストールします。 ConfigureCloudService.ps1 スクリプトによってデプロイ時にこのファイルがインストールされます。
  2. web.config ファイル (Web ロール) または ServiceDefinition.csdef ファイル (worker ロール) の Runtime セクションを変更することで、環境変数を設定します。
  3. ServiceDefinitions.csdef ファイルの Runtime/EntryPoint セクションでコマンド ラインを変更して、worker ロールに使用するスクリプトと引数を指定します。
  4. web.config ファイルを通じて、Web ロールのメイン ハンドラー スクリプトを設定します。

ロールのデプロイをテストする

ロールの書き込み中に、クラウド サービス エミュレーターを使用してクラウド プロジェクトをローカルでテストできます。 エミュレーターは Azure SDK Tools に含まれるもので、クラウド サービスが Azure に発行されるときに使用される環境の制限付きバージョンです。

エミュレーターを起動するには、最初に右クリックして [スタートアップ プロジェクトに設定] を選択して、クラウド プロジェクトがソリューションのスタートアップ プロジェクトであることを確認します。 次に、[デバッグ] > [デバッグの開始] (F5) または [デバッグ] > [デバッグなしで開始] (Ctrl+F5) を選択します。

エミュレーターでの制限により、Python コードをデバッグすることはできません。 したがって、ロールを個別に実行し、発行する前に統合テストにエミュレーターを使用してロールをデバッグすることをお勧めします。

ロールをデプロイする

発行ウィザードを開くには、ソリューション エクスプローラーでロール プロジェクトを選び、メイン メニューから [ビルド] > [発行] を選択するか、プロジェクトを右クリックして [発行] を選択します。

発行プロセスには 2 つのフェーズが含まれます。 まず、Visual Studio で、クラウド サービスのすべてのロールを含む 1 つのパッケージを作成します。 このパッケージは Azure にデプロイされるもので、ロールごとに 1 台以上の仮想マシンを初期化し、ソースをデプロイします。

各仮想マシンがアクティブになると、ConfigureCloudService.ps1 スクリプトを実行し、すべての従属物をインストールします。 既定では、このスクリプトは Python の最新バージョンを NuGet からインストールし、requirements.txt ファイルで指定されたパッケージをインストールします。

最後に、worker ロールは Python スクリプトの実行を開始する LaunchWorker.ps1 を実行します。Web ロールは IIS を初期化し、Web 要求の処理を開始します。

依存関係

クラウド サービスでは、ConfigureCloudService.ps1 スクリプトは pip を使用して Python の従属物のセットをインストールします。 依存関係は、requirements.txt という名前のファイルで指定する必要があります (ConfigureCloudService.ps1 を変更することでカスタマイズできます)。 ファイルは初期化の一部として pip install -r requirements.txt で実行されます。

クラウド サービス インスタンスには C コンパイラが含まれていないため、C の拡張子を持つすべてのライブラリはコンパイル済みのバイナリを提供する必要があります。

pip とその従属物に加えて requirements.txt 内のパッケージが自動的にダウンロードされ、課金対象の帯域幅の使用としてカウントされる可能性があります。 requirements.txt ファイルの管理について詳しくは、「必要なパッケージの管理」をご覧ください。

トラブルシューティング

デプロイ後に Web または worker ロールが正常に動作しない場合は、以下を確認します。

  • Python プロジェクトの bin\ フォルダーに (少なくとも) 以下が含まれること。

    • ConfigureCloudService.ps1
    • LaunchWorker.ps1 (worker ロールの場合)
    • ps.cmd
  • Python プロジェクトに、すべての従属物 (またはホイール ファイルのコレクション) を一覧する requirements.txt ファイルが含まれること。

  • クラウド サービスでリモート デスクトップを有効にし、ログ ファイルを調査します。
  • ConfigureCloudService.ps1LaunchWorker.ps1 のログがリモート マシン上の C:\Resources\Directory\%RoleId%.DiagnosticStore\LogFiles フォルダーに格納されていること。
  • Web ロールが web.config に構成されているパス (WSGI_LOG appSetting のパス) に追加のログを書き込めること。 ほとんどの標準的な IIS または FastCGI ロギングも動作すること。
  • 現在、LaunchWorker.ps1.log ファイルは Python の worker ロールによって表示される出力またはエラーを表示する唯一の方法です。