Java
Azure
AzureFunctions

JavaでAzure Functionsが動かなくなったので対処した

ローカルでは実行できているのに、いざデプロイするとエラーが発生してしまうという現象が発生しました。
その対処内容を記載します。

6/15追記
この記事を書いた後にMavenプラグイン等もリリースされたようです。

発生した事象

上にも記載したとおり、Mavenプラグインを利用してローカルでは正常に動作していますが、Azureにデプロイして動作させると以下のようなエラーが発生します。

502-Bad Gateway
The specified CGI application encountered an error and the server terminated the process.

原因

以下によると、新しいRuntimeがリリースされた影響で今までのコードが動作しなくなったようです。
https://stackoverflow.com/questions/50615746/azure-java-function-502-bad-gateway
https://github.com/Azure/app-service-announcements/issues/112

ローカルでは以前のRuntimeで動作していたので問題ないのですが、デプロイすると新しいRuntime上で動作するためエラーが起きているっぽいです。

対処

新しいRuntimeで動作するように修正すればいいのですが、実は2018/6/14時点でこの対処はまだできません。
この対応を行ったazure-functions-maven-pluginがまだリリースされていないためです。

そのため、暫定対処として以下を実施します。

Runtimeのバージョンを指定する

Azure上でRuntimeのバージョンを指定します。
AzureのポータルからFunction Appの「アプリケーション設定」を開きます。
FUNCTIONS_EXTENSION_VERSIONを2.0.11776-alphaに変更します。(デフォルトだとbetaになっているはず。)

無題.png

なお、このバージョンは6月末までは有効、とのことです。

(参考までに)新Runtimeへの対応方法

Maven Pluginがリリースされていないところではありますが、それ以外で対処が必要な箇所は以下の通りです。
なお、中途半端な対応になるのでローカルですら動作しない環境になってしまいます。

6/15追記
対応したMaven Pluginがリリースされましたので、以下の対応でOKです。

pom.xmlを修正する

Maven Archetypeから作成したプロジェクトを前提としていますので、カスタマイズしている人は適宜読み替えてください。
なお、azure-functions-maven-pluginがリリースされれば、pluginManagementで指定しているバージョンを修正する必要があると思われます。

dependencyを修正する

  • 以下を削除
<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-functions-java-core</artifactId>
  <version>1.0.0-beta-3</version>
</dependency>
  • 以下を追加
<dependency>
  <groupId>com.microsoft.azure.functions</groupId>
  <artifactId>azure-functions-java-library</artifactId>
  <version>1.0.0-beta-4</version>
</dependency>

※groupId、artifactIdも変更されているので注意が必要です。

maven-dependency-pluginの設定を変更する

ここでpomで定義されたjarファイルをlibフォルダに追加する設定が行われています。
もともとazure-functions-java-coreは除外する設定になっていたので、以下のように修正して、azure-functions-java-libraryを除外するようにします。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>3.0.2</version>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${stagingDirectory}/lib</outputDirectory>
        <overWriteReleases>false</overWriteReleases>
        <overWriteSnapshots>false</overWriteSnapshots>
        <overWriteIfNewer>true</overWriteIfNewer>
        <includeScope>runtime</includeScope>
        <excludeArtifactIds>azure-functions-java-library</excludeArtifactIds> <!-- ここ -->
      </configuration>
    </execution>
  </executions>
</plugin>

azure-maven-pluginのバージョンを変更(6/15追記)

1.0.0-beta-2にバージョンを変更します。

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-functions-maven-plugin</artifactId>
  <version>1.0.0-beta-2</version> <!-- ここ -->
</plugin>

コードを修正する

パッケージが変更されたので修正が必要です。

  • 修正前
import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.*;
  • 修正後
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;

serverlessがなくなったようです。

ローカルのRuntimeをバージョンアップする

アップデートだとバージョン指定がよくわからなくなってしまったので、一度アンインストールしてインストールしなおしました。

npm -g uninstall azure-functions-core-tools
npm -g install azure-functions-core-tools@core

この記事を書いていて思いましたが、最近JavaでAzure Functionsを動かし始めた人はローカルですら動作しないですね。
(手順どおりにすると新しいRuntimeがインストールされてしまうため)

そういう方はRuntimeのバージョンを下げてインストールするといいかもしれません。

npm -g uninstall azure-functions-core-tools
npm -g install azure-functions-core-tools@2.0.1-beta.27

6/15追記
対応版がリリースされたので、Runtimeのバージョンを下げるのではなく、新Runtimeに対応できるような修正を行った方がいいと思います。