【2019年11月版】Quarkusのネイティブバイナリコンテナ を Azure Container Instances にデプロイ

# Quarkusのネイティブバイナリをクラウドにあげてみよう！

これまで Quarkus のネイティブバイナリの入ったコンテナをローカルで動かすのはやってみてましたが、今回はいよいよちゃんとしたクラウドにあげてみたいと思います。

幸いにも Quarkus のサイトにはネイティブビルドしたバイナリを含むコンテナを Azure にデプロイする手順が載っておりますのでこちらのページを参考に [Azure Container Instances](https://azure.microsoft.com/ja-jp/services/container-instances/) にデプロイしてみたいと思います。

- [QUARKUS - DEPLOYING TO MICROSOFT AZURE CLOUD](https://quarkus.io/guides/deploying-to-azure-cloud)

Quarkusのコンテナは前回の記事([【2019年11月版】Quarkus + Panache で CosmosDB as MongoDB に入門](https://qiita.com/koinori/items/85ce156216103f8d7db6))で作成したものを引き続き使用いたします。

## 1. Azure 用に 80番ポートで動くように調整

Azureのコンテナ(というか普通のhttpを受け付けるコンテナ)は80番に着信がきますので、Quarkusも `8082` とか `8080` ではなくちゃんと `80` を待ち受けるように調整いたします。
コンテナのポートを解放する EXPOSE`の指定を修正するのと、実行時に `80` を Listen するオプションを追加します。

```Dockerfile:Dockerfile
...
EXPOSE 80
CMD ["./application", "-Dquarkus.http.host=0.0.0.0", "-Djava.library.path=/work/lib", "-Djavax.net.ssl.trustStore=/work/cacerts", "-Dquarkus.http.port=80"]
```
上記のように Dockerfileを修正いたしました。

また、ちゃんとタグを設定してコンテナレジストリに push できるように準備をいたします。
タグはチュートリアルにしたがって `quarkus-quickstart/getting-started` と設定いたしました。

```yml:docker-compose.yml
version : "3"
services:
  quarkus:
    image: quarkus-quickstart/getting-started
    build:
      context: .
    ports:
      - 8080:80
```
さて、docker-compose ファイルも修正して一旦、ローカルで動作確認してみましょう。
ホスト側のポートは大人の事情により `8080` のままといたします。

```shell
$ docker-compose build
...
```
ビルドができたら、起動して`curl`で叩いてみます。

```shell
$ docker-compose up -d
$ curl -H 'Content-Type:application/json' -d '{"name":"Alice","birth":"2010-10-11","status":"Alive"}' http://localhost:8080/person
{"id":"5de10f593ebae726bc854d64","name":"Alice","status":"Alive"}
```
はい、`5de10f593ebae726bc854d64`のIDが生成されたJSONが返却されましたね。

CosmosDBのデータエクスプローラーから確認してみます。
![CosmosDB MongoDB ローカル- データ エクスプローラー - Microsoft Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/39dd189f-181b-da48-4a13-5a64e0e4a927.png)
`5de10f593ebae726bc854d64`のデータが入っていることが確認できました。
コンテナの`80` ポート待ち受けはちゃんと機能しているようです！

## 2. Azure CLI からのデプロイ操作

ここからは`az`コマンドを使用します。未インストールの方は以下のサイトからご用意をお願いします。

- [Azure コマンド ライン インターフェイス (CLI)](https://docs.microsoft.com/ja-jp/cli/azure/?view=azure-cli-latest)

### 2-1. ログイン

まずは、CLIにログイン状態を設定します。

```shell
$ az login
```
ブラウザが立ち上がりますのでログインをしてください。

### 2-2. リソースグループの準備

続いて以下のコマンドで "Resource Group" を作成します。
今回は "my-test-group" という名前のグループを地域：`東日本`で作成してみます。

```shell
$ az group create --name my-test-group --location japaneast
```

### 2-3. コンテナリポジトリの作成

続いて以下のコマンドで "Azure Container Repository" を作成します。
今回は安易に `azRepo` という名前で作成します。SKUは標準、管理者を有効とします。 

```shell
$ az acr create --resource-group my-test-group --name azRepo --sku Basic --admin-enabled true
....

$ az acr login --name azRepo
```
リポジトリができたら `docker push`の際にログインできているように `acr login` をしておきます。
また以下のコマンドでACRのリポジトリ名を確認します。

```shell
$ az acr show -n azRepo --query loginServer
"azrepo.azurecr.io"
```
この `azrepo.azurecr.io` がリポジトリ名になりますので、タグの先頭に追加します。

### 2-4. コンテナリポジトリへアップロード

以下のように`docker-compose.yml` のタグを修正します。

```yml:docker-compose.yml
version : "3"
services:
  quarkus: 
    image: azrepo.azurecr.io/quarkus-quickstart/getting-started
    build:
      context: .
    ports:
      - 8080:80
```
既存のローカルにある image にタグを追加して、`dokcer push`します。

```shell
$ docker-compose build
...
Successfully tagged azrepo.azurecr.io/quarkus-quickstart/getting-started:latest

$ docker push azrepo.azurecr.io/quarkus-quickstart/getting-started
The push refers to repository [azrepo.azurecr.io/quarkus-quickstart/getting-started]
d0248e49bb8c: Pushed 
97171761471f: Pushed 
a52fb50084e4: Pushed 
eb5afad16103: Pushed 
b6f081e4b2b6: Pushed 
d8e1f35641ac: Pushed 
latest: digest: sha256:f1b03292455a08bdaebb808c8641ca6b80dde57b6a59585126494ceccc2f4731 size: 1571
```
はい、アップロードできた模様です。
以下のコマンドで確認してみます。

```shell
$ az acr repository list -n azRepo
[
  "quarkus-quickstart/getting-started"
]
```
ちゃんと上がっているようです。
ちなみにAzureポータルの画面からもリポジトリの中身は確認できます。

![azRepo - Microsoft Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/c54a680d-f8f8-6890-8532-d169584e44fe.png)
バッチリ、`quarkus-quickstart/getting-started`のイメージが上がっていますね。

コンテナがデプロイされてから image を pull する際に必要なリポジトリのユーザー名、パスワードを 管理画面から確認します。
以下のアクセスキーの画面からパスワードをコピーしておきます。
![azRepo - アクセス キー - Microsoft Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/074fd1fb-61dd-65ea-583f-f83267bd89f1.png)
ユーザー名はリポジトリ名、そのままで良いのかな？

### 2-5. コンテナインスタンスの作成

それでは以下のコマンドでACRに上がっている`quarkus-quickstart/getting-started`のイメージからコンテナを作成しましょう。

```shell
$ az container create \
     --name quarkus-hello \
     --resource-group my-test-group \
     --image azrepo.azurecr.io/quarkus-quickstart/getting-started \
     --registry-login-server azrepo.azurecr.io \
     --registry-username azRepo \
     --registry-password xxxxxxxxxxx \
     --dns-name-label quarkus-hello-xxxxx \
     --query ipAddress.fqdn
"quarkus-hello-xxxxx.japaneast.azurecontainer.io"
```
`quarkus-hello-xxxxx.japaneast.azurecontainer.io`と、あっさりした応答がありますがコンテナが作成されました。
この、`quarkus-hello-xxxxx.japaneast.azurecontainer.io` がドメインとなります。

ついでに Azure Container Instance の管理画面からも状態を確認してみましょう。
![quarkus-hello - コンテナー - Microsoft Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/d69f9757-8dbc-2af9-656d-5702161eba7f.png)
状態が`Running`となっています。すでに起動が完了しているようですね

## 3. 動作確認

先ほどのドメインをブラウザで開いてみましょう。
`http://quarkus-hello-xxxxx.japaneast.azurecontainer.io`を叩いてみると・・・

![mongodb-panache-quickstart - 1 0-SNAPSHOT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/c50489a8-1e02-ec99-7533-b2d65762a41d.png)
はい、Quarkusの`index.html`が表示されました！！ Quarkus、ちゃんと起動しているようです！

それでは・・・ curlからPOSTしてみます！

```shell
$ curl -H 'Content-Type:application/json' -d '{"name":"Alice","birth":"2010-10-11","status":"Alive"}' http://quarkus-hello-xxxxxx.japaneast.azurecontainer.io/person
{"id":"5de12fa83ebae726bc854d64","name":"Alice","status":"Alive"}
```
無事に`5de12fa83ebae726bc854d64`のidが返ってきました！

ブラウザで `http://quarkus-hello-xxxxxx.japaneast.azurecontainer.io/person/5de12fa83ebae726bc854d64`を開いてみます！

![person 5de12fa83ebae726bc854d64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/2b2751a1-d049-e854-9eba-57f6c3836391.png)

素っ気無いですが、ちゃんとJSONが返ってきました！

Cosmos DB の管理コンソールから確認してみましょう。

![cosmosDB Cloud データ エクスプローラー - Microsoft Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/2e54d233-6185-42a3-d874-832dbc02868d.png)

`5de12fa83ebae726bc854d64` のデータが無事に登録されていることが確認できました。
Cosmons DB との疎通もバッチリですね。

ネイティブ化したバイナリを Azure Container Instance サービスで動かすことに無事に成功しました！

## まとめ

これまでローカルのDockerだけで動かしてきた Quarkus のネイティブバイナリですが、Azure でもちゃんと動作することが確認できました。
Java で書いたプログラムがネイティブのバイナリになるのも驚きですが、コンテナとしてちゃんと動くというのは…感動ですね。
Panache で Mongo Client 経由の Cosmos DB アクセスも非常に簡単です。
アーキテクチャとしてはかなり混みいったことをやってますが、実装のソースコードは非常に小さいです。
無事に Quarkus は 1.0.0 の正式リリースを迎えましたので、本番の案件でも積極的に採用していきたいと思います。

いやぁ、本当にクラウドで動いてるのはちょっと信じらんないんですが…w

今回の成果物も前回のリポジトリに追加しておきました。ご参考にどうぞ。

- [quarkus-examples | panache-mongo-cosmos](https://github.com/Yoshinori-Koide-PRO/quarkus-examples/tree/panache-mongo-cosmos)

本日はここまでといたします！