Azure Functions+Visual Studio Codeによるデプロイを試みる(Java編)

タイトル通りのこの記事。
前回のC#編が終りまして、今回はJavaになります。

試している内容としてはC#と同じで、「Azure FunctionsにAPIをデプロイして、ブラウザから叩いてみる」という非常に簡単なものなのですが、幾つか罠があって微妙に時間がかかってしまったので同じことを試してみようという方にとってお役に立てば幸いです。

ちなみに、私のJavaの経験はAndroid Java(3年)だけでWebの開発経験はありません。
ただ、私は組み込み・制御系からキャリアをスタートし、その後ベンチャーでWebはPHP、そしてAndroid JavaやObjectiveCをやってきました。
是非C#以外の方々にもAzureでのこんなことができるということを知ってもらいたいと思います。

まずは準備段階としてMicrosoftのドキュメントにもある通り、
・JDKのバージョン11もしくはバージョン8
・Apache Mavenのバージョン3.0以上
をインストールする必要があります。
JDKはこの記事を書いた2022年7月31日現在バージョン18まで存在しています。
しかしながら、Azure Functionsでは上に書いた通りバージョンが8か11でなければ動きませんのでくれぐれもご注意ください。
うっかり他のバージョンを入れてしまうと競合を起こしてしまい、Javaの経験がある人でなければ回復不可能になるかもです(経験済み)。

JDK以外にJavaと関係のあるもう1つの要件であるMavenはZIP形式のみでWindows用のインストールキット形式(.msi)では存在していません。。
つまり、ダウンロードして解凍するだけ。。ではないのでこれも注意が必要です。
今回は以下のサイトを参考にさせていただきました。

C#と同様、WORKSPACE→Create Functionでサンプルプロジェクトが作成できます。

改めて気付きましたが、この流れで指定したディレクトリにサンプルプロジェクトが作られない場合があります。
例えば上記のMavenのインストールや設定が正しく行われていない場合がそれです。
私もプロジェクトの作成がうまくいかず、設定を見直しても特に問題はなく、VC Codeの再起動によって何故かうまくいきましたが、もし同じ症状が発生した場合はそれまでの設定等を見直してみてください。

次の問題がローカル環境での動作確認でした。
デバッグ実行を行ったところ、以下のエラーが発生してしまいました。
> Failed to start Worker Channel. Process fileName: %JAVA_HOME%/bin/java
今回、このエラーにかなり苦しめられました。
検索すると同じ問題で悩んでいる方が結構いました。が、皆さんLinuxもしくはMac環境での問題のようで解決方法は若干異なります。

Windowsの場合、Program Files\Microsoft\Azure Functions Core Tools\workers\java\配下にworker.config.jsonというファイルがあり、そこに「defaultExecutablePath」という設定項目がありまして、今回のエラーの原因である「%JAVA_HOME%/bin/java」が定義されています。
これはJava.exeの場所になりまして、皆さんの環境のJava.exeのパスを設定すればよいのですが、今回Microsoftのドキュメントに従って設定すると私の場合Java.exeは以下の場所になりましたのでこれを記述します。
"C:\Users\(ユーザー名)\.vscode\extensions\redhat.java-1.9.0-win32-x64\jre\17.0.3-win32-x86_64\bin\java"
※実際に上記jsonファイルに記述する場合、「\」にエスケープシーケンスが必要になります

前回C#ではAPIのリクエストパラメータをコマンドパレットで入力するように促されたのですが、Javaではこれがありませんでした。
ですので、ローカル環境にしてもAzureにしてもテストする場合はPostman等で行う必要があります。
その結果が以下になります(C#と同じですが。。)。
無事、JavaでもFunctionsのビルド、デプロイが行えたことになります。

Javaでのプロジェクト構成とソースコードも参考までに挙げておきます。
この時に気付きましたが、テストコードも自動生成されてますね。。素晴らしい。

既にJavaでも同様の環境、つまり、VSCode+Java+Azureでバリバリ開発されている方々にとっては見慣れた内容かと思いますが、ずっとC#、そしてAzureでWeb開発をやってきた私のような人間にとって、Java+Azureの組み合わせでAPIが動作するというのはなかなかに新鮮なものでした。
Java界隈の方々、是非お試しください。
そして、Javaの方々は恐らくMacで開発している方も多いのではないかと思っております。
実はMacでもC#(.NET6)で同様の内容を試していたのですが、若干これにもつまづいたところがあり、それをちゃんとメモらずに解決してしまったため、改めて調査し直してブログに書いてみたいと思います。

では今回はこの辺で。。

この記事が気に入ったらサポートをしてみませんか?