Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

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

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

前提条件

0. 事前確認

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

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

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

コマンド
   $ aws ec2 describe-instances --filters Name=vpc-id,Values=${VPC_ID} Name=instance-state-name,Values=running
結果
   {
     "Reservations": []
   }

1. キーペアの作成

キーペアの確認

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

コマンド
   $ aws ec2 describe-key-pairs
結果
   {
     "KeyPairs": []
   }

キーペアの作成

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

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

コマンド
   $ 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}

キーペアの確認

コマンド
   $ aws ec2 describe-key-pairs --key-name ${EC2_KEY_NAME}
結果
   {
     "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のバージョンを決定します。

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

AMI IDの取得

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

コマンド(例)
   $ 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を選択します。)

コマンド
   $ EC2_INSTANCE_TYPE='t2.micro'

インスタンスの起動

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

コマンド
   $ 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}
結果
   {
     "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を取得します。

コマンド
   $ 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}
結果
   i-XXXXXXXX

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

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

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

コマンド
   $ 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}
結果
   10.192.1.XXX

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

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

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

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

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

インスタンスの起動

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

コマンド
   $ 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}
結果
   {
     "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を取得します。

コマンド
   $ 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インスタンスに関連付けしていないものがあると、非利用による課金が発生しているかもしれません。)

コマンド
   $ aws ec2 describe-addresses
結果
   {
     "Addresses": []
   }

EIPの作成

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

コマンド
   $ aws ec2 allocate-address
結果
   {
     "PublicIp": "aaa.bbb.ccc.ddd",
     "Domain": "vpc",
     "AllocationId": "eipalloc-XXXXXXXX"
   }

EIP IDの取得

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

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

EIPの関連付け

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

コマンド
   $ aws ec2 associate-address --allocation-id ${EC2_EIP_ID} --instance-id ${VPC_NET11_INSTANCES}
結果
   {
     "AssociationId": "eipassoc-8bfbbaee"
   }

EIPの確認

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

コマンド
   $ aws ec2 describe-addresses --allocation-ids ${EC2_EIP_ID}
結果
   {
     "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ログインするときに必要となります。

コマンド
   $ EC2_EIP_ADDR=`aws ec2 describe-addresses --allocation-ids ${EC2_EIP_ID} --query 'Addresses[].PublicIp' --output text`; echo ${EC2_EIP_ADDR}
結果
   aaa.bbb.ccc.ddd

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

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

コマンド
   $ ssh -i ${FILE_SSH_KEY} ec2-user@${EC2_EIP_ADDR}
結果
   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)?
入力
   yes(Enter)
結果
   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インスタンスに転送します。

コマンド(ローカルのターミナル)
   $ scp -i ${FILE_SSH_KEY} ${FILE_SSH_KEY} ec2-user@${EC2_EIP_ADDR}:.ssh/
結果
   ap-northeast-1-prject01.pem                                100% 1675     1.6KB/s   00:00

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

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

コマンド
   [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で起動したインスタンスのプライベートアドレス」の確認方法ローカルのターミナル:

コマンド
     echo ${VPC_NET01_INSTANCE_ADDR}
結果
    10.192.1.XXX

SSHログインします。

コマンド
   [ec2-user@ip-10-192-129-XX ~]$ ssh -i ${FILE_SSH_KEY} ec2-user@${VPC_NET01_INSTANCE_ADDR}
結果
   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)?
入力
   yes(Enter)
結果
   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インスタンスからログアウトします。

コマンド
   [ec2-user@ip-10-192-1-XXX ~]$ exit
結果
   [ec2-user@ip-10-192-129-XX ~]$

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

コマンド
   [ec2-user@ip-10-192-129-XX ~]$ exit
結果
   $

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

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

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

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

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

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

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

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

コマンド
   $ aws ec2 describe-vpc-attribute --vpc-id ${VPC_ID} --attribute enableDnsHostnames
結果
   {
     "VpcId": "vpc-4865b82d",
     "EnableDnsHostnames": {
         "Value": false
     }
   }

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

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

コマンド
   $ aws ec2 modify-vpc-attribute --vpc-id ${VPC_ID} --enable-dns-hostnames
結果
   (戻り値なし)

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

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

コマンド
   $ aws ec2 describe-vpc-attribute --vpc-id ${VPC_ID} --attribute enableDnsHostnames
結果
   {
     "VpcId": "vpc-4865b82d",
     "EnableDnsHostnames": {
         "Value": true
     }
   }

インスタンスの起動

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

コマンド
   $ 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}
結果
   {
     "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を取得します。

コマンド
   $ 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名を確認してみましょう。

コマンド
   $ 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}
結果
   ec2-aaa-bbb-ccc-ddd.ap-northeast-1.compute.amazonaws.com

ログイン

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

コマンド
   $ ssh -i ${FILE_SSH_KEY} ec2-user@${VPC_NET13_INSTANCE_NAME_PUBLIC}
結果
   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)?
入力
   yes(Enter)
結果
   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を取得します。

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

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

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

コマンド
   $ aws ec2 describe-instance-status --instance-ids ${ARRAY_EC2_INSTANCES} --query 'InstanceStatuses[].[InstanceId,InstanceState.Name]' --output table
結果
   ---------------------------
   | DescribeInstanceStatus  |
   +-------------+-----------+
   |  i-XXXXXXXX |  running  |
   |  i-YYYYYYYY |  running  |
   |  i-ZZZZZZZZ |  running  |
   +-------------+-----------+

稼動インスタンスの終了

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

コマンド
   $ aws ec2 terminate-instances --instance-ids ${ARRAY_EC2_INSTANCES}
結果
   {
     "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インスタンスが全て終了状態になっていることを確認します。

コマンド
   $ aws ec2 describe-instances --instance-ids ${ARRAY_EC2_INSTANCES} \
     --query 'Reservations[].Instances[].[InstanceId,State.Name]' --output table
結果
   ------------------------------
   |      DescribeInstances     |
   +-------------+--------------+
   |  i-5b863a92 |  terminated  |
   |  i-afba7759 |  terminated  |
   |  i-d9db162f |  terminated  |
   +-------------+--------------+

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

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

コマンド
   $ aws ec2 describe-instances --filters Name=instance-state-name,Values=running \
     --query 'Reservations[].Instances[].InstanceId' --output text
結果
   (戻り値なし)

EIPの返却

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

コマンド
  $ aws ec2 release-address --allocation-id ${EC2_EIP_ID}
結果
  (戻り値なし)
コマンド
  $ aws ec2 describe-addresses
結果
  {
    "Addresses": []
  }

終了

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした