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](https://qiita-image-store.s3.amazonaws.com/0/133607/281d6e26-de31-001a-5ff7-170417cf7647.png)

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


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


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

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

### dependencyを修正する
* 以下を削除

```xml
<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-functions-java-core</artifactId>
  <version>1.0.0-beta-3</version>
</dependency>
```

* 以下を追加

```xml
<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を除外するようにします。

```xml
<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にバージョンを変更します。

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

## コードを修正する
パッケージが変更されたので修正が必要です。

* 修正前

```java
import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.*;
```

* 修正後

```java
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
```

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

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

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

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

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

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

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