JAWSUG HPC: AWS Batch x OpenFoam HandsOn

JAWSUG HPC支部　第１０回勉強会 AWS Batch x OpenFoam Hands-On
https://jawsug-hpc.connpass.com/event/61919/

元ネタ：http://qiita.com/porcaro33/items/0b6cf3e2c2a0f88fc305

OpenFoam x AWS Batch ハンズオン環境
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/7e86e369-daf6-ba89-abba-533dc26b5319.png)


# 1. Build Infrastructure
## Prerequisites
* まずはAWSにログイン https://console.aws.amazon.com/
* Oregonリージョンに移動、ログインしたユーザがEC2, S3, Batch, ECR, Cloudformation, IAM等を操作できる権限であることを確認してください。

## Create KeyPair
* Bastion Serverにアクセスするのに使用するKeyPairを作成します。
* 後ほどCloudFormationを実行するときにKeyNameを入力するのでメモしといてください。  
AWS Console -> EC2 -> Key Pairs -> Create Key Pair -> Enter key name -> Create
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/bb9f3e1a-84ed-1594-d169-2bdea08e8e0c.png)


## Run CloudFormation
* Docker Imageのビルド環境としてUbuntuサーバをAWS上にたてます。このハンズオンではCloudFormationで必要な環境を構築してしまいます。
 * VPC
 * Subnet
 * SecurityGroup
 * Bastion EC2 (Ubuntu16.06)
 * SpotFleet Role
 * AWS Batch Role
 * Batch Job Role
 * S3 Bucket
 * Container Repo  
  

* CloudFormationテンプレートをGithubからダウンロード
https://raw.githubusercontent.com/porcaro33/openfoam-docker/master/aws_batch_base.yml  


* CloudFormation -> Create New Stack -> Choose File -> Next
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/c8bb08e2-8150-5ff1-8a65-255ace142463.png)  


* Enter Stack Name, Bucket Name, KeyPair Name -> Next
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/3c724f71-5ece-8988-0024-ed0e60571d79.png)  


* Next -> checkin at "I acknowledge that AWS CloudFormation..." -> Create
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/70db024e-76fd-ddff-940a-7f274e9cfccc.png)  


* CloudFormaitonが収束したら、Outputsを見てください。ここの情報をBatch Jobを設定するスクリプト編集するときに使います。このBrowser Tabは残しておいてください。
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/9b78a554-3257-44b8-c2e8-cc59a94a7caa.png)



# 2. Docker Build and Push

## Bastion Server
* CloudFormationで作成したUbuntuサーバにログインします。お好きなssh clientでログインしてください。ユーザ名は"ubuntu"です。

```
ssh -i <path_to_keypair> ubuntu@<IP_from_CF_OUTPUT>
```

* docker-ceとawscliはインストール済みです。確認してみましょう。

```
aws --version
docker --version
```
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/fa4eb342-3612-b63b-68c9-7db0c9c1b5f1.png)


* 必要なスクリプト類はgithubからダウンロード済みです。これも確認しておきましょう。

```
cd /home/ubuntu/openfoam-docker
ll
```

![image](https://qiita-image-store.s3.amazonaws.com/0/93823/fc09edb0-8cbe-e641-b69b-39e7a7603d83.png)



## docker build/push
* Docker内でOpenFoamを実行するスクリプトに作成したBucketNameを入力します。

```
sudo vi openfoam_run.sh
```

![image](https://qiita-image-store.s3.amazonaws.com/0/93823/64325fcc-0728-9962-0d8f-cdde8c9041fa.png)


* BucketNameの編集がおわったらビルドします。

```
sudo docker build -t openfoam-batch:latest .
```

* ビルドが終わったらECRにdocker imageをpushします。
* Go to ECR

```
aws --region us-west-2 ecr get-login --no-include-email
```
* 返り値の"docker login -u AWS -p ...."をコピー、sudoを前につけて、ペーストして実行。
"Login Succeeded"と表示されたらOK。


*次はtagをつけて、pushします。

```
sudo docker tag openfoam-batch:latest <account-id>.dkr.ecr.us-west-2.amazonaws.com/openfoam-batch:latest
sudo docker push <account-id>.dkr.ecr.us-west-2.amazonaws.com/openfoam-batch:latest
```


# 3. Create Batch Environment
* Batchを実行する上で必要な、Job Definition, Compute Environment, Job Queueを作成していきます。CloudFormationのOutputsをもとに３つのjsonファイル編集して、AWSCLIを実行していきます。


## job_definition.json

```
sudo vi job_definition.json
```

* imageにはarnではなくURIを入力する必要があるので、一度ECSの画面にいってURIをコピーしてjsonに貼り付ける。
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/f4099a05-e486-8a0f-d604-e04a41137e1c.png)



## compute_environment.json

```
sudo vi computing_env.json
```

![image](https://qiita-image-store.s3.amazonaws.com/0/93823/197c5908-e65e-c9c7-f7f9-3ec7ceebfe71.png)


## job_queue.json

```
sudo vi job_queue.json
```

* 特に変更点なし、内容だけ確認してください。

* create job definition, compute enmvironment, job queueのCLI実行。それぞれ返り値を確認しながら実行してください。

```
aws --region us-west-2 batch register-job-definition --cli-input-json file://job_definition.json
aws --region us-west-2 batch create-compute-environment --cli-input-json file://computing_env.json
aws --region us-west-2 batch create-job-queue --cli-input-json file://job_queue.json
```


# 5.Submit Jobs
* これでOpenFoamを実行する環境は準備できました。最後にジョブを実行します。AWSCLIをつかって１０回ジョブを実行して、その結果をS3に保存していきます。

```
./submit_batch.sh
```

* ジョブが実行されると、BatchのDashboardで各ジョブのstatusが次々を変わっていくのが見えます。ジョブがない場合はECS Clusterのコア数を0に設定しているので、ジョブに合わせてEC2 Instanceを起動していくのも見えます。

Batch Dashboard
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/8c75d47a-561d-9958-b28c-6c95b2a92a9f.png)


EC2
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/cca9cd4e-fbdd-41b7-c383-a38337cc8169.png)

* 最後にS3にファイルが保存されているのを確認しください。

# 6.Close this environment
* Batch環境を消すには、作成とは逆の順番で消していく必要があります。
- disable/delete job queue
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/dbc6af77-85d2-9e5a-4397-22179ee94295.png)

* disable/delete compute environment
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/b1aa4d41-38c2-f34e-2450-b0477bd103ab.png)

* deregister job definition
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/1b8c1fc8-793d-b2d1-90cf-8663f9401e01.png)



Batchを消したら、S3内の結果ファイルも消してください。バケットを空にしないとCloudFormationの削除でfailします。
* delete s3 objects
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/feaff829-5337-c384-9854-81f8996c6dd9.png)

* delete container repo
![image](https://qiita-image-store.s3.amazonaws.com/0/93823/49af69d1-db30-3879-3aa2-5194df8185ea.png)

* delete cloudformation stack


fin!