[JAWS-UG HPC] #1 AWS CLI で CAELinux(ami-65816465)を立ち上げる


今回のハンズオンで X2Go および、OpenFOAM を除く、マネージメントコンソールの作業を aws cli で実現すると下記のようになります。確認がまだ甘いので、何かあればご連絡を！

`ami-65816465`によるインスタンスは __同一リージョン上に1つしかない__ ことを想定して、本資料を作成しております


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


0.1 AWS CLI 環境のインストール(AWS CLI 環境がない人のみ)
---------------------------------------------------

JAWS-UG CLI のページが参考になります。このページの "JAWS-UG CLIハンズオンの事前準備"を実施してください。

http://qiita.com/tcsh/items/14c3278f69ab073afe0f

jqもインストールしておいてください。

0.2 AWS CLIのバージョン確認
--------------------------

- 今回は以下のバージョンで動作確認済みです
	- AWS CLI 1.8.5

```bash:command
aws --version
```

```bash:結果
aws-cli/1.8.5 Python/2.7.10 Darwin/14.5.0
```

0.3 リージョンの決定
------------------

```bash:command
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.4 変数の確認
------------

下記コマンドを実行し、想定されるプロファイル(アクセスキー、シークレットキー、リージョン)となっていることを確認します。

```bash:command
aws configure list
```

```bash:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************DZGQ shared-credentials-file    
secret_key     ****************SkuR shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

1. CAELinuxをEC2で起動してみよう！
=================================





1.1 CAELinuxのAMIの決定
----------------------

下記は東京リージョン(ap-northeast-1)のみ有効です

```bash:変数の決定
AMI=ami-65816465
```

1.2 InstanceTypeの決定
--------------------

```bash:変数の決定
INSTANCE_TYPE=c4.xlarge
```

1.3 セキュリティグループの決定
---------------------------

これを指定しないと、defaultのセキュリティーグループがつきますが、sshできない設定になっており、ログインできません。必ずやりましょう。

以下のURLの、セキュリティグループ "ec2-ssh-global-inbound" を作成してださい。　
http://qiita.com/tcsh/items/77f8c9887634fd67f4d8

下記のコマンドを実行し、"ec2-ssh-global-inbound" があることを確認します。

```bash:command
aws ec2 describe-security-groups \
  --query 'SecurityGroups[].GroupName'
```

利用するセキュリティグループ名を指定します。

```bash:変数の設定
VPC_SG_NAME='ec2-ssh-global-inbound'
```

セキュリティグループのIDを取得します。

```bash:command
VPC_SG_ID=$( \
  aws ec2 describe-security-groups \
    --filter Name=group-name,Values=${VPC_SG_NAME} \
    --query 'SecurityGroups[].GroupId' \
    --output text \
) \
  && echo ${VPC_SG_ID}
```

結果(例)

```bash:command
sg-xxxxxxxx
```



1.4 KeyPairの決定
------------------------------------

