[JAWS-UG CLI] VPC:#2 VPCの利用例 (EC2)

http://jawsug-cli.doorkeeper.jp/events/15122 でのハンズオン資料です。

http://qiita.com/tcsh/items/41e1aa3c77c469c92e84 で構築したVPC上に、AWS CLIを利用してEC2のインスタンスを構築します。
(上記記事中で設定している環境変数、シェル変数が下記の手順では必要になります。)

今回は、EC2マネジメントコンソールを眺めながら作業すると、CLIでの作業の意味がわかりやすいと思います。



前提条件
========

* EC2についてフル権限がある。

* http://qiita.com/tcsh/items/41e1aa3c77c469c92e84 の手順を実施している。(変数が設定されている)



0. 事前確認
===========


稼動インスタンスが存在しないことを確認
--------------------------------------

このハンズオンでは、手順の最後に全てのインスタンスを終了します。

必ず、同一リージョン、同一VPCでインスタンスが起動していないことを確認してください。

```bash:コマンド:
   $ aws ec2 describe-instances --filters Name=vpc-id,Values=${VPC_ID} Name=instance-state-name,Values=running
```

```json:結果:
   {
     "Reservations": []
   }
```


1. キーペアの作成
=================


キーペアの確認
--------------

EC2のキーペアを確認します。

```bash:コマンド:
   $ aws ec2 describe-key-pairs
```

```json:結果:
   {
     "KeyPairs": []
   }
```


キーペアの作成
--------------

キーペアが存在しない場合は、キーペアを作成します。

(キーペアが存在する場合も、以下の手順をスムーズに行うために、このハンズオン用のキーペアを作成することをお奨めします。)

```bash:コマンド:
   $ EC2_KEY_NAME="${AWS_DEFAULT_REGION}-prject01"
   $ FILE_SSH_KEY="${HOME}/.ssh/${EC2_KEY_NAME}.pem"
   $ 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}
```


キーペアの確認
--------------

```bash:コマンド:
   $ aws ec2 describe-key-pairs --key-name ${EC2_KEY_NAME}
```

```json:結果:
   {
     "KeyPairs": [
         {
             "KeyName": "ap-northeast-1-prject01",
             "KeyFingerprint": "XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
         }
     ]
   }
```


2. AMIイメージの選択
====================


Amazon Linuxのバージョン決定
----------------------------

Amazon Linuxのバージョンを決定します。

```bash:コマンド(例):
   $ EC2_AMI_VERSION='2015.03.0'
```


AMI IDの取得
------------

そのリージョンで利用可能なAmazon LinuxのAMI IDを取得します。

```bash:コマンド(例):
   $ EC2_AMI_ID=`aws ec2 describe-images --owners amazon --filters Name=description,Values="Amazon Linux AMI ${EC2_AMI_VERSION} x86_64 HVM EBS" --query 'Images[].ImageId' --output text`; echo ${EC2_AMI_ID}
```


3. Privateインスタンス起動 (Subnet01)
=====================================

最初に、PrivateサブネットでEC2インスタンスを上げてみます。


インスタンスタイプの決定
------------------------

EC2インスタンスのインスタンスタイプを決定します。

(ここでは無料枠でも利用できるt2.microを選択します。)

```bash:コマンド:
   $ EC2_INSTANCE_TYPE='t2.micro'
```


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

PrivateサブネットでEC2インスタンスを起動します。

```bash:コマンド:
   $ aws ec2 run-instances \
       --image-id ${EC2_AMI_ID} \
       --instance-type ${EC2_INSTANCE_TYPE} \
       --key-name ${EC2_KEY_NAME} \
       --security-group-ids ${VPC_SG_ID} \
       --subnet-id ${VPC_NET01_ID}
```

