normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Azure Websites 上の Java アプリをリモートデバッグする

最近の投稿は Java 成分が多めになっているが、昨今の職種と役割のせいだと信じたいところ。さて、今回は Azure Websites 上の Java アプリにリモートデバッグを行う。当然ながらローカル環境と Azure Websites 上では少なからず差異があるため、今回紹介するリモートデバッグの機能は有用な人が多いはずだ。

こちらは既に Microsoft からソースコードを含めた利用方法が GitHub/Azure/azure-websites-java-remote-debugging に公開されている。今回はこちらを利用して実際に Azure Websites 上の Java アプリをリモートデバッグする。上記のソースコードを一読すると理解できると思うが、リモートデバッグ自体は既存の JDWP‐Java Debug Wire Protocol を利用しているので、こちらを理解している人であればとっかかりはあまり難しくないだろう。

リモートデバッグを試す

以下がリモートデバッグを試すまでの全体の流れになる。初回の疎通を通すまでは以下を参考にした方が楽にできるだろう。

  1. Websites を作成して「構成」タブから WebSocket を有効化する(おすすめはギャラリーからの Tomcat 7.x 作成
  2. Web.config に追記を行う
  3. 自作アプリの配置
  4. https://github.com/Azure/azure-websites-java-remote-debugging をダウンロードして DebugSession.bat の実行
  5. ブラウザから Azure Websites の自作アプリにアクセス

まず、新規に Websites を作成するが、こちらは 無料 モードでも 標準 モードでも問題ない。次に編集する Web.config があらかじめ配置されるギャラリーから「Apache Tomcat 7」がお勧めだ。
f:id:waritohutsu:20150125075205p:plain:w400
Websites 作成後、以下を参考に構成タブから WebSocket を有効化する。
f:id:waritohutsu:20150125075249p:plain

次に、kudu( https://<サイト名>.scm.azurewebsites.net/)にアクセスして D:\home\site\wwwroot\web.config を以下の様に編集する。デバッグオプションが追加していることが確認できるだろう。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="httpPlatformHandler" path="*" verb="*" 
                 modules="httpPlatformHandler" resourceType="Unspecified" />
        </handlers>
        <httpPlatform processPath="d:\home\site\wwwroot\bin\apache-tomcat-7.0.52\bin\startup.bat">
            <environmentVariables>
                <environmentVariable name="CATALINA_OPTS" value="-Dport.http=%HTTP_PLATFORM_PORT%" />
                <environmentVariable name="CATALINA_HOME" value="d:\home\site\wwwroot\bin\apache-tomcat-7.0.52" />                
                <environmentVariable name="JAVA_OPTS" value="-Djava.net.preferIPv4Stack=true -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=127.0.0.1:%HTTP_PLATFORM_DEBUG_PORT%" />
            </environmentVariables>
        </httpPlatform>
    </system.webServer>
</configuration>

更に、自作アプリを Websites 上に配置する。Eclipse から新規プロジェクト作成を選択し、Dynamic Web Project を選択して以下の様に index.jsp を配置する。
f:id:waritohutsu:20150125075109p:plain

上記でも紹介した Kudu の Debug console を利用して D:\home\site\wwwroot\bin\apache-tomcat-7.0.52\webapps\ROOT 以下のバックアップを取得したうえで作成した Java アプリを配置する。

次にリモートデバッグ用のツールを実行する。azure-websites-java-remote-debugging から取得したファイルの bin\DebugSession.bat を以下の実行例に沿って実行する。

>DebugSession.bat -p 8000 -s <sitename>.scm.azurewebsites.net -u <username> -w <password> -t
1 25, 2015 7:57:37 午前 org.azure.waws.DebugSession startSession
情報: Waiting for debugger to connect on 8000 ...

ここでの注意として、username には sitename\username を指定してはいけない点だ(例:normalian)。

Eclipse から [Debug As]-[Debug Configurations..] を選択し、以下の実行例に沿ってアプリケーションをデバッグ実行する。
f:id:waritohutsu:20150125075929p:plain

最後にブラウザからサイトにアクセスすると、以下の様に Eclipse 上からリモートデバッグが可能となる。
f:id:waritohutsu:20150125080600p:plain

最後に注意点として、Azure Websites を無料モードで利用している場合にCPU使用制限に引っかかってインスタンスが再起動される場合があるので、長時間放置する場合には WebSocket のコネクションが切れている場合があるので注意が必要だ。