Quarkusのネイティブバイナリをクラウドにあげてみよう!
これまで Quarkus のネイティブバイナリの入ったコンテナをローカルで動かすのはやってみてましたが、今回はいよいよちゃんとしたクラウドにあげてみたいと思います。
幸いにも Quarkus のサイトにはネイティブビルドしたバイナリを含むコンテナを Azure にデプロイする手順が載っておりますのでこちらのページを参考に Azure Container Instances にデプロイしてみたいと思います。
Quarkusのコンテナは前回の記事(【2019年11月版】Quarkus + Panache で CosmosDB as MongoDB に入門)で作成したものを引き続き使用いたします。
1. Azure 用に 80番ポートで動くように調整
Azureのコンテナ(というか普通のhttpを受け付けるコンテナ)は80番に着信がきますので、Quarkusも 8082
とか 8080
ではなくちゃんと 80
を待ち受けるように調整いたします。
コンテナのポートを解放する EXPOSEの指定を修正するのと、実行時に
80` を Listen するオプションを追加します。
...
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
と設定いたしました。
version : "3"
services:
quarkus:
image: quarkus-quickstart/getting-started
build:
context: .
ports:
- 8080:80
さて、docker-compose ファイルも修正して一旦、ローカルで動作確認してみましょう。
ホスト側のポートは大人の事情により 8080
のままといたします。
$ docker-compose build
...
ビルドができたら、起動してcurl
で叩いてみます。
$ 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のデータエクスプローラーから確認してみます。
5de10f593ebae726bc854d64
のデータが入っていることが確認できました。
コンテナの80
ポート待ち受けはちゃんと機能しているようです!
2. Azure CLI からのデプロイ操作
ここからはaz
コマンドを使用します。未インストールの方は以下のサイトからご用意をお願いします。
2-1. ログイン
まずは、CLIにログイン状態を設定します。
$ az login
ブラウザが立ち上がりますのでログインをしてください。
2-2. リソースグループの準備
続いて以下のコマンドで "Resource Group" を作成します。
今回は "my-test-group" という名前のグループを地域:東日本
で作成してみます。
$ az group create --name my-test-group --location japaneast
2-3. コンテナリポジトリの作成
続いて以下のコマンドで "Azure Container Repository" を作成します。
今回は安易に azRepo
という名前で作成します。SKUは標準、管理者を有効とします。
$ 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のリポジトリ名を確認します。
$ az acr show -n azRepo --query loginServer
"azrepo.azurecr.io"
この azrepo.azurecr.io
がリポジトリ名になりますので、タグの先頭に追加します。
2-4. コンテナリポジトリへアップロード
以下のようにdocker-compose.yml
のタグを修正します。
version : "3"
services:
quarkus:
image: azrepo.azurecr.io/quarkus-quickstart/getting-started
build:
context: .
ports:
- 8080:80
既存のローカルにある image にタグを追加して、dokcer push
します。
$ 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
はい、アップロードできた模様です。
以下のコマンドで確認してみます。
$ az acr repository list -n azRepo
[
"quarkus-quickstart/getting-started"
]
ちゃんと上がっているようです。
ちなみにAzureポータルの画面からもリポジトリの中身は確認できます。
バッチリ、quarkus-quickstart/getting-started
のイメージが上がっていますね。
コンテナがデプロイされてから image を pull する際に必要なリポジトリのユーザー名、パスワードを 管理画面から確認します。
以下のアクセスキーの画面からパスワードをコピーしておきます。
ユーザー名はリポジトリ名、そのままで良いのかな?
2-5. コンテナインスタンスの作成
それでは以下のコマンドでACRに上がっているquarkus-quickstart/getting-started
のイメージからコンテナを作成しましょう。
$ 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 の管理画面からも状態を確認してみましょう。
状態がRunning
となっています。すでに起動が完了しているようですね
3. 動作確認
先ほどのドメインをブラウザで開いてみましょう。
http://quarkus-hello-xxxxx.japaneast.azurecontainer.io
を叩いてみると・・・
はい、Quarkusのindex.html
が表示されました!! Quarkus、ちゃんと起動しているようです!
それでは・・・ curlからPOSTしてみます!
$ 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
を開いてみます!
素っ気無いですが、ちゃんとJSONが返ってきました!
Cosmos DB の管理コンソールから確認してみましょう。
5de12fa83ebae726bc854d64
のデータが無事に登録されていることが確認できました。
Cosmons DB との疎通もバッチリですね。
ネイティブ化したバイナリを Azure Container Instance サービスで動かすことに無事に成功しました!
まとめ
これまでローカルのDockerだけで動かしてきた Quarkus のネイティブバイナリですが、Azure でもちゃんと動作することが確認できました。
Java で書いたプログラムがネイティブのバイナリになるのも驚きですが、コンテナとしてちゃんと動くというのは…感動ですね。
Panache で Mongo Client 経由の Cosmos DB アクセスも非常に簡単です。
アーキテクチャとしてはかなり混みいったことをやってますが、実装のソースコードは非常に小さいです。
無事に Quarkus は 1.0.0 の正式リリースを迎えましたので、本番の案件でも積極的に採用していきたいと思います。
いやぁ、本当にクラウドで動いてるのはちょっと信じらんないんですが…w
今回の成果物も前回のリポジトリに追加しておきました。ご参考にどうぞ。
本日はここまでといたします!