アプリを動かしてみたこんにちは。サービスデリバリーセンター(SDC)のあおやまです。Function(SpringBoot)」アプリケーションを開発する機会があり、その際に調査した結果をまとめてみました。Azure」で提供されているイベントトリガー起動のサーバーレス・コンピューティングサービスです。Functions」ではアプリの形態(ホスティングプラン)を選択できる特徴があります。ホスティングプランは以下の3つがあります。スケールとホスティング)「従量課金プラン」はいわゆる一般的なサーバーレス・コンピューティングサービスで、関数の実行時間にのみ課金される安価な仕組みとなりますが以下のデメリットもあります。プラン」に変更するだけで上記デメリットを解消することが出来ます。(金額は高価になりますが)アプリの実装を変えずに「安価だが時間制約の強いサーバレス」と「高価だが時間制約のないサーバレス」と自由に変更できるのは大きなメリットに感じます。Functions」についてはランタイムバージョンを「2.x」前提としています。Functions」に乗せたのですが採用に至った理由は以下の通りです。Cloud」のサブプロジェクトです。Lambda」などのサーバーレス・コンピューティングサービス毎の実装の差異を極小化し、通常のSpringBootのアプリを開発するように簡単に関数アプリケーションを開発することができます。今回の作業は以下のガイドを参考にしながら行いました。概要)※こちらのガイドではHTTPリクエストトリガーで動くサンプルとなっていますが、当記事ではスケジュール起動するサンプルを作成しています。ローカル環境のセットアップまずは開発するためのローカル環境をセットアップします。通常のJava開発するためのEclipseはセットアップ済みとします。(2019-03)またガイドに沿ってビルドには「Maven」を利用します。Tools」をインストールします。操作)インストールはnpmコマンドで行うため「node.js」をインストールしていない場合はインストールします。(参考:Node.js)なおプロキシ環境下においてnpmコマンドでダウンロードするためには、以下のコマンドでプロキシサーバを設定します。Tools」をインストールします。CLI」をインストールします。login」コマンドでログインしておきましょう。ストレージ」に保存されます。エミュレーター」も必要となります。SDK」をインストールしていれば含まれているようですが、私は以下のページのリンクから単独でインストールしました。Express」を使っていますので、こちらもインストールします。エディション)アプリケーション(関数)の開発Mavenプロジェクトを準備する前述したガイドに沿ってMavenプロジェクトを準備します。プロジェクトを作成する)「pom.xml」には以下のように設定します。ガイドと異なる点は・「functionAppName」にユニークな関数名を設定します。・「functionResourceGroup」はデプロイ先の「Azure」のリソースグループ名を指定します。リソースグループ)・「start-class」に後述するSpringコンテナを初期化するクラス(このサンプルでは「jp.co.cresco.xxxx.SpringConfig」)を指定します。プラン」になってしまいます。(下記ブログ参照)「従量課金プラン」としてデプロイするためには、以下のように「azure-functions-maven-plugin」に「priceTier」タグを追加して「Consumption」を設定する必要があります。Consumption1234567com.microsoft.azureazure-functions-maven-plugin${functionResourceGroup}${functionAppName}${functionAppRegion}Consumptionアプリケーションを実装するアプリケーションの主要なクラスとして以下の3クラスを実装します。呼び出されるクラスです。Functions」のAPI仕様に依存した実装となります。context));}}以下の引数のアノテーション部分に設定されているのが実行スケジュールとなります。下記の例の場合は毎日1:00に実行となります。*"スケジュールに設定可能な値は以下を参照ください。式)「SpringConfig」クラスはSpringコンテナを初期化するクラスです。通常のSpringBootApplicationとなります。application.run(args);SpringApplication.exit(context);}「DailyBatchFunction」は主処理を行うクラスです。SpringのComponentとして登録され、他のComponentをDIすることも可能です。"SUCCESS";}}注意点としましては「DailyBatchFunction」が登録されている「@Component」名は「FunctionRequestHandler」に登録されている「@FunctionName」と合わせる必要があります。Functions」から呼び出された「FunctionRequestHandler」クラスが親クラス「AzureSpringBootRequestHandler」の「handleRequest」を呼び出します。「AzureSpringBootRequestHandler」は「SpringConfig」クラスを呼び出しSpringコンテナを初期化します。「AzureSpringBootRequestHandler」はSpringコンテナから「DailyBatchFunction」を取得し実行します。Functions」のAPIに依存したクラスと通常のSpringのComponentクラスが疎結合になっています。Functions」用の以下の設定ファイルを準備します。「/src/main/azure/host.json」は開発した関数アプリケーションに影響を与える構成オプションが設定されます。リファレンス)今回はデフォルト値のみとします。"2.0"}「/src/main/azure/local.settings.json」はローカル環境で稼働する場合の設定値を記述します。ローカル設定ファイル)ファイルは以下を記述します。エミュレーター」を使うために必要です。Maven」プラグインを使用して実行できます。azure-functions:run以下が実行結果となります。スケジュールで指定された時刻になればバッチ処理が実行されます。Tools」が動くのですが、Eclipseのコンソール上で「終了」ボタンを押しても終了できません。------------------------------------------------------------------------とエラーになってしまいます。その場合は「タスクマネージャ」に表示されている「func.exe」を終了させる必要があります。コンソールに出力する日本語が化けます。こちらはちょっと調査をする時間が足りなく解決に至っていません。Functions」にデプロイします。ローカルで動かす場合と同じようにMavenから実行できます。azure-functions:deploy以下が実行結果です。------------------------------------------------------------------------Azure管理コンソールでデプロイされた関数を確認をします。左メニューの関数名リンクをクリック、「実行」ボタンを押下しログの出力結果が問題ないことを確認します。ログの結果が問題なければ正しく動いています。データソース定義を環境変数から与えるまた今回はデータベースに接続するためのデータソース定義を外部から与えましたので、そのやり方を説明します。以下のように「spring.datasource.url」「spring.datasource.user」「spring.datasource.password」を「/src/main/azure/local.settings.json」に設定することにより、ローカルで稼働させる場合のデータベースの接続先を変更することができます。Functions」上で動くアプリケーションのデータベース接続先を変更するためには、Azure管理コンソールから設定します。「ホーム」⇒「関数アプリ」⇒「{自身がデプロイした関数}」と選択していきます。下の画面が表示されたら「構成」リンクをクリックします。「アプリケーション設定画面」が表示されるので、「新しいアプリケーション設定」リンクをクリックし、「spring.datasource.url」「spring.datasource.user」「spring.datasource.password」を設定します。Functions」の留意点・注意点を述べていきます。プラン」では「30分」となっており、それぞれ最大「10分」「無制限」と変更できます。タイムアウト期間)設定ファイル「src/main/azure/host.json」に値を設定することにより変更可能です。11で開発されている場合は注意してください。Languages)まとめいかがでしたでしょうか?設定して動かすまでにはずいぶん苦労しましたが、動かせれば通常のSpringBootの開発を行うように関数アプリケーションを開発でき、また簡単にデプロイできるので使いやすいです。サーバレス(マネージドサービス)の活用が重要だと思いました。この記事がどなたかの参考になれば幸いです。