```json:結果:
   {
     "OwnerId": "XXXXXXXXXXXX",
     "ReservationId": "r-XXXXXXXX",
     "Groups": [],
     "Instances": [
         {
             "Monitoring": {
                 "State": "disabled"
             },
             "PublicDnsName": null,
             "RootDeviceType": "ebs",
             "State": {
                 "Code": 0,
                 "Name": "pending"
             },
             "EbsOptimized": false,
             "LaunchTime": "2014-11-23T11:42:59.000Z",
             "PrivateIpAddress": "10.192.1.XXX",
             "ProductCodes": [],
             "VpcId": "vpc-XXXXXXXX",
             "StateTransitionReason": null,
             "InstanceId": "i-XXXXXXXX",
             "ImageId": "ami-b5a7ea85",
             "PrivateDnsName": "ip-10-192-1-XXX.ap-northeast-1.compute.internal",
             "KeyName": "ap-northeast-1-prject01",
             "SecurityGroups": [
                 {
                     "GroupName": "SSHLoginSecurityGroup",
                     "GroupId": "sg-XXXXXXXX"
                 }
             ],
             "ClientToken": null,
             "SubnetId": "subnet-XXXXXXXX",
             "InstanceType": "t2.micro",
             "NetworkInterfaces": [
                 {
                     "Status": "in-use",
                     "MacAddress": "XX:XX:XX:XX:XX:XX",
                     "SourceDestCheck": true,
                     "VpcId": "vpc-XXXXXXXX",
                     "Description": null,
                     "NetworkInterfaceId": "eni-XXXXXXXX",
                     "PrivateIpAddresses": [
                         {
                             "Primary": true,
                             "PrivateIpAddress": "10.192.1.XXX"
                         }
                     ],
                     "Attachment": {
                         "Status": "attaching",
                         "DeviceIndex": 0,
                         "DeleteOnTermination": true,
                         "AttachmentId": "eni-attach-XXXXXXXX",
                         "AttachTime": "2014-11-23T11:42:59.000Z"
                     },
                     "Groups": [
                         {
                             "GroupName": "SSHLoginSecurityGroup",
                             "GroupId": "sg-XXXXXXXX"
                         }
                     ],
                     "SubnetId": "subnet-XXXXXXXX",
                     "OwnerId": "XXXXXXXXXXXX",
                     "PrivateIpAddress": "10.192.1.XXX"
                 }
             ],
             "SourceDestCheck": true,
             "Placement": {
                 "Tenancy": "default",
                 "GroupName": null,
                 "AvailabilityZone": "ap-northeast-1a"
             },
             "Hypervisor": "xen",
             "BlockDeviceMappings": [],
             "Architecture": "x86_64",
             "StateReason": {
                 "Message": "pending",
                 "Code": "pending"
             },
             "RootDeviceName": "/dev/xvda",
             "VirtualizationType": "hvm",
             "AmiLaunchIndex": 0
         }
     ]
   }
```


インスタンスIDの取得
--------------------

起動したEC2インスタンスのインスタンスIDを取得します。

```bash:コマンド:
   $ VPC_NET01_INSTANCES=`aws ec2 describe-instances --filter Name=subnet-id,Values=${VPC_NET01_ID} --query 'Reservations[].Instances[].InstanceId' --output text`; echo ${VPC_NET01_INSTANCES}
```

```text:結果:
   i-XXXXXXXX
```


プライベートアドレスの取得
--------------------------

起動したEC2インスタンスのプライベートIPアドレスを取得します。

これは、のちほどPublicサブネットのEC2インスタンスからSSHログインするときに必要となります。

```bash:コマンド:
   $ VPC_NET01_INSTANCE_ADDR=`aws ec2 describe-instances --filter Name=subnet-id,Values=${VPC_NET01_ID} --query 'Reservations[].Instances[].PrivateIpAddress' --output text`; echo ${VPC_NET01_INSTANCE_ADDR}
```

```text:結果:
   10.192.1.XXX
```

ノート: このハンズオンでは、Subnet03でのEC2インスタンス起動は行いません。 (Subnet01と同じ手順のため)


4. Publicインスタンス起動 (Subnet11)
====================================

続いて、PublicサブネットでEC2インスタンスを起動します。

このサブネットは、EC2インスタンス起動時にPublicIPアドレスが自動的に付かない設定をしているので、EIPを手動で追加します。

今回は、VPC内に起動されるインスタンスがDNSホスト名を取得しない設定で起動してみます。


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

