LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-14

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

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に対応できるような修正を行った方がいいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1