[Fargate 入門] ECS(Fargate)でrakeタスクを実行するまで

Fargateで単純なrakeタスクを実行するまでの手順。
タスク定義やコンテナの設定などがややこしかったため備忘録として。

# 準備
実行するrakeタスクとコンテナイメージを用意します。
## rakeタスクの作成
今回はrakeタスク実行が確認できれば良いので単純なタスクを用意。

```ruby
namespace :ecs_task do
  task :hoge do
    puts "task started"
  end
end
```

## コンテナイメージの用意
以下のようなDockerfileを作成し、rakeタスクが実行できる環境を用意します。

```dockerfile:Dockerfile
FROM ruby:2.5.3

# 環境変数
ENV LANG C.UTF-8
ENV APP_ROOT /app

# ソースをコンテナに転送
ADD ./ $APP_ROOT

# コンテナ内の作業ディレクトリの設定
WORKDIR $APP_ROOT

# gemのインストール
RUN gem update bundler
RUN bundle install
```

### コンテナイメージをECRへプッシュする
Fargateでタスクを実行するためにDockerfileからイメージを作成してECRにプッシュします。
(Docker Hubでも良いですが今回はECRを利用)

マネジメントコンソールからリポジトリを作成しましょう。
下記のようにリポジトリが作成されたらOKです。
![repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/f5c74524-06e4-fa35-7db0-5bc37909e964.png)
プッシュコマンドの表示を押すと、ECRへイメージをプッシュする手順が表示されるので、手順にしたがってプッシュします。
プッシュ後、下記のようにイメージが存在すればOKです。
![ecr image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/06b655a8-41e2-2dfc-29ba-89602b3094fa.png)

準備は完了したので、ECSでクラスターとタスク定義を作成していきましょう。

# ECS
マネジメントコンソール上でクラスターとタスク定義を作成していきます。
## クラスターの作成
ECS > クラスターからクラスターを作成します。
今回はFargateを利用するので、ネットワーキングのみ(AWS Fargateを使用)を選択。
![cluster template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/d2bcf0c4-c1aa-ad2d-9355-0521892b200d.png)

クラスターの名前を入れて作成。
今回は既存のVPCを利用するのでVPCは作成しませんでした。
![cluster setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/4d25178a-e8e4-a9de-2230-cd56c9e23c60.png)
これでクラスター作成は完了しました。

## タスク定義の作成
次にクラスターで実行させるタスクを作成していきます。
起動タイプの互換性の選択で、こちらもFargateを選択します。

### タスクとコンテナの設定
次にタスクとコンテナの設定をしていきます。
![task1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/71a70628-f70d-2d3d-05ee-5f85c9f6fcd5.png)

#### タスクロール
タスクを実行するコンテナに付与するIAMロールです。タスクでS3やRDSなどAWSサービスにアクセスする必要がある場合は、必要な権限を持ったロールを設定します。
今回は不要なのでスキップ。

#### タスクの実行IAMロール
タスクを実行(開始)するために必要なロールです。
説明にもありますが、コンテナイメージをECRからプルしたり、コンテナのログをCloudWatch Logsに吐き出すための権限を持ったロールが必要になります。

![run_task_role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/73614082-a27d-aa8d-1dc7-f1a3219c357d.png)
初回は`新しいロールの作成`で自動的に必要なロールを作成してくれるのでこのままでOK。

#### タスクサイズ
タスクの実行に使用されるメモリとCPUを設定します。(Fargateでは必須)
ひとまず最小限のメモリとCPUを設定しました。
![task_size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/000d3bd2-0ea9-d6c4-5aff-dca55c23a569.png)

## コンテナの設定
タスク実行に必要なコンテナの設定をします。

### 基本設定
![container_standard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/c23eb6a0-f6ed-544f-3fb4-b973b2dbab58.png)

|スタンダード(基本設定)||
|---|---|
|コンテナ名|コンテナの名前|
|イメージ|コンテナのURI（ECRからコピーできます）|
|プライベートレジストリの認証|プライベートのリポジトリからイメージをプルする場合に必要（ECRを利用する場合は不要）|
|メモリ制限(MiB)|コンテナに対するメモリの制限ですが、Fargateではタスクに対してサイズを設定しているので、コンテナで制限をかける意味はよくわかっていません。|
|ポートマッピング|コンテナのポートとホストインスタンスのポートを紐づける場合に設定します。<br>今回は単純なrake実行のみなので使用しません。|

### 環境
コンテナ環境で実行したいコマンドと作業ディレクトリを以下のように指定。
![container_env.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/0861b6a1-00f1-c197-9c6d-f76bd132ff2d.png)

### その他
ヘルスチェックやネットワークの設定などがありますが今回は使用しないので入力する必要はありません。

以上でタスク定義の設定は終了です。

## タスクの実行
さっそくタスクを実行していきましょう。

タスクにチェックを入れてタスクの実行をクリック。
![start_task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/07379111-68fa-0b27-ee4b-2c7c454fd5d5.png)

タスク実行時の設定を入力していきます。
起動タイプはFARGATE、タスクを実行するVPCやサブネットなどを入力し、タスクの実行をクリック。
![run_task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/ff017d8b-5788-ca09-7e41-18cbe77f4550.png)

タスクのプロビジョニングが開始されます。
![task_provisioning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/ad4a2f89-9e5e-67c0-0191-ce399d344793.png)

しばらく待っているとRUNNINGに。
![task_running.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/4d40c15c-7bf1-d8e6-43a6-4393c51c84a6.png)

### ログの確認
ちゃんとタスクが実行されているかログを確認してみましょう。
タスクの実行ログはデフォルトではCloudWatch Logsに吐き出されます。

ロググループに`/ecs/タスク名`が作成されていますのでクリック。
タスクが実行されたことがわかりました。
![log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532805/52097912-9ff1-1df8-d738-b3568a121c31.png)


# 所感
初めてECSを触ったということもありますが、色々設定することが多く初めは手間取りました。
タスク定義(コンテナ周り)など、まだまだ今回使っていない設定項目は多数あるので、今後調べていきます。
また今回は１コンテナ、単純なrakeタスクの実行しかしていないので、複数コンテナの連携(フロント、バックエンド、DB)などをECSで行ってみようと思います。