EC2インスタンスを起動します。

```bash:コマンド:
   $ aws ec2 run-instances \
       --image-id ${EC2_AMI_ID} \
       --instance-type ${EC2_INSTANCE_TYPE} \
       --key-name ${EC2_KEY_NAME} \
       --security-group-ids ${VPC_SG_ID} \
       --subnet-id ${VPC_NET11_ID}
```

```json:結果:
   {
     "OwnerId": "XXXXXXXXXXXX",
     "ReservationId": "r-XXXXXXXX",
     "Groups": [],
     "Instances": [
         {
             "Monitoring": {
                 "State": "disabled"
             },
             "PublicDnsName": null,
             "RootDeviceType": "ebs",
             "State": {
                 "Code": 0,
                 "Name": "pending"
             },
             "EbsOptimized": false,
             "LaunchTime": "2014-11-23T09:26:44.000Z",
             "PrivateIpAddress": "10.192.129.XX",
             "ProductCodes": [],
             "VpcId": "vpc-XXXXXXXX",
             "StateTransitionReason": null,
             "InstanceId": "i-XXXXXXXX",
             "ImageId": "ami-XXXXXXXX",
             "PrivateDnsName": "ip-10-192-129-XX.ap-northeast-1.compute.internal",
             "KeyName": "ap-northeast-1-prject01",
             "SecurityGroups": [
                 {
                     "GroupName": "SSHLoginSecurityGroup",
                     "GroupId": "sg-XXXXXXXX"
                 }
             ],
             "ClientToken": null,
             "SubnetId": "subnet-XXXXXXXX",
             "InstanceType": "t2.micro",
             "NetworkInterfaces": [
                 {
                     "Status": "in-use",
                     "MacAddress": "XX:XX:XX:XX:XX:XX",
                     "SourceDestCheck": true,
                     "VpcId": "vpc-XXXXXXXX",
                     "Description": null,
                     "NetworkInterfaceId": "eni-XXXXXXXX",
                     "PrivateIpAddresses": [
                         {
                             "Primary": true,
                             "PrivateIpAddress": "10.192.129.XX"
                         }
                     ],
                     "Attachment": {
                         "Status": "attaching",
                         "DeviceIndex": 0,
                         "DeleteOnTermination": true,
                         "AttachmentId": "eni-attach-XXXXXXXX",
                         "AttachTime": "2014-11-23T09:26:44.000Z"
                     },
                     "Groups": [
                         {
                             "GroupName": "SSHLoginSecurityGroup",
                             "GroupId": "sg-XXXXXXXX"
                         }
                     ],
                     "SubnetId": "subnet-XXXXXXXX",
                     "OwnerId": "XXXXXXXXXXXX",
                     "PrivateIpAddress": "10.192.129.XX"
                 }
             ],
             "SourceDestCheck": true,
             "Placement": {
                 "Tenancy": "default",
                 "GroupName": null,
                 "AvailabilityZone": "ap-northeast-1a"
             },
             "Hypervisor": "xen",
             "BlockDeviceMappings": [],
             "Architecture": "x86_64",
             "StateReason": {
                 "Message": "pending",
                 "Code": "pending"
             },
             "RootDeviceName": "/dev/xvda",
             "VirtualizationType": "hvm",
             "AmiLaunchIndex": 0
         }
     ]
   }
```


インスタンスIDの取得
--------------------

起動したEC2インスタンスのインスタンスIDを取得します。

```bash:コマンド:
   $ VPC_NET11_INSTANCES=`aws ec2 describe-instances --filter Name=subnet-id,Values=${VPC_NET11_ID} --query 'Reservations[].Instances[].InstanceId' --output text`; echo ${VPC_NET11_INSTANCES}
```


EIPの確認
---------

既に割り当てを受けているPublicIPアドレスがないか確認します。

(もしEIPでEC2インスタンスに関連付けしていないものがあると、非利用による課金が発生しているかもしれません。)

```bash:コマンド:
   $ aws ec2 describe-addresses
```

```json:結果:
   {
     "Addresses": []
   }
```


EIPの作成
---------

