AWSの無料枠でCOVID-19解析に貢献しようとしてうまくいってない話

(自ブログに書いた記事の転載です)

# 追記: 2020/4/17
@hirosys-biz さんが、CloudFormationで環境を自動構築する手順を公開されています。本記事の「うまくいっていない」部分も解決してくださっているので、こちらも是非。
[COVID-19(SARS-CoV-2)の解析プロジェクトへの参加環境をCloudFormationで自動構築しました](https://qiita.com/hirosys-biz/items/fa19e596c3872059bf2c)

# はじめに
「新型コロナウイルスの解析に貢献しつつ、AmazonWebServiceの環境構築を実践してみよう」とした話です。
結果、「正常に動作はしたが、無料枠ではスペック不足ゆえにあまり貢献できていない」という結論になってしまいましたが、
作業の記録として、残しておきます。

# 背景
コロナ流行辛い。なんとか解決早めらんないか。

↓

「[今からでも3分ではじめられるコロナ解析貢献「Folding@home」の使い方](https://pc.watch.impress.co.jp/docs/news/1243458.html)」というPC Watchの記事を見つける

↓

即自宅ノートPC(旧世代のGPU搭載)にインストール。1週間程度走らせ続けて25タスクほどこなすが、まだ物足りない感。

↓

スペックは上げられないから、稼働台数増やしたい。でも物理マシンは1台しかもっていない...

↓

そうだAWSアカウント持ってた。これ使ってみよう。無料枠でできるなら記事化すれば真似してくれる人いるかも？

↓

行動。

# やったこと①: VPC環境の作成

VPC環境をまず構築し、その中にEC2環境を立てることにした。 
基本、[こちらのブログ記事](https://swallow-incubate.com/archives/blog/20191108/)の通りに作業。

唯一セキュリティグループだけは、今回の利用目的に合わせて以下のように変更。

* Webサービスを立てるわけではないので80番ポートはクローズ。
* 代わりに、Folding@HomeのWebコントローラ用に7396番を開放
* セキュリティ対策として22番以外のSSH用ポートを開放、初期ログイン用に22番はいったん残す。
* 今回の環境は「自分だけアクセスできればいい」ので、ソースはすべてマイIPに限定

![security.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141883/5e48a221-497e-130c-cc25-e112ce836d02.png)


## やったこと②: VPC上にEC2環境構築

①で作ったVPC環境上に、EC2環境を作成。この作業も[こちらのブログ記事](https://swallow-incubate.com/archives/blog/20191127/)を参考にした。

今回は無料利用枠で作れる環境にしたかったので、構成は以下の通り

* OS: Amazon Linux 2 AMI(x86)
* インスタンスタイプ:t2.micro
* ストレージ: 汎用SSD 8GB

# やったこと③: Linuxの設定

* SSHのポート番号変更

```
$ sudo vi /etc/ssh/sshd_config

### 22行あたりに以下を追加(①で指定したポート番号)
Port 2****

### 保存後
$ sudo service sshd reload
```

* EC2作成時とは別のRSA鍵でアカウントを作り、デフォルトの"ec2-user"削除

```
### ユーザ新規作成(root権限)
# useradd newuser
# passwd newuser

### SSH設定(root権限)
# cd /home/newuser/
# mkdir .ssh
# chmod 700 .ssh
# chown newuser:newuser .ssh
### ここで公開鍵をSCPで送信
# mv /home/ec2-user/id_rsa.pub .ssh/authorized_keys
# chmod 600 .ssh/authorized_keys
# chown newuser:newuser .ssh/authorized_keys

### sudoできる権限を与える
# usermod -aG wheel newuser

### 別窓で"newuser"としてログイン。以降newuser側の画面で操作
$ sudo su -
### rootになれることを確認したら、ec2-user削除
# userdel ec2-user
```

# やったこと④: Folding@Homeの導入

今回は、最低限必要な`FAHClient`のみ導入。

* インストール
* 
```
$ wget https://download.foldingathome.org/releases/public/release/fahclient/centos-6.7-64bit/v7.6/fahclient-7.6.9-1.x86_64.rpm
$ sudo rpm -i --nodeps fahclient-7.6.9-1.x86_64.rpm
```

* 設定
  * `/etc/fahclient/config.xml`を編集。更新にはroot権限必須。

```xml
<config>
  <!-- Client Control -->
  <fold-anon v='true'/>

  <!-- Folding Slot Configuration -->
  <!-- v7.6.9-1以降、causeにCOVID-19を指定すれば、コロナ関連タスクを優先的にアサインしてくれるようになる -->
  <cause v='COVID_19'/>
  <gpu v='false'/>

  <!-- Webコントローラへのアクセス権限設定。xxx.xxx.xxx.xxxのところに自分のIPアドレスを記入 -->
  <allow>127.0.0.1 xxx.xxx.xxx.xxx</allow>
  <web-allow>127.0.0.1 xxx.xxx.xxx.xxx</web-allow>

  <!-- どの程度CPU資源を利用するか。light,middle,fullの3択 -->
  <power v='full'/>

  <!-- User Information -->
  <!-- ユーザ情報。ユーザ名を入れておけば個人でどれだけ貢献したか集計される -->
  <user v='deflat'/>
  <!-- 所属したいチームのID。省略可。ちなみに222は"Japan"チーム。 -->
  <team v='222'/>
  <!-- 省略可。公式サイトでメールアドレスを登録して受け取ったキーを設定するともらえるポイントが多くなる -->
  <passkey v='***ここにキーを張り付け***'/>

  <!-- スロット番号とタイプ。今回はCPU1個しかないのでいじらない -->
  <!-- Folding Slots -->
  <slot id='0' type='CPU'/>

</config>
```

* 設定反映&サービス再起動
  * タスク処理中にstopしても、次startしたときはちゃんと続きから計算してくれる。

```
$ sudo /etc/init.d/FAHClient stop
$ sudo /etc/init.d/FAHClient start
```

# 結果
* Webブラウザで`http://<EC2環境のIPアドレス>:7396`にアクセスすると、下記のようにちゃんと動いているのが見える。 ...が、**めちゃくちゃ処理が遅い**
  * 画像は処理開始から24時間ほどたったときのもの。個人持ちのノートPCでも、このくらいなら3~4時間で終わるはず。
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141883/88a14169-cf3f-a5ef-a64f-6e5810de7126.png)


## 後から調べて分かったこと

* EC2のt2インスタンスには、「CPUクレジット残高」という概念があり、これが枯れている状態だと使えるCPU資源が限定される。
  * 今回使用したt2-microだと、CPU使用率10%にしかならないのだとか。
  * インスタンス自体の停止→起動をすれば初期クレジットまで回復するそうなので、今後検討してみる。
    * [参考](http://tagvote.grinspace.jp/aws%E3%81%AEt2-micro%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%EF%BC%88%E3%81%8A%E3%81%95%E3%82%89%E3%81%84%EF%BC%89/)

# まとめと感想
* 「新型コロナウイルスの解析に貢献しつつ、AmazonWebServiceの環境構築を実践してみよう」とした話。
  * 初めてやる自分でも、全行程完了まで2~3時間で行けた。先人の皆様ありがとうございます。
* 今後、上記にもあった「インスタンスの停止→起動によるクレジット回復」を定期実行する方法も試してみたい
* 加えて、ほかのIaaSサービスでも同様のことを試してみたい。

# 更新履歴
* 2020/4/20: FAHClient最新版(Ver7.6.9-1)に対応