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

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

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

### 前提条件
- Java 8以上
- Maven 3.5.3以上

らしい

### GraalVM
[GraalVM](https://www.graalvm.org/ "GraalVM")をインストール
.bash_profile等に設定

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

### 新規プロジェクト
[Quarkus](https://quarkus.io/ "Quarkus")の公式に従いプロジェクト作成コマンド実行

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

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

ローカル起動

```bash
mvn compile quarkus:dev
```

jar作成

```bash
mvn package
```

jar起動

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

ネイティブバイナリ作成

```bash
mvn package -Pnative
```

ネイティブバイナリ起動

```bash
./target/quarkus-quickstart-runner
```

コンテナ作成

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

dockerビルド

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

run

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

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

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


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

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

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

```bash
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で設定する

![570dbdee79d13c11f76eb76746411c12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/a5280750-b093-28d0-96ec-4f7180cf8bd8.jpeg)

![462c242304492b7be7726ee289ea0451.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/10543b8f-c1b0-3635-22f9-a87fc54d1271.jpeg)

![4b566c405019460beb9fc6ea122a3293.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/caf61a7d-2497-01fc-7c2c-58e291a222e3.jpeg)




### クラスター作成
クラスターの作成を選択
EC2付きにしてインスタンスタイプやインスタンス数等を自由に選んで作成
EC2がアクティブになるまでまつ
![a9d948c74ad61c6ba18018c1f59b8730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/4867f28e-0252-bf96-e5eb-aaca4853ac35.jpeg)


### タスク実行
タスクのタブからタスクの実行を選択して実行
![10208d5eaa7026ca42782fa2915af10d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/b02442b0-46d8-865d-c74b-5bb86de0cd3e.jpeg)


少し待つとRUNNINGになる
![670d7cf11665e5b5b8a996b5d126f51c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/ca38769f-b390-d8f1-f0cc-e80bf2b147f5.jpeg)


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

```bash
$ 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
```

![69be9989a2ab0cf1959a48784034d466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48480/2f526cfd-e496-105c-8380-425527aff091.jpeg)


表示された！

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

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

という感じなのかな