locked
[Advent Calendar 2017 Day15] Azure Web Apps お役立ち PowerShell スクリプトいろいろ RRS feed

  • 全般的な情報交換

  • こちらの記事は、Qiita に掲載した Microsoft Azure Tech Advent Calendar 2017 の企画に基づき、執筆した内容となります。
    カレンダーに掲載された記事の一覧は、こちらよりご確認ください。

     

    こんにちは。Azure サポートの板垣です。

    今回は、Azure Web Apps の管理 API 呼び出しを行う、PowerShell スクリプトのサンプルをご紹介します。
    情報採取やトラブルシューティングのために実行する他、Azure Functions や Web Jobs でスクリプトを実行することで、自動運用を実現するようなこともできます。是非ともご参考ください。

    # Azure PowerShell のインストール方法につきましては、Azure PowerShell 最新版のインストール手順 もご参考ください。

     


    API の認証方法

    PowerShell を使って Azure Web Apps を管理する方法として、Azure PowerShell を使う方法と、Azure Web Apps の管理サービスである Kudu サイト (https://.scm.azurewebsites.net) で提供される API を使用する方法があります。

    Azure Power Shell

    Kudu REST API

    REST API
    Process Threads list and minidump gcdump diagsession

    今回ご紹介するサンプルスクリプトでは、Azure PowerShell と Kudu REST API を組み合わせて使用しますが、それぞれで認証方法が異なりますので、まずはその点をご案内します。

    Azure PowerShell の認証

    Azure PowerShell を使用するために、Azure PowerShell でのログインが必要です。
    対話形式でスクリプトを実行する場合、Login-AzureRmAccountと入力すると、Azure の資格情報の入力を求めるダイアログ ボックスが表示されます。
    運用フェーズでの利用では、サービス プリンシパルを使用した非対話形式の方法が適切な場合がありますが、その方法については本稿では割愛します。

    Kudu REST API の認証

    Kudu REST API は、Azure Web Apps のデプロイ資格情報による基本認証で認証されます。
    以下は、基本認証情報を Authorization ヘッダーに設定するサンプルです。

     

    また、デプロイ資格情報は Web Apps のリソース情報から取得することもできます。

     

    特定のインスタンスを管理する

    Azure Web Apps を複数インスタンスでホストしている際に、トラブルシューティング等のために、特定のインスタンスに対して管理を実行したい場合があります。
    通常、複数インスタンスでホストされている場合、要求はラウンドロビンでロードバランシングされ、任意のインスタンスによって要求が処理されます。しかし、ARRAffinity クッキー (通常はセッション アフィニティの目的で使用されます) に、アクセスしたいインスタンスの ID を設定することで、特定のインスタンスに狙ってアクセスすることができます。

    以下は、Web App で使用中のインスタンス ID を取得するサンプルです。

    実行すると、$instanceIdsとして以下のような結果を取得することができます。

    a4951240a2a973f8aa3fb4a433eabf17c8d5b37bb6f444edb7d6e21bd160d35e
    abd1db53c6d9f913fdd9aa2b9362933ec2770d5b2e294178637a5b55a95b0667
    2dcf59fa789311a8e661bb55bb9eb5a641d4657871dba8575dead3011e293b1a
    

    続いて、そのインスタンス ID を ARRAffinity クッキーに設定するサンプルです。このクッキーを設定して要求を発行することで、特定のインスタンスに狙ってアクセスすることができます。

     

    サンプル スクリプト

    それでは、ここまでのご案内を踏まえまして、Web Apps の管理に役立つサンプル スクリプトをご紹介します。
    以降のサンプルでは、前述の方法で基本認証情報を設定した$authHeaderと、ARRAffinity クッキーを設定した$cookieSessionを使用しています。

    [プロセスをシャットダウンする]

    https://github.com/jpcie/Japan-Azure-PaaS-Support-Blog/blob/master/PowerShell/ShutdownProcess.ps1

     

    特定インスタンスのみでアプリケーションの再起動が必要になる場合、一旦ワーカー プロセスをシャットダウンすることで、次回アクセス時に再起動されます。
    このサンプルでは、アプリケーションのメイン プロセスのみをシャットダウンします。

     

    [プロセス メモリ ダンプを取得する]

    https://github.com/jpcie/Japan-Azure-PaaS-Support-Blog/blob/master/PowerShell/DumpProcessMemory.ps1

     
    アプリケーションがハングアップする場合等に、プロセス メモリ ダンプを取得して解析することが調査方法として有効である場合があります。
    このサンプルでは、10 秒間隔で 3 回、プロセス メモリ ダンプを取得し、ローカル環境の C:\Diagnostics に保存します。
    取得したプロセス メモリ ダンプは、Debug Diagnostic Tool 等で解析することができます。

     

    [コンピューター名を取得する]

    https://github.com/jpcie/Japan-Azure-PaaS-Support-Blog/blob/master/PowerShell/GetComputerName.ps1

     

    Azure ポータル上のインスタンス表示では、インスタンス ID ではなく、"RD000D3A5019EF" というように仮想マシンのコンピューター名で表示される場合があります。
    このサンプルの方法で、インスタンス上の環境変数から、コンピューター名を取得することができます。

     

    まとめ

    最後に、それぞれを組み合わせたサンプルを作成してみます。
    このサンプルでは、各インスタンスのヘルスチェックを実行し、HTTP 200 応答が得られなかった場合にプロセス メモリ ダンプを取得しています。

    以上、今回は Kudu REST API の一部を使用したサンプルでしたが、組み合わせることで運用時のトラブルシューティング自動化にもご利用いただけるのではないかと思います。
    また、認証情報の設定方法、特定のインスタンスにアクセスする方法を流用して、今回ご紹介していないその他の API も活用することができます。
    今後も便利なスクリプトがありましたら、本ブログでご紹介していきたいと思います。

    2019年3月18日 0:54
    所有者