Azure FunctionsをJava + VS Codeで試してみた（Maven for Java編）

最近勉強中のJavaをAzure Functionsで動かしてみました。
できるだけVS Code拡張機能のMaven for Javaを使っています。
とりあえずサンプルが動くところまで。
Azure FunctionsのJavaは現時点ではまだプレビューですね。

# 動作環境
* Windows 7
* Visual Studio Code 1.24.1
    * 拡張機能：Java Extension Pack 0.3.0
* JDK 1.8
* Apache Maven 3.5.3
* Azure CLI 2.0.32
* .Net Core SDK 2.1
* Node.js 7.2.1
* npm 4.0.5
* Azure Functions Core Tools 2.0.1-beta.35

# 事前インストール
* [Java Developer Kit バージョン 8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
* [Apache Maven バージョン 3.0 以降](https://maven.apache.org/download.cgi)
* [Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?view=azure-cli-latest)
* [.Net Core SDK 2.1](https://www.microsoft.com/net/download)
* [Node.js](https://docs.npmjs.com/getting-started/installing-node#osx-or-windows)
* [Azure Functions Core Tools](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local#v2)

# Mavenプロジェクト作成
* VS Codeで「Ctrl + Shift + P」を押しコマンドパレットを表示します。
* [Maven: Generate from Maven Archetype]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b5031747-2405-ddbf-5bd5-4e49776176ad.png)

* 空フォルダを作成し、[Select Destination Folder]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a54f9041-25df-917d-093a-a8d310483718.png)

* しばらくすると以下のような画面になるので、[More ...]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/68fad736-e5cc-b0a9-6311-0ef835af4f9e.png)

* コマンドパレットに[functions]と入力すると、[azure-functions-archetype]が表示されるので選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fb49774c-aa5c-557f-57ab-97aed8984ce7.png)

* VS Codeのターミナルウィンドウで、以下内容を聞かれるのでそれぞれ入力していきます。

```
Define value for property 'groupId': [任意のGroupIDを入力する]
Define value for property 'artifactId': [任意のArtifactIDを入力する]
Define value for property 'version' 1.0-SNAPSHOT: : [そのままEnter]
Define value for property 'package' testgrp: : [そのままEnter]
Define value for property 'appName' testid-yyyymmddxxxxxxx: : [任意のアプリケーション名を入力する。これがFunction Appの名称になります]
Define value for property 'appRegion' westus: : [japaneast]
Define value for property 'resourceGroup' java-functions-group: : [任意のリソースグループ名]
確認メッセージが出るのでYを押す
```

* 先程指定したフォルダをVS Codeで開きます。
* MAVEN PROJECTSより、該当フォルダを選択して、[右クリック]→[clean]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/14563048-1d70-3f72-f08d-77655a499535.png)

* MAVEN PROJECTSより、該当フォルダを選択して、[右クリック]→[package]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/015cc4d1-0108-03a8-8fee-d286c380ff18.png)

# ローカル実行
* [Ctrl + Shift + P]でコマンドパレットを開き、[Maven: Execute commands]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c140cac6-9017-c492-bbd5-8a7083c31a93.png)

* 対象プロジェクトのartifactIdを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9ed4f174-4fb0-e8a6-f855-94337527c45b.png)

* [Custom goals ...]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b1c56dac-4dd3-9787-a8a7-69cd0813a384.png)

* [azure-functions:run]と入力し、Enterを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f816068e-e4fe-0400-6f79-3002b19838a7.png)

* functionsのロゴが出てローカル起動されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9a23be70-568b-32bd-fab8-710c31f0e6d1.png)

* ローカルのURLが発行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e6309d9d-7a18-7d9c-dcbd-b321a703230b.png)

* とりあえずテストしてみましょう。ブラウザで以下URLで実行してみます。

```
http://localhost:7071/api/HttpTrigger-Java?name=Azure
```

* 問題なく実行できてますね！  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/76e76e61-e244-57f6-9c37-f29740c5c3df.png)

# Functionsデプロイ
* ではFunctionsにデプロイしてみます。[Ctrl + Shift + P]でコマンドパレットを開き、[Maven: Execute commands]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c140cac6-9017-c492-bbd5-8a7083c31a93.png)

* 対象プロジェクトのartifactIdを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9ed4f174-4fb0-e8a6-f855-94337527c45b.png)

* [Custom goals ...]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b1c56dac-4dd3-9787-a8a7-69cd0813a384.png)

* [azure-functions:deploy]と入力し、Enterを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1ccb3b9c-06cd-f3d1-0ccf-c31abf000dd6.png)

* Azure PortalでFunction Appを見てみると新規作成されていることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f177021d-a541-086c-ebca-887762051b02.png)

* ではテストしてみましょう。ブラウザで以下URLで実行してみます。[Your AppName]には、functinos作成時に指定した値を入力してください。

```
https://[Your AppName].azurewebsites.net/api/HttpTrigger-Java?name=Azure
```

* うまくいきました！（少し時間が掛かります）  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dda41514-cc2e-d115-6c2d-a0c7f408c9af.png)

# まとめ
とりあえずサンプルプログラムを動作させてみただけですが、Functions楽しい！
スワップとかCI/CDとか運用どうするのとか気になること山盛りなのでこれから徐々に深掘りしていきたいと思います。

# 参考にしたサイト
[Java と Maven を使用して初めての関数を作成する (プレビュー)](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-first-java-maven)
[javaでAzure functions](https://qiita.com/suzuq/items/51f4b92def88110f0a02)