COVID-19(SARS-CoV-2)の解析プロジェクトへの参加環境を AWS Fargate で構築してみました。

前回は、CloudFormation で解析環境を構築しました。
https://qiita.com/hirosys-biz/items/fa19e596c3872059bf2c

今回は、コンテナの勉強もかねて AWS Fargate を利用して構築してみました。
思いの外簡単にできてびっくりしました。

## こんな方にお勧めです
* Amazon ECS や AWS Fargate が好きだ！
* コンテナ技術を使って新型コロナウイルスの解析に貢献したい！


## では、さっそく始めましょう
### Amazon ECS の利用開始する
今まで、Amazon ECS を未使用の場合は以下のような画面が表示されると思います。
[いますぐ始める]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/10f35afb-4944-d774-d067-4bbbd90b33d1.png)

### コンテナを定義する
**custom** のエリアにある[設定]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/2aef9d79-4680-7034-371a-e6e9b0f12151.png)

#### スタンダードの設定
以下のように設定します。

* コンテナ名
 * 任意のコンテナ名を指定します。本稿では「**folding-at-home-ecs**」としました。 
* イメージ
 * コンテナイメージを指定します。今回は、[john k tims さん](https://hub.docker.com/r/johnktims/folding-at-home)が作成されたイメージ[**johnktims/folding-at-home**] を指定します。
* ポートマッピング
 * Folding＠Home で使用するポート番号 7396 tcp を指定します。

このような設定になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/d273e638-74e6-24e8-7144-83945e785d83.png)

つづけて、詳細コンテナ設定を行います。
画面をスクロールさせ、オープナーを開いてください。
 
#### 詳細コンテナ設定
動かすだけであれば、**環境**の箇所を設定すればOKです。
必要に応じてその他の場所も確認してください。

* CPU ユニット数
 * 1024 で 1vCPU となります。1024 以上かつ 4096 以下の任意の値とすればよいでしょう。
 * Folding＠Home は CPU (と GPU)がものを言いますので、本稿では後述する タスク CPU の最大値である 4096 を指定しました。
* コマンド
 * コンテナに与えるコマンドを指定します。こちらの一番下[Start folding]を参考にしました。
 * --user ユーザー名。本稿の例では標準指定であり匿名を意味する Anonymous としています。
 * --team チームの ID 。222 は 日本(japan) の ID です
 * --power は 解析に使用する CPU パワーをどのくらいにするかの指定です。 full、middle, light があります。
 * Amazon ECS では、スペースではなく、以下のようにカンマ区切りで指定します。

```sh
--user=Anonymous,--team=222,--power=full
```

設定例は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/046bbd12-a797-a18f-eae5-b859c302cd37.png)

つづいて、このコンテナを使うタスクの定義を行います。

### タスクを定義する
タスク定義のエリアにある[編集]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/2d3b0a9b-8ac3-fc50-b79e-afbbdbf13589.png)
※詳細コンテナ設定の CPU ユニット数の指定が タスク CPU の標準値より大きいため警告メッセージが表示されています。

タスクメモリならびにタスク CPU の値を設定します。
今回の例では、 コンテナ詳細設定の CPU ユニット数を 4096 としているため、以下のような設定なっています。適宜調整してください。

* タスクメモリ：8GB (8192)
 * タスク CPU を 4 vCPU (4096) を選択すると タスクメモリの最低値が 8GB (8192) となります。 
* タスク CPU：4 vCPU (4096)

設定例は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/044fa0ff-c191-f605-ce0b-13d90286a244.png)

タスク定義が完了したら、[次]ボタンをクリックします。

### サービスを定義する
サービスを定義するために、[編集]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/6671367a-b0a4-33ea-7f53-1d1db9f9771d.png)

必要なタスクの数とセキュリティグループの指定を行います。
必要に応じてサービス名を指定してください。Folding＠Home で解析を行う際、ロードバランサーは不要です。

* 必要なタスク数
 * いくつ同時実行するか(解析を何並列で行うか)を指定します。
 * 以下の画像では 1 となっていますが、5 を指定しました。好きな数を指定してください。
* セキュリティグループ
 * 前回の記事の[事前準備](https://qiita.com/hirosys-biz/items/fa19e596c3872059bf2c#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%85%83-ip-%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E7%A2%BA%E8%AA%8D)記載の方法でアクセス元 IP アドレスを確認し指定することで、不要なアクセスを防ぐことができます。 

設定例は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/4909ec32-c444-be90-e3bb-19cfc0e3ef8c.png)

サービス定義が完了したら、[次]ボタンをクリックします。

### クラスターの設定
特に設定する箇所はありません。[次]ボタンをクリックして進んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/f4736763-6710-ddf7-91ba-53f29d77c857.png)

### 確認
設定した内容を確認します。
問題なければ、[作成]ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/f8ca6182-6853-3c2e-c36a-49791d3ec513.png)

### 構築実施
自動的に環境構築が始まります。完了するまで少し待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/549e6e9e-629f-c6b7-56e6-6863017b0ad6.png)

構築が完了すると、[サービスの表示]ボタンが活性化されますのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/391e6f81-11c3-1009-b599-19385abf1de1.png)

## 動作確認
下記の赤枠で囲った箇所の「必要数」と「実行中の数」がサービスの定義で指定した「タスクの数」のとおりになるまで待ちます。
そして、緑枠で囲んだ[タスク]タブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/de6454b5-b366-ac5b-addd-eb840eec07df.png)

タスクのステータスが「RUNNING」になっていることを確認し、任意のタスクのリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/e91ae172-2f60-ec1b-766c-2c64ac2c0e0c.png)

そして、パブリック IP の値を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/a9d1d712-3917-a417-367e-a5dc562aa3f2.png)


確認した IP アドレスにポート番号7396(例：111.222.333.444:7396 ※あり得ないアドレスです)を付与して、Web ブラウザで開きます。
以下のような表示がされれば動作確認成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/f6d31650-9486-a9ae-9720-c634b547ce8a.png)

## 結果
タスク数5個で1日程度回した結果は、 15,889 ポイントでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/e225f2bf-46f5-024c-ae1a-87d0b3dc9e7f.png)
※使用料はざっくり 25ドル程度/日。

## まとめ
使用するコンテナイメージとコマンド、必要なCPU数、並列数(タスク数)を指定するだけで簡単に解析環境が構築できてしまいました。
時間をかけて CloudFormation のテンプレートを何百行も書かなくとも並列解析環境が作れてしまったので、感動を覚えています。
今後も使いどころや他のコンテナサービス含めて学び、得た知見を共有していいけたらと思います。

## 参考資料
https://hub.docker.com/r/johnktims/folding-at-home
https://qiita.com/aqr_w/items/57834c89ded1d8c7d20c
https://qiita.com/jey0taka/items/24c5590ae9cb2b66d383