PublicIPアドレス(Elastic IP Address)の割り当てを受けます。

```bash:コマンド:
   $ aws ec2 allocate-address
```

```json:結果:
   {
     "PublicIp": "aaa.bbb.ccc.ddd",
     "Domain": "vpc",
     "AllocationId": "eipalloc-XXXXXXXX"
   }
```


EIP IDの取得
------------

未関連付けの(さきほど割り当てを受けた)PublicIPアドレスのEIP割当てIDを取得します。

```bash:コマンド:
   $ EC2_EIP_ID=`aws ec2 describe-addresses | jq -r '.Addresses[] | select(has("AssociationId") | not).AllocationId'`; echo ${EC2_EIP_ID}
```

```text:結果:
   eipalloc-XXXXXXXX
```


EIPの関連付け
-------------

EIPをEC2インスタンスに関連付けます。

```bash:コマンド:
   $ aws ec2 associate-address --allocation-id ${EC2_EIP_ID} --instance-id ${VPC_NET11_INSTANCES}
```

```json:結果:
   {
     "AssociationId": "eipassoc-8bfbbaee"
   }
```


EIPの確認
---------

EIPがEC2インスタンスに関連付けられたことを確認します。

```bash:コマンド:
   $ aws ec2 describe-addresses --allocation-ids ${EC2_EIP_ID}
```

```json:結果:
   {
     "Addresses": [
         {
             "Domain": "vpc",
             "InstanceId": "i-XXXXXXXX",
             "NetworkInterfaceId": "eni-XXXXXXXX",
             "AssociationId": "eipassoc-XXXXXXXX",
             "NetworkInterfaceOwnerId": "XXXXXXXXXXXX",
             "PublicIp": "aaa.bbb.ccc.ddd",
             "AllocationId": "eipalloc-XXXXXXXX",
             "PrivateIpAddress": "10.192.129.XX"
         }
     ]
   }
```


EIPのアドレス取得
-----------------

EIPが持つグローバルIPアドレスを取得します。

これは、のちほどEC2インスタンスにSSHログインするときに必要となります。

```bash:コマンド:
   $ EC2_EIP_ADDR=`aws ec2 describe-addresses --allocation-ids ${EC2_EIP_ID} --query 'Addresses[].PublicIp' --output text`; echo ${EC2_EIP_ADDR}
```

```text:結果:
   aaa.bbb.ccc.ddd
```


ログイン (Publicインスタンス NET11)
-----------------------------------

起動したEC2インスタンスにSSHログインしてみましょう。

```bash:コマンド:
   $ ssh -i ${FILE_SSH_KEY} ec2-user@${EC2_EIP_ADDR}
```

```text:結果:
   The authenticity of host 'aaa.bbb.ccc.ddd (aaa.bbb.ccc.ddd)' can't be established.
   RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
   Are you sure you want to continue connecting (yes/no)?
```

```text:入力:
   yes(Enter)
```

```text:結果:
   Warning: Permanently added 'aaa.bbb.ccc.ddd' (RSA) to the list of known hosts.

        __|  __|_  )
        _|  (     /   Amazon Linux AMI
       ___|\___|___|

   https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
   [ec2-user@ip-10-192-129-XX ~]$
```

これでPublicサブネットで起動したEC2インスタンスにログインできました。

続いて、さきほどPrivateサブネットで起動したEC2インスタンスにログインできるようにキーペアをこのEC2インスタンスに転送します。

```bash:コマンド(ローカルのターミナル):
   $ scp -i ${FILE_SSH_KEY} ${FILE_SSH_KEY} ec2-user@${EC2_EIP_ADDR}:.ssh/
```

```text:結果:
   ap-northeast-1-prject01.pem                                100% 1675     1.6KB/s   00:00
```


ログイン (Privateインスタンス NET01)
------------------------------------

キーペアを転送したら、早速PublicサブネットのEC2インスタンスから、PrivateサブネットのEC2インスタンスにログインしてみましょう。

```bash:コマンド:
   [ec2-user@ip-10-192-129-XX ~]$ export AWS_DEFAULT_REGION='ap-northeast-1'
   [ec2-user@ip-10-192-129-XX ~]$ EC2_KEY_NAME="${AWS_DEFAULT_REGION}-prject01"
   [ec2-user@ip-10-192-129-XX ~]$ FILE_SSH_KEY="${HOME}/.ssh/${EC2_KEY_NAME}.pem"
   [ec2-user@ip-10-192-129-XX ~]$ VPC_NET01_INSTANCE_ADDR='${Subnet01で起動したインスタンスのプライベートアドレス}'
```

ノート: 「Subnet01で起動したインスタンスのプライベートアドレス」の確認方法ローカルのターミナル:

```bash:コマンド:
     echo ${VPC_NET01_INSTANCE_ADDR}
```

```text:結果:
    10.192.1.XXX
```

SSHログインします。

```bash:コマンド:
   [ec2-user@ip-10-192-129-XX ~]$ ssh -i ${FILE_SSH_KEY} ec2-user@${VPC_NET01_INSTANCE_ADDR}
```

```text:結果:
   The authenticity of host '10.192.1.XXX (10.192.1.XXX)' can't be established.
   RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
   Are you sure you want to continue connecting (yes/no)?
```

```text:入力:
   yes(Enter)
```

```text:結果:
   Warning: Permanently added '10.192.1.XXX' (RSA) to the list of known hosts.

        __|  __|_  )
        _|  (     /   Amazon Linux AMI
       ___|\___|___|

   https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
   [ec2-user@ip-10-192-1-XXX ~]$
```

これでPrivateサブネットで起動したEC2インスタンスにログインできました。

PrivateサブネットのEC2インスタンスからログアウトします。

```bash:コマンド:
   [ec2-user@ip-10-192-1-XXX ~]$ exit
```

```bash:結果:
   [ec2-user@ip-10-192-129-XX ~]$
```

PublicサブネットのEC2インスタンスからログアウトします。

```bash:コマンド:
   [ec2-user@ip-10-192-129-XX ~]$ exit
```

```bash:結果:
   $
```


5. インスタンス起動(Subnet13)
=============================

最後に、PublicサブネットでEC2インスタンスをもう一つ起動します。

このサブネットは、EC2インスタンス起動時にPublicIPアドレスが自動的に付く設定をしているので、EIPの手動追加手順は不要です。

今回はVPCの設定変更を行い、VPC内に起動されるインスタンスがDNSホスト名を取得するようにして、挙動の違いを確認します。


VPCの設定変更 (DNSホスト名有効化)
---------------------------------

### -[ VPC(DNSホスト名)設定の確認 ]-

まず、現在の設定を確認します。

デフォルトでfalseになっています。

```bash:コマンド:
   $ aws ec2 describe-vpc-attribute --vpc-id ${VPC_ID} --attribute enableDnsHostnames
```

```json:結果:
   {
     "VpcId": "vpc-4865b82d",
     "EnableDnsHostnames": {
         "Value": false
     }
   }
```

### -[ VPC(DNSホスト名)設定の有効化 ]-

DNSホスト名を有効にします。

```bash:コマンド:
   $ aws ec2 modify-vpc-attribute --vpc-id ${VPC_ID} --enable-dns-hostnames
```

```text:結果:
   (戻り値なし)
```

### -[ VPC(DNSホスト名)設定の確認 ]-

変更後の設定を確認します。

```bash:コマンド:
   $ aws ec2 describe-vpc-attribute --vpc-id ${VPC_ID} --attribute enableDnsHostnames
```

```json:結果:
   {
     "VpcId": "vpc-4865b82d",
     "EnableDnsHostnames": {
         "Value": true
     }
   }
```


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

EC2インスタンスを起動します。

```bash:コマンド:
   $ aws ec2 run-instances \
     --image-id ${EC2_AMI_ID} \
     --instance-type ${EC2_INSTANCE_TYPE} \
     --key-name ${EC2_KEY_NAME} \
     --security-group-ids ${VPC_SG_ID} \
     --subnet-id ${VPC_NET13_ID}
```

```json:結果:
   {
     "OwnerId": "XXXXXXXXXXXX",
     "ReservationId": "r-XXXXXXXX",
     "Groups": [],
     "Instances": [
         {
             "Monitoring": {
                 "State": "disabled"
             },
             "PublicDnsName": null,
             "RootDeviceType": "ebs",
             "State": {
                 "Code": 0,
                 "Name": "pending"
             },
             "EbsOptimized": false,
             "LaunchTime": "2014-11-23T12:18:59.000Z",
             "PrivateIpAddress": "10.192.131.XX",
             "ProductCodes": [],
             "VpcId": "vpc-XXXXXXXX",
             "StateTransitionReason": null,
             "InstanceId": "i-XXXXXXXX",
             "ImageId": "ami-XXXXXXXX",
             "PrivateDnsName": "ip-10-192-131-XX.ap-northeast-1.compute.internal",
             "KeyName": "ap-northeast-1-prject01",
             "SecurityGroups": [
                 {
                     "GroupName": "SSHLoginSecurityGroup",
                     "GroupId": "sg-XXXXXXXX"
                 }
             ],
             "ClientToken": null,
             "SubnetId": "subnet-XXXXXXXX",
             "InstanceType": "t2.micro",
             "NetworkInterfaces": [
                 {
                     "Status": "in-use",
                     "MacAddress": "XX:XX:XX:XX:XX:XX",
                     "SourceDestCheck": true,
                     "VpcId": "vpc-XXXXXXXX",
                     "Description": null,
                     "NetworkInterfaceId": "eni-XXXXXXXX",
                     "PrivateIpAddresses": [
                         {
                             "PrivateDnsName": "ip-10-192-131-XX.ap-northeast-1.compute.internal",
                             "Primary": true,
                             "PrivateIpAddress": "10.192.131.XX"
                         }
                     ],
                     "PrivateDnsName": "ip-10-192-131-XX.ap-northeast-1.compute.internal",
                     "Attachment": {
                         "Status": "attaching",
                         "DeviceIndex": 0,
                         "DeleteOnTermination": true,
                         "AttachmentId": "eni-attach-XXXXXXXX",
                         "AttachTime": "2014-11-23T12:18:59.000Z"
                     },
                     "Groups": [
                         {
                             "GroupName": "SSHLoginSecurityGroup",
                             "GroupId": "sg-XXXXXXXX"
                         }
                     ],
                     "SubnetId": "subnet-XXXXXXXX",
                     "OwnerId": "XXXXXXXXXXXX",
                     "PrivateIpAddress": "10.192.131.XX"
                 }
             ],
             "SourceDestCheck": true,
             "Placement": {
                 "Tenancy": "default",
                 "GroupName": null,
                 "AvailabilityZone": "ap-northeast-1c"
             },
             "Hypervisor": "xen",
             "BlockDeviceMappings": [],
             "Architecture": "x86_64",
             "StateReason": {
                 "Message": "pending",
                 "Code": "pending"
             },
             "RootDeviceName": "/dev/xvda",
             "VirtualizationType": "hvm",
             "AmiLaunchIndex": 0
         }
     ]
   }
```


インスタンスIDの取得
--------------------

起動したEC2インスタンスのインスタンスIDを取得します。

```bash:コマンド:
   $ VPC_NET13_INSTANCES=`aws ec2 describe-instances --filter Name=subnet-id,Values=${VPC_NET13_ID} --query 'Reservations[].Instances[].InstanceId' --output text`; echo ${VPC_NET13_INSTANCES}
```


PublicDnsNameの取得
-------------------

実際のPublic DNS名を確認してみましょう。

```bash:コマンド:
   $ VPC_NET13_INSTANCE_NAME_PUBLIC=`aws ec2 describe-instances --instance-ids ${VPC_NET13_INSTANCES} --query 'Reservations[].Instances[].PublicDnsName' --output text`; echo ${VPC_NET13_INSTANCE_NAME_PUBLIC}
```

```text:結果:
   ec2-aaa-bbb-ccc-ddd.ap-northeast-1.compute.amazonaws.com
```


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

起動したEC2インスタンスに、Public DNS名を指定してSSHログインしてみましょう。

```bash:コマンド:
   $ ssh -i ${FILE_SSH_KEY} ec2-user@${VPC_NET13_INSTANCE_NAME_PUBLIC}
```

```text:結果:
   The authenticity of host 'ec2-aaa-bbb-ccc-ddd.ap-northeast-1.compute.amazonaws.com (aaa.bbb.ccc.ddd)' can't be established.
   RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
   Are you sure you want to continue connecting (yes/no)?
```

```text:入力:
   yes(Enter)
```

```text:結果:
   Warning: Permanently added 'ec2-aaa-bbb-ccc-ddd.ap-northeast-1.compute.amazonaws.com,aaa.bbb.ccc.ddd' (RSA) to the list of known hosts.

          __|  __|_  )
          _|  (     /   Amazon Linux AMI
         ___|\___|___|

   https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
   10 package(s) needed for security, out of 24 available
   Run "sudo yum update" to apply all updates.
   [ec2-user@ip-10-192-131-90 ~]$
```

これでPublicサブネットで起動した2つ目のEC2インスタンスにログインできました。


6. 全インスタンスの終了
=======================

EC2インスタンスを複数起動したままだと、無料枠を超えて課金されてしまうので、今回のVPC上のEC2インスタンスは全て終了しておきましょう。


稼動インスタンスのインスタンスID取得
------------------------------------

まず、VPC上で稼動しているEC2インスタンスのインスタンスIDを取得します。

```bash:コマンド:
   $ ARRAY_EC2_INSTANCES=`aws ec2 describe-instances --filters Name=instance-state-name,Values=running --query 'Reservations[].Instances[].InstanceId' --output text`; echo ${ARRAY_EC2_INSTANCES}
```

```text:結果:
   i-XXXXXXXX i-YYYYYYYY i-ZZZZZZZZ
```


インスタンスのステータス確認
----------------------------

VPC上で稼動しているEC2インスタンスのステータスを確認します。

```bash:コマンド:
   $ aws ec2 describe-instance-status --instance-ids ${ARRAY_EC2_INSTANCES} --query 'InstanceStatuses[].[InstanceId,InstanceState.Name]' --output table
```

```text:結果:
   ---------------------------
   | DescribeInstanceStatus  |
   +-------------+-----------+
   |  i-XXXXXXXX |  running  |
   |  i-YYYYYYYY |  running  |
   |  i-ZZZZZZZZ |  running  |
   +-------------+-----------+
```


稼動インスタンスの終了
----------------------

ステータスがrunningのEC2インスタンスを全て終了します。

```bash:コマンド:
   $ aws ec2 terminate-instances --instance-ids ${ARRAY_EC2_INSTANCES}
```

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


対象インスタンスの終了確認
--------------------------

終了したEC2インスタンスが全て終了状態になっていることを確認します。

```bash:コマンド:
   $ aws ec2 describe-instances --instance-ids ${ARRAY_EC2_INSTANCES} \
     --query 'Reservations[].Instances[].[InstanceId,State.Name]' --output table
```

```text:結果:
   ------------------------------
   |      DescribeInstances     |
   +-------------+--------------+
   |  i-5b863a92 |  terminated  |
   |  i-afba7759 |  terminated  |
   |  i-d9db162f |  terminated  |
   +-------------+--------------+
```


稼動インスタンスが存在しないことを確認
--------------------------------------

VPC上にステータスがrunningになっているEC2インスタンスが存在しないことを確認します。

```bash:コマンド:
   $ aws ec2 describe-instances --filters Name=instance-state-name,Values=running \
     --query 'Reservations[].Instances[].InstanceId' --output text
```

```text:結果:
   (戻り値なし)
```



EIPの返却
--------------------------------------

忘れずにEIPを返却しておきましょう。


```bash:コマンド:
  $ aws ec2 release-address --allocation-id ${EC2_EIP_ID}
```

```text:結果:
  (戻り値なし)
```


```bash:コマンド:
  $ aws ec2 describe-addresses
```

```json:結果:
  {
    "Addresses": []
  }
```



終了
====

以上で、VPC上でEC2インスタンスを起動/終了するハンズオンは完了です。