ローカルでは実行できているのに、いざデプロイするとエラーが発生してしまうという現象が発生しました。
その対処内容を記載します。
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になっているはず。)
なお、このバージョンは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に対応できるような修正を行った方がいいと思います。