Fargateで自作したコンテナイメージを動かしてみる

## 概要
[Kotlin+Spring Boot+WebFluxをDockerで動かしてみる](https://qiita.com/yumatsud/items/330fc8a8fd3ddb88b830)で作成したイメージを、Fargateで動かしてみるまでをやってみます

## やったこと
* 作成したイメージをAmazon ECRにpushできるようにする
* Amazon ECRにPushしたイメージを利用して、Fargateを構築してみる

## ここに記載しないこと
VPCやセキュリティグループなどの設定(ある程度自動で作成されるものを利用します)

## Amazon ECR
コンソール上から画面に記載の手順通りに実施していきます

①コンソール上から手順通り進める
<img width="1395" alt="ecr1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/c7349a35-d961-3433-b2ae-fc5374aa6865.png">

②リポジトリ名を決める
<img width="1316" alt="ecr2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/457a9464-cbe8-eaed-ee07-bbaa02f9cb04.png">

③指定コマンド通り打って、イメージをECRにPushする
<img width="1302" alt="ecr3.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/7b448c9a-1e57-9a16-b899-7e8dfd1af113.png">

ここでは `aws` コマンドや `docker` コマンドも必要になるので、
もしインストールしていない場合は、コンソールのヘルプにあるリンクからそれぞれ設定する。

### 引っかかりポイント
awsコマンドを今まで使っていなかった人は、一番最初のコマンドで下記のような設定が出るかもしれません。

```shell
$ (aws ecr get-login --no-include-email --region ap-northeast-1)

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: 
The security token included in the request is invalid.
```

その時は、[AWS CLIのインストールから初期設定メモ](https://qiita.com/n0bisuke/items/1ea245318283fa118f4a)の設定をしつつ、
下記コマンドで設定情報の実施をしてみると良いかもしれません。

```shell
$ aws configure
AWS Access Key ID [****************THGQ]: hogehoge
AWS Secret Access Key [****************RPwv]: hogehoge
Default region name [us-west-2]: ap-northeast-1
Default output format [json]: 
```

### 実際のコマンド実施例
①レジストリに対してDockerクライアントを認証するために使用するログインコマンドを取得

```shell
$ (aws ecr get-login --no-include-email --region ap-northeast-1)
docker login -u AWS -p XXXXX〜
```

②①で取得したコマンドでログインする

```shell
$ docker login -u AWS -p XXXXX〜
・・・・・・
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
```

③イメージを作成

```shell
$ docker build --no-cache -t <<hogehoge/hogehoge>> .
Sending build context to Docker daemon    598kB
Step 1/8 : FROM openjdk:8-jdk-alpine
・・・・・・・
Successfully built ca4c385b2257
Successfully tagged hogehoge/hogehoge:latest
```

④タグ付け (作成したリポジトリに対してタグ付け)

```shell
$ docker tag hogehoge/hogehoge:latest hogehoge.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/hogehoge:latest
```

⑤イメージをpush

```shell
$ docker push hogehoge.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/hogehoge:latest
```

あとはコンソール上で、「完了」ボタンを押すとイメージの管理画面でpushしたイメージを確認できる。
<img width="1402" alt="ecr4.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/b59a8abc-621f-dfbb-bd17-30eea7ab05fb.png">


## Amazon Fargate
コンソール上から上記で設定したイメージを動かしてみる。

### コンテナとタスクの定義

#### コンテナの定義
ここでは、customの定義を利用してみます。
<img width="1045" alt="fargate1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/fcc1c4e8-feaa-ec3a-13bc-fc981affcd5b.png">

まずはスタンダードの定義で、コンテナ名(自由にネーミング可能)と、イメージを設定します。
イメージは、上記で設定したECRのリポジトリURIを指定します。
<img width="949" alt="fargate2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/50bfcba8-3cd1-926d-63ef-806a10b8fec5.png">
メモリはアプリケーションのサイズに応じて、ポートマッピングはコンテナのマッピング先を設定しておきます。

あとは、CPUユニット数を設定しておきます。
<img width="949" alt="fargate3.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/51c15856-4c92-1c85-7b35-3c86d037cd34.png">

他にも、Health checkの設定や環境変数の設定などをできますが今回は割愛します。

#### タスクの定義
今回は何も考えずにデフォルトの設定で試してみます。
→ただし、下記の図だとクラスタCPUが1vCPUだと失敗するので、0.5vCPUにすること＞＜
<img width="1073" alt="fargate4.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/6afb6f90-8a42-9351-3b5f-4ab489da030e.png">

### サービスの定義
ここでは必要なタスクを2つに設定し、ロードバランサをALBを選択してみます。
<img width="1084" alt="fargate5.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/a24668ee-06b2-35d9-a6e0-981c93e05aa8.png">

本来、セキュリティグループやALBは適切な設定をすべきですが、
今回はお試しということもあり、自動生成されるものを使います。
特にセキュリティグループは外部からのアクセスなどがオープンになっているので注意が必要です＞＜

### クラスタの設定
クラスタ名を設定してあげるのみ。
<img width="1025" alt="fargate7.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/59aa3dcd-d6b3-b78c-0c3d-48322f94527a.png">


## 確認
これまでに設定した内容を最後に確認して、「作成」ボタンを押せば作成が始まります。
<img width="1342" alt="fargate8.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/00748f15-db47-4e2f-b815-5cde52c32dff.png">

しばらく経つと下記のようになっていれば成功。
<img width="1337" alt="スクリーンショット 2018-09-26 14.08.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/71637/a00b6d13-34dd-3e0a-675f-035024d0c940.png">

そして作成された環境にアクセスしてみて意図通りの内容が表示されていれば無事成功！！

```shell
$ curl http://<<該当ALB>>:8080/       
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Kotlin, Spring Boot2, WebFlux</title>
</head>
<body>
<p>Hello! Kotlin, Sprint Boot2, WebFlux</p>
</body>
</html>

$ curl http://<<該当ALB>>:8080/v1/demo
{"message":"hello kotlin"}
```

## 感想
基本的にはコンソール上で全て実施できる(正確には始めてみる)のはすごく楽。
ただし、Fargate以外の設定(ALBやセキュリティグループなど)は個別にやった上で、
それをFargateに反映をしてあげるのが良さそうで、
あとはこの設定を何度もしなくて良いように、terraformなどでコード化しておくのはすごく意義があると感じましたmm