2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-29

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 するオプションを追加します。

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 と設定いたしました。

docker-compose.yml
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のデータエクスプローラーから確認してみます。
CosmosDB MongoDB ローカル- データ エクスプローラー - Microsoft Azure.png
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 のタグを修正します。

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ポータルの画面からもリポジトリの中身は確認できます。

azRepo - Microsoft Azure.png
バッチリ、quarkus-quickstart/getting-startedのイメージが上がっていますね。

コンテナがデプロイされてから image を pull する際に必要なリポジトリのユーザー名、パスワードを 管理画面から確認します。
以下のアクセスキーの画面からパスワードをコピーしておきます。
azRepo - アクセス キー - Microsoft Azure.png
ユーザー名はリポジトリ名、そのままで良いのかな?

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 の管理画面からも状態を確認してみましょう。
quarkus-hello - コンテナー - Microsoft Azure.png
状態がRunningとなっています。すでに起動が完了しているようですね

3. 動作確認

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

mongodb-panache-quickstart - 1 0-SNAPSHOT.png
はい、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を開いてみます!

person 5de12fa83ebae726bc854d64.png

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

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

cosmosDB Cloud データ エクスプローラー - Microsoft Azure.png

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

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

まとめ

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

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

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

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?