Quarkusを動かしてdocker imageをAmazonECSで動かすまで


別サイト

に書いていたのだけどサ終してしまったので移行した記事その5
2019/03/16のもの

Quarkus

Javaのフレームワーク。
特徴としてはネイティブ用のバイナリを生成して起動がめっちゃ早いとかそんな

前提条件

  • Java 8以上
  • Maven 3.5.3以上

らしい

GraalVM

GraalVMをインストール
.bash_profile等に設定

export GRAALVM_HOME=[インストールフォルダ]/Contents/Home

新規プロジェクト

Quarkusの公式に従いプロジェクト作成コマンド実行

mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=getting-started \
-DclassName="org.acme.quickstart.GreetingResource" \
-Dpath="/hello"

実装

公式スタートガイドに従って作成
ソースはデフォルトでも入っているのでそのままでも動きます
公式ではAPIの追加とかこうやるんだぞみたいなのが書いてあるのでそのままやる
動かすときのコマンドを理解するのが大事ぽさ

ローカル起動

mvn compile quarkus:dev

jar作成

mvn package

jar起動

java -jar target/getting-started-1.0-SNAPSHOT-runner.jar

ネイティブバイナリ作成

mvn package -Pnative

ネイティブバイナリ起動

./target/quarkus-quickstart-runner

コンテナ作成

mvn package -Pnative -Dnative-image.docker-build=true

dockerビルド

docker build -f src/main/docker/Dockerfile -t quarkus .

run

docker run -i --rm -p 8080:8080 quarkus

ローカルでもjarでもバイナリでもdockerでも同じように動きました

$ curl http://localhost:8080/hello/greeting/quarkus
hello quarkus

AWS側へのデプロイ

dockerイメージを作成できたのでAWS ECSへのデプロイまでをやる

ECR作成

新規リポジトリの作成で「quarkus」という名前で作ってみる

イメージのpush

作成したリポジトリの「プッシュコマンドの表示」に従ってコマンド実行

aws ecr get-login --no-include-email --region ap-northeast-1

## ログインコマンドが出るのでそのまま実行

## 作成したイメージをタグ付け
docker tag quarkus:latest xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/quarkus:latest

## push
docker push xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/quarkus:latest

ECR上でpushされていれば成功

タスク作成

ECSからタスク定義作成
イメージのところにECRで定義されているものを入力して作成
DockerfileのEXPOSEをいじればいいのかもしれないがデフォルトが8080で受けるようなので
ポートマッピングは80 8080で設定する

クラスター作成

クラスターの作成を選択
EC2付きにしてインスタンスタイプやインスタンス数等を自由に選んで作成
EC2がアクティブになるまでまつ

タスク実行

タスクのタブからタスクの実行を選択して実行

少し待つとRUNNINGになる

sshでインスタンスに入って確認
80で受けて8080にマッピングされるようになってる

$ docker container ls
CONTAINER ID        IMAGE                                                       COMMAND                  CREATED             STATUS              PORTS                  NAMES
29c1fb97dc07        xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/quarkus   "./application -Dqua…"   9 seconds ago       Up 8 seconds        0.0.0.0:80->8080/tcp   ecs-quarkus-5-quarkus-e491bef2eefec1fcfc01
0187c98c619b        amazon/amazon-ecs-agent:latest                              "/agent"                 About an hour ago   Up About an hour                           ecs-agent

接続確認

ブラウザから見ると

http://[EC2のパブリックDNS]/hello/greeting/quarkus

表示された!

感想

Quarkusの起動は、あれ、もう起動してるのかという感覚になるぐらい早かった
普段Javaを使うことが多いのだけど起動が長いのはお約束だったのでかなり新鮮
ECSは作成に最初何度か手間取ったけどなんとかできてよかった
クラスターとかタスクというのがなんなのかいまいちとっつきづらかった。。。
あとはポートマッピングのところで最初は動的マッピングとかにしてたらポートがずれてて動かないってのではまったり。。。
更新するときは

  • Javaを書く
  • dockerイメージ作成
  • ECRにpush
  • ECSにタスク定義(リビジョン作成)
  • サービス更新でリビジョンを更新

という感じなのかな