キーペアを決めます。キーペアを始めて作る場合は[こちら](http://qiita.com/tcsh/items/59303d9506ca7d13f744)を参考に作成してください。1.1からの作業で大丈夫だと思います。


```bash:command
KEY='<あらかじめ作成したkeyPair名>'
```


1.5 インスタンスの起動
-----------------------

インスタンスを起動します。
いろいろ詳細に設定したければ、[こちら](http://qiita.com/tcsh/items/ae8f1f0d706237327c5a) が参考になります。

```bash:変数の確認
cat << ETX

image-id: ${AMI}
instance-type: ${INSTANCE_TYPE}
key-name: ${KEY}
security-group-ids: ${VPC_SG_ID}

ETX
```

インスタンス(CAELinux)を起動します。

```bash:command
aws ec2 run-instances \
	--image-id ${AMI} \
	--instance-type ${INSTANCE_TYPE} \
	--key-name ${KEY} \
	--security-group-ids ${VPC_SG_ID}
```

```json:結果例
{
    "OwnerId": "XXXXXXXXXXXX", 
    "ReservationId": "r-b010fa42", 
    "Groups": [], 
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            }, 
            "PublicDnsName": "", 
            "RootDeviceType": "ebs", 
            "State": {
                "Code": 0, 
                "Name": "pending"
            }, 
            "EbsOptimized": false, 
            "LaunchTime": "2015-09-17T13:46:57.000Z", 
            "PrivateIpAddress": "XXX.XXX.XXX.XXX", 
            "ProductCodes": [], 
            "VpcId": "vpc-XXXXXXXX", 
            "StateTransitionReason": "", 
            "InstanceId": "i-XXXXXXXX", 
            "ImageId": "ami-65816465", 
            "PrivateDnsName": "ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal", 
            "KeyName": "<あらかじめ作成したkeyPair>", 
            "SecurityGroups": [
                {
                    "GroupName": "default", 
                    "GroupId": "sg-XXXXXXXX"
                }
            ], 
            "ClientToken": "", 
            "SubnetId": "subnet-XXXXXXXX", 
            "InstanceType": "t2.micro", 
            "NetworkInterfaces": [
                {
                    "Status": "in-use", 
                    "MacAddress": "06:69:07:e4:b3:79", 
                    "SourceDestCheck": true, 
                    "VpcId": "vpc-XXXXXXXX", 
                    "Description": "", 
                    "NetworkInterfaceId": "eni-38d5cf4e", 
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal", 
                            "Primary": true, 
                            "PrivateIpAddress": "XXX.XXX.XXX.XXX"
                        }
                    ], 
                    "PrivateDnsName": "ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal", 
                    "Attachment": {
                        "Status": "attaching", 
                        "DeviceIndex": 0, 
                        "DeleteOnTermination": true, 
                        "AttachmentId": "eni-attach-01b2471a", 
                        "AttachTime": "2015-09-17T13:46:57.000Z"
                    }, 
                    "Groups": [
                        {
                            "GroupName": "default", 
                            "GroupId": "sg-XXXXXXXX"
                        }
                    ], 
                    "SubnetId": "subnet-XXXXXXXX", 
                    "OwnerId": "XXXXXXXXXXXX", 
                    "PrivateIpAddress": "XXX.XXX.XXX.XXX"
                }
            ], 
            "SourceDestCheck": true, 
            "Placement": {
                "Tenancy": "default", 
                "GroupName": "", 
                "AvailabilityZone": "ap-northeast-1a"
            }, 
            "Hypervisor": "xen", 
            "BlockDeviceMappings": [], 
            "Architecture": "x86_64", 
            "StateReason": {
                "Message": "pending", 
                "Code": "pending"
            }, 
            "RootDeviceName": "/dev/sda1", 
            "VirtualizationType": "hvm", 
            "AmiLaunchIndex": 0
        }
    ]
}
```

1.6 インスタンス(CAELinux)の起動確認
--------------------------------

下記コマンドを実行します。

```bash:command
aws ec2 describe-instances --filters Name=instance-state-name,Values=running | jq -r '.Reservations[] | .Instances[] | "\(.ImageId) \(.State | .Name)"' | grep $AMI
```

5分くらいまって、結果が次のようになるまで待ちます

```bash:結果
ami-65816465 running
```

1.7 EC2上に起動したCAELinuxのIPアドレスの取得
-------------------------------------------

`ami-65816465`で立ち上げたインスタンスのIPアドレスを取得します。
このamiで立ち上げたCAELinuxは東京リージョンに1つのケースの場合、そのIPアドレスは下記にて取得できます。

```bash:command
IP_ADRESS=`aws ec2 describe-instances --filters Name=instance-state-name,Values=running | jq -r '.Reservations[] | .Instances[] | "\(.ImageId) \(.PublicIpAddress)"' | grep $AMI | awk '{print $2}'` && echo ${IP_ADRESS}
```

```bash:結果
XXX.XXX.XXX.XXX
```

IPアドレスが表示されればOK!

1.8 EC2上に起動したCAELinuxへのログイン
---------------------------------

```bash:command
KEY_PAIR_PATH='<あらかじめ作成し保存した${KEY}のファイルパス>'
```

```bash:command
ssh -i ${KEY_PAIR_PATH} ubuntu@${IP_ADRESS}
```

2. OpenFOAMの実行
===================================

2.1 caelinuxアカウントの設定
---------------------------------

```bash:command
cd
./setupCAELinuxUser.sh
```

指示に従って任意のパスワードを入力します。

2.2 X2Go Clientの起動
--------------------------

GUI操作なので詳細は省略します。
お手元のPCからX2Go Clientを立ち上げて、ログインしてください

2.3 OpenFOAM 起動/プリ処理/実行/可視化
--------------------------------------

OpenFOAM terminalからの操作、もしくはGUI操作なので詳細は省略します。

PPT資料を参考にしてください

3. 後始末
=======================


3.1 InstanceIdの取得
------------------------


```bash:command
INSTANCE_ID=`aws ec2 describe-instances --filters Name=instance-state-name,Values=running | jq -r '.Reservations[] | .Instances[] | "\(.ImageId) \(.InstanceId)"' | grep $AMI | awk '{print $2}'` && echo ${INSTANCE_ID}
```

```bash:結果例
i-XXXXXXXX
```

3.2 インスタンスの削除
------------------------

```bash:command
aws ec2 terminate-instances \
	--instance-ids ${INSTANCE_ID}
```

```json:結果例
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-5a5db3ff", 
            "CurrentState": {
                "Code": 32, 
                "Name": "shutting-down"
            }, 
            "PreviousState": {
                "Code": 16, 
                "Name": "running"
            }
        }
    ]
}
```