[JAWS-UG HPC] CfnCluster ハンズオン


0. 事前準備
=======================


0.1 Amazon Linux (作業環境)を準備する
-------------------------------------------

CnfClusterをインストールする環境を構築します

- http://qiita.com/daikumatan/private/3554bb6dd6452321ff71



1. CfnClusterのインストール
==============================

起動した Amazon Linux にCfnClusterをインストールします。 

1.1 ログイン
------------------

上記 0.2 で起動したAmazon Linux にログインしていることを確認します。
ログインしていれば 1.2 へ進みます。

まだログインできていなければ、下記の「Windowsの場合」もしくは 「Mac or Linuxの場合」を参照してください。

- http://qiita.com/porcaro33/private/def84bac6ae31cc75790


1.2 CfnClusterのインストール
----------------------------

Amazon Linux上に、CfnClusterをインストールします。


```bash:インストール
sudo /usr/bin/pip install --upgrade cfncluster
```

これでインストールは完了です。

2. configファイルの設定
======================

対話形式でも作成できますが、今回は見通しを良くするため、configファイルをCLI使ってゼロベースから作ります。

流れとしては

- shellでパラメータ決定
- ヒアドキュメントでconfigファイル生成

です。

2.1 クラスタ起動条件の決定
--------------------


```bash:configのパラメータ決定
CLUSTER_NAME="handson"
REGION="ap-northeast-1"
MASTER_INSTANCE_TYPE="t2.micro"
WORKER_INSTANCE_TYPE="t2.micro"
MOUNT_POINT="/share"
VOLUME_SIZE="16"
INIT_SIZE="1"
MAX_SIZE="4"
```

`INIT_SIZE` は、最小Workerノード数, `MAX_SIZE` は、最大のWokerノード数です。

2.2 VPCとサブネットの決定
-------------------

今回は簡単のためにデフォルトVPCとそれに紐づくサブネットを指定してください。
マネージメントコンソール上から確認できます。

```comment:VPC_IDの確認方法
画面左上 `サービス` > `VPC` を選択 > 画面左 `VPC` をクリック > デフォルト VPC が "はい" の VPC ID (vpc-XXXXXXXX) をメモ
```

```comment:サブネット_IDの確認方法
画面左上 `サービス` > `VPC` を選択 > 画面左 `サブネット` をクリック > VPC が 上記 vpc-XXXXXXXXを持つサブネットID (subnet-XXXXXXX)をメモ

note: 2つあると思いますがどちらでも可です(AbailabilityZoneの違い)。
```

```bash:デフォルトVPCの決定
VPC_ID="vpc-XXXXXXXX"
```

```bash:サブネットIDの決定
SUBNET_ID="subnet-XXXXXXXX"
```

2.3 クレデンシャル情報の決定
---------------------

クレデンシャル情報を決定します。先ほどダウンロードした csv ファイルを参照し入力してください。

```bash:クレデンシャル情報の設定
ACCESS_KEY='<Access Key Id>'
SECRET_KEY='<Secret Access Key>'`
```

もしくは下記でもOKです ("0. 事前準備"からスタートしている場合に限る)。


```bash:クレデンシャル情報の抽出
ACCESS_KEY=`cat ~/.aws/credentials | grep aws_access_key_id | \
cut -d "=" -f2`
SECRET_KEY=`cat ~/.aws/credentials | grep aws_secret_access_key | \
cut -d "=" -f2`
```


2.4 KeyPairの作成(クラスタへのログインで使用)
------------------------------------

今回はクラスタ用に別の鍵をAWS-CLIから作ってみます。
(本ハンズオンで Windows User 用に WinSCP 使うのは大変なため、汎用性をとった)

```bash:key名の決定
EC2_KEY_NAME="CfnClusterKeyPair"-`date +"%Y-%m-%d-%H%M"` && echo ${EC2_KEY_NAME}
```

```bash:keyの保存先の決定
FILE_SSH_KEY="${HOME}/.ssh/${EC2_KEY_NAME}.pem" && echo ${FILE_SSH_KEY}
```

```bash:Keyの作成
aws ec2 create-key-pair \
  --key-name ${EC2_KEY_NAME} \
  --query 'KeyMaterial' \
  --output text \
  > ${FILE_SSH_KEY} \
  && cat ${FILE_SSH_KEY} \
  && chmod 400 ${FILE_SSH_KEY}
```



2.5 configファイルの作成
-------------------

```bash:変数の確認
cat << ETX
${CLUSTER_NAME}
${ACCESS_KEY}
${SECRET_KEY}
${REGION}
${EC2_KEY_NAME}
${VPC_ID}
${SUBNET_ID}
${MOUNT_POINT}
ETX
```

```bash:configファイル作成
mkdir ~/.cfncluster/
cat << EOF > ~/.cfncluster/config
[aws]
aws_region_name = ${REGION}
aws_access_key_id = ${ACCESS_KEY}
aws_secret_access_key = ${SECRET_KEY}

[cluster ${CLUSTER_NAME}]
vpc_settings = public
key_name = ${EC2_KEY_NAME}
master_instance_type = ${MASTER_INSTANCE_TYPE}
compute_instance_type = ${WORKER_INSTANCE_TYPE}
shared_dir = ${MOUNT_POINT}
initial_queue_size = ${INIT_SIZE}
max_queue_size = ${MAX_SIZE}
ebs_settings = custom

[ebs custom]
#ebs_snapshot_id = ${SNAPSHOT_ID}
volume_size = ${VOLUME_SIZE}

[vpc public]
master_subnet_id = ${SUBNET_ID}
vpc_id = ${VPC_ID}

[global]
update_check = true
sanity_check = true
cluster_template = ${CLUSTER_NAME}
EOF
cat ~/.cfncluster/config
```

3. CfnClusterによるクラスタの構築
============================

3.1 クラスタの構築
-------------

```bash:クラスタ名の決定
MY_CLUSTER="jawscluster"
```

```bash:クラスタの動的構築
cfncluster create ${MY_CLUSTER}
```

```bash:結果例
Starting: jawscluster
Status: cfncluster-jawscluster - CREATE_COMPLETE
Output:"MasterPrivateIP"="XXX.XXX.XXX.XXX"
Output:"MasterPublicIP"="YYY.YYY.YYY.YYY"
Output:"GangliaPrivateURL"="http://XXX.XXX.XXX.XXX/ganglia/"
Output:"GangliaPublicURL"="http://YYY.YYY.YYY.YYY/ganglia/"
```

ブラウザに、上記の GangliaPublicURL を入れて、Gangliaの画面も確認してみましょう！

3.2 クラスタへのログイン
-----------------

```bash:マスターノードのIPアドレスの決定
IP='<MasterのPublicIP>'
```

```bash:Masterノードへのログイン
ssh -i ~/.ssh/${EC2_KEY_NAME}.pem ec2-user@${IP}
```

3.3 計算ノードの確認
-----------------

```bash:ノードの確認
qhost
```

```bash:結果例
HOSTNAME                ARCH         NCPU NSOC NCOR NTHR  LOAD  MEMTOT  MEMUSE  SWAPTO  SWAPUS
----------------------------------------------------------------------------------------------
global                  -               -    -    -    -     -       -       -       -       -
ip-172-31-4-126         lx-amd64        1    1    1    1  0.00  994.8M   98.3M 1024.0M     0.0
```

4. Hello worldの実行
=================

4.1 テストスクリプトの作成
------------------------

```bash:保存先の決定
DIR=${HOME}/helloworld
mkdir ${DIR}
cd ${DIR}
```

```bash:HelloWorld
cat << EOF > hellowJob1.sh
#!/bin/bash
sleep 120
echo "Hello World from \$(hostname)"
EOF

cat << EOF > hellowJob2.sh
#!/bin/bash
sleep 120
echo "Hello World from \$(hostname)"
EOF

cat << EOF > hellowJob3.sh
#!/bin/bash
sleep 120
echo "Hello World from \$(hostname)"
EOF

cat << EOF > hellowJob4.sh
#!/bin/bash
sleep 120
echo "Hello World from \$(hostname)"
EOF

cat << EOF > hellowJob5.sh
#!/bin/bash
sleep 120
echo "Hello World from \$(hostname)"
EOF

cat << EOF > hellowJob6.sh
#!/bin/bash
sleep 120
echo "Hello World from \$(hostname)"
EOF
```

4.2 ジョブの投入
-----------

```bash:複数のジョブの投入と確認
qsub hellowJob1.sh
sleep 2
qsub hellowJob2.sh
sleep 2
qsub hellowJob3.sh
sleep 2
qsub hellowJob4.sh
sleep 2
qsub hellowJob5.sh
sleep 2
qsub hellowJob6.sh
sleep 2
```

```bash:ジョブの確認
qstat
```

```bash:結果例
job-ID  prior   name       user         state submit/start at     queue                          slots ja-task-ID 
-----------------------------------------------------------------------------------------------------------------
      1 0.55500 hellowJob1 ec2-user     r     01/19/2016 18:02:50 all.q@ip-172-31-4-126.ap-north     1        
      2 0.55500 hellowJob2 ec2-user     qw    01/19/2016 18:02:41                                    1        
      3 0.55500 hellowJob3 ec2-user     qw    01/19/2016 18:02:43                                    1        
      4 0.55500 hellowJob4 ec2-user     qw    01/19/2016 18:02:45                                    1        
      5 0.55500 hellowJob5 ec2-user     qw    01/19/2016 18:02:47                                    1        
      6 0.55500 hellowJob6 ec2-user     qw    01/19/2016 18:02:49                                    1        
```

4.3 EC2インスタンスの確認
---------------------

マネージメントコンソール上から、ジョブ待ち応じてcomputeノードが自動的に増えて行く様子を確認します。

5. 後始末
================

5.1 クラスタ環境の削除
--------------------

```bash:Masterからのログアウト
exit
```

```bash:クラスタの削除
cfncluster delete ${MY_CLUSTER}
```

```bash:結果例
Deleting: jawscluster
Status: DynamoDBTable - DELETE_COMPLETE
Stack with id cfncluster-jawscluster does not exist
```

トラブル等で消せない場合は、マネージメントコンソールから、CloudFormationのサービスに行って、直接 Delete Stack を実行してください。

5.2 CfnClusterをインストールしたAmazon Linuxのterminate
-----------------------------------------------------

マネージメントコンソール上から操作します

```マネージメントコンソール
サービス > EC2 > インスタンス > CfnClusterをインストールした "Amazon Linux" を選択 > アクション > 起動の状態 > 削除
```


IAM設定の削除
------------

- 必要あれば、IAMユーザ、Groupを削除してください