AWS CLIでサービスの各種コマンドを動かしてみる(EC2編1: インスタンス)

2013.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

IAM編の次はEC2編です。IAM編についてはまだ制覇して無いですがその辺は緩やかに色々なサービスをつまみ食いしながらと言う事で。


EC2(Elastic Compute Cloud)

awscliでec2のコマンドを見てみましょう。唯一、1サービスで『全部の候補を表示しますか?』と聞かれます。それもそのはず、利用可能な機能は何と149個!数の多さに思わず怯んでしまいますが(笑)、要素別に整理して少しずつ試してみようと思います。

$ aws ec2
Display all 149 possibilities? (y or n)
activate-license                       delete-network-acl-entry               describe-volume-status
allocate-address                       delete-network-interface               describe-volumes
assign-private-ip-addresses            delete-placement-group                 describe-vpc-attribute
associate-address                      delete-route                           describe-vpcs
associate-dhcp-options                 delete-route-table                     describe-vpn-connections
associate-route-table                  delete-security-group                  describe-vpn-gateways
attach-internet-gateway                delete-snapshot                        detach-internet-gateway
attach-network-interface               delete-spot-datafeed-subscription      detach-network-interface
attach-volume                          delete-subnet                          detach-volume
attach-vpn-gateway                     delete-tags                            detach-vpn-gateway
authorize-security-group-egress        delete-volume                          disable-vgw-route-propagation
authorize-security-group-ingress       delete-vpc                             disassociate-address
bundle-instance                        delete-vpn-connection                  disassociate-route-table
cancel-bundle-task                     delete-vpn-connection-route            enable-vgw-route-propagation
cancel-conversion-task                 delete-vpn-gateway                     enable-volume-io
cancel-export-task                     deregister-image                       get-console-output
cancel-reserved-instances-listing      describe-account-attributes            get-password-data
cancel-spot-instance-requests          describe-addresses                     import-instance
confirm-product-instance               describe-availability-zones            import-key-pair
copy-image                             describe-bundle-tasks                  import-volume
copy-snapshot                          describe-conversion-tasks              modify-image-attribute
create-customer-gateway                describe-customer-gateways             modify-instance-attribute
create-dhcp-options                    describe-dhcp-options                  modify-network-interface-attribute
create-image                           describe-export-tasks                  modify-snapshot-attribute
create-instance-export-task            describe-image-attribute               modify-volume-attribute
create-internet-gateway                describe-images                        modify-vpc-attribute
create-key-pair                        describe-instance-attribute            monitor-instances
create-network-acl                     describe-instance-status               purchase-reserved-instances-offering
create-network-acl-entry               describe-instances                     reboot-instances
create-network-interface               describe-internet-gateways             register-image
create-placement-group                 describe-key-pairs                     release-address
create-reserved-instances-listing      describe-licenses                      replace-network-acl-association
create-route                           describe-network-acls                  replace-network-acl-entry
create-route-table                     describe-network-interface-attribute   replace-route
create-security-group                  describe-network-interfaces            replace-route-table-association
create-snapshot                        describe-placement-groups              report-instance-status
create-spot-datafeed-subscription      describe-regions                       request-spot-instances
create-subnet                          describe-reserved-instances            reset-image-attribute
create-tags                            describe-reserved-instances-listings   reset-instance-attribute
create-volume                          describe-reserved-instances-offerings  reset-network-interface-attribute
create-vpc                             describe-route-tables                  reset-snapshot-attribute
create-vpn-connection                  describe-security-groups               revoke-security-group-egress
create-vpn-connection-route            describe-snapshot-attribute            revoke-security-group-ingress
create-vpn-gateway                     describe-snapshots                     run-instances
deactivate-license                     describe-spot-datafeed-subscription    start-instances
delete-customer-gateway                describe-spot-instance-requests        stop-instances
delete-dhcp-options                    describe-spot-price-history            terminate-instances
delete-internet-gateway                describe-subnets                       unassign-private-ip-addresses
delete-key-pair                        describe-tags                          unmonitor-instances
delete-network-acl                     describe-volume-attribute              
$

このエントリで試すのは、中心的サービスEC2の更に核となる要素、『インスタンス』に関するもの。インスタンスに関するものは以下の15個。

run-instances
describe-instances

start-instances
stop-instances
reboot-instances
terminate-instances

monitor-instances
unmonitor-instances

bundle-instance
import-instance

describe-instance-status
report-instance-status

describe-instance-attribute
modify-instance-attribute
reset-instance-attribute

EC2:インスタンス(instance)に関する操作

 

run-instances

EC2インスタンスを作成、起動します。作成及び起動の際には、イメージID(image-id)が必要です。でもその情報ってどこから?

EC2を使い始めの頃とか、ハンズオンとかでは割とClassic Wizardから選ぶ事が多いと思いますが、ここで選択した時点で所定のAMIであり、AMIに紐付くimage-idを指定している事になる訳ですね。

ec2-choice

『Quick Launch Wizard』を使うと、もっと手軽に利用したい環境のAMIを調べる事が出来ます。『More Amazon Machine Images AMI』を選択し、次へ。

search-ami-01

次の画面にて、種類やフリーワード等で使いたいAMIのimage-idを知る事が出来ます。ひとまずここでは、『Amazon Linux AMI 2013.03.1』のimage-idを使う事にしましょう。

search-ami-02

コマンド実践例。image-idと作成・起動時の起動数の設定については必須となっているようです。

$ aws ec2 run-instances --image-id ami-39b23d38 --min-count 1 --max-count 1
{
    "OwnerId": "XXXXXXXXXXXX", 
    "ReservationId": "r-f4fc3ff6", 
    "ResponseMetadata": {
        "RequestId": "9a8782d8-7fe0-4891-b344-0cb1d8efb765"
    }, 
    "Groups": [
        {
            "GroupName": "default", 
            "GroupId": "sg-ad2556ac"
        }
    ], 
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            }, 
            "PublicDnsName": null, 
            "KernelId": "aki-44992845", 
            "State": {
                "Code": 0, 
                "Name": "pending"
            }, 
            "EbsOptimized": false, 
            "LaunchTime": "2013-07-12T17:20:16.000Z", 
            "ProductCodes": [], 
            "StateTransitionReason": null, 
            "InstanceId": "i-8490db86", 
            "ImageId": "ami-39b23d38", 
            "PrivateDnsName": null, 
            "SecurityGroups": [
                {
                    "GroupName": "default", 
                    "GroupId": "sg-ad2556ac"
                }
            ], 
            "ClientToken": null, 
            "InstanceType": "m1.small", 
            "NetworkInterfaces": [], 
            "Placement": {
                "Tenancy": "default", 
                "GroupName": null, 
                "AvailabilityZone": "ap-northeast-1a"
            }, 
            "Hypervisor": "xen", 
            "BlockDeviceMappings": [], 
            "Architecture": "x86_64", 
            "StateReason": {
                "Message": "pending", 
                "Code": "pending"
            }, 
            "RootDeviceName": "/dev/sda1", 
            "VirtualizationType": "paravirtual", 
            "RootDeviceType": "ebs", 
            "AmiLaunchIndex": 0
        }
    ]
}

上記では最低限の引数で作成・起動しましたが、ヘルプを見ると非常に細やかな設定での実行が可能となっています。

SYNOPSIS
       aws ec2 run-instances
         --image-id <value>
         --min-count <value>
         --max-count <value>
         [--key-name <value>]
         [--security-groups <value>]
         [--security-group-ids <value>]
         [--user-data <value>]
         [--instance-type <value>]
         [--placement <value>]
         [--kernel-id <value>]
         [--ramdisk-id <value>]
         [--block-device-mappings <value>]
         [--monitoring <value>]
         [--subnet-id <value>]
         [--disable-api-termination ]
         [--instance-initiated-shutdown-behavior <value>]
         [--license <value>]
         [--private-ip-address <value>]
         [--client-token <value>]
         [--additional-info <value>]
         [--network-interfaces <value>]
         [--iam-instance-profile <value>]
         [--ebs-optimized ]

作成・起動したEC2インスタンスの内容を見てみると、"Name"欄がEmptyの状態になっています。ここは分り易く何か設定したいですね。いずれ改めて後述しますが、『create-tags』コマンドでTag情報を追加する事が出来ます。

run-instance-01

$ aws ec2 create-tags --resources i-8490db86 --tags '[{"key": "Name", "value": "EC2-AWSCLI-TEST"}]'
{
    "return": "true", 
    "ResponseMetadata": {
        "RequestId": "96392cd4-3179-4cb4-9c9a-9da930445a8b"
    }
}

コマンド実行後再確認。ちゃんと変更されました。

run-instance-02

 

describe-instances

アカウントに紐付くEC2インスタンスの一覧を取得します。またインスタンスIDを指定した場合、所定のインスタンス情報を取得します。

$ aws ec2 describe-instances | jq '.Reservations[].Instances[].Tags[].Value'
"AWS-Study-EC2"
"ec2-test"
"ec2-creation-test"
"EC2-AWSCLI-TEST"

$ aws ec2 describe-instances --instance-ids i-8490db86 | jq '.'
{
  "ResponseMetadata": {
    "RequestId": "6ddf59a4-9282-42e2-bda8-4009b8d9f87c"
  },
  "Reservations": [
    {
      "Instances": [
        {
          "AmiLaunchIndex": 0,
          "Tags": [
            {
              "Key": "Name",
              "Value": "EC2-AWSCLI-TEST"
            }
          ],
          "VirtualizationType": "paravirtual",
          "RootDeviceName": "/dev/sda1",
          "KernelId": "aki-44992845",
          "Architecture": "x86_64",
          "BlockDeviceMappings": [
            {
              "Ebs": {
                "AttachTime": "2013-07-12T17:20:20.000Z",
                "VolumeId": "vol-5e3feb7b",
                "DeleteOnTermination": true,
                "Status": "attached"
              },
              "DeviceName": "/dev/sda1"
            }
          ],
          "Hypervisor": "xen",
          "Placement": {
            "AvailabilityZone": "ap-northeast-1a",
            "GroupName": null,
            "Tenancy": "default"
          },
          "NetworkInterfaces": [],
          "PrivateIpAddress": "10.152.134.243",
          "PublicIpAddress": "54.250.99.46",
          "LaunchTime": "2013-07-12T17:20:16.000Z",
          "EbsOptimized": false,
          "State": {
            "Name": "running",
            "Code": 16
          },
          "RootDeviceType": "ebs",
          "PublicDnsName": "ec2-54-250-99-46.ap-northeast-1.compute.amazonaws.com",
          "Monitoring": {
            "State": "disabled"
          },
          "ProductCodes": [],
          "StateTransitionReason": null,
          "InstanceId": "i-8490db86",
          "ImageId": "ami-39b23d38",
          "PrivateDnsName": "ip-10-152-134-243.ap-northeast-1.compute.internal",
          "SecurityGroups": [
            {
              "GroupId": "sg-ad2556ac",
              "GroupName": "default"
            }
          ],
          "ClientToken": null,
          "InstanceType": "m1.small"
        }
      ],
      "Groups": [
        {
          "GroupId": "sg-ad2556ac",
          "GroupName": "default"
        }
      ],
      "ReservationId": "r-f4fc3ff6",
      "OwnerId": "317282958305"
    }
  ]
}

 

start-instances

EC2インスタンスを開始します。インスタンスIDはスペース区切り("instance-id" "instance-id")の形で復数渡す事が可能です。

$ aws ec2 start-instances --instance-ids i-8490db86

 

stop-instances

EC2インスタンスを停止します。インスタンスIDはスペース区切り("instance-id" "instance-id")の形で復数渡す事が可能です。

$ aws ec2 stop-instances --instance-ids i-8490db86

 

reboot-instances

EC2インスタンスを再起動します。インスタンスIDはスペース区切り("instance-id" "instance-id")の形で復数渡す事が可能です。

$ aws ec2 reboot-instances --instance-ids i-8490db86

 

terminate-instances

EC2インスタンスを終了/消去させます。

$ aws ec2 terminate-instances --instance-ids i-8490db86

 

bundle-instance

(ネタ的に長くなりそうなのでこのコマンドは別エントリにて後日対応したいと思います。)

 

import-instance

(ネタ的に長くなりそうなのでこのコマンドは別エントリにて後日対応したいと思います。)

EC2:モニター(monitor)に関する操作

 

monitor-instances

実行中のインスタンスのモニタリング機能を有効にします。

$ aws ec2 monitor-instances --instance-ids i-6a8ec568
{
    "InstanceMonitorings": [
        {
            "InstanceId": "i-6a8ec568", 
            "Monitoring": {
                "State": "pending"
            }
        }
    ], 
    "ResponseMetadata": {
        "RequestId": "e35d2504-f223-4853-9750-05cd1333867a"
    }
}

モニタリングに関しては以下の情報を参照。以下『Enabled Detailed Monitoring』ボタンを押下したのと同じアクションを実施する事になります。ちなみにこちらの詳細モニタリング、別途料金が発生致しますのでご注意。

Amazon CloudWatch (リソースとアプリケーションのモニタリング) | アマゾン ウェブ サービス(AWS 日本語)

monitor-instance-1

 

unmonitor-instances

実行中のインスタンスのモニタリング機能を無効にします。上記操作を戻す形ですね。

$ aws ec2 unmonitor-instances --instance-ids i-6a8ec568
{
    "InstanceMonitorings": [
        {
            "InstanceId": "i-6a8ec568", 
            "Monitoring": {
                "State": "disabling"
            }
        }
    ], 
    "ResponseMetadata": {
        "RequestId": "8875048b-c394-4fcd-931b-396e27781d0f"
    }
}

EC2:インスタンスステータス(instance-status)に関する操作

 

describe-instance-status

EC2インスタンス情報のステータスを表示します。スケジュールされた2つの情報について知る事が出来ます。

  • Rebootのスケジュール(system-reboot or instance-reboot)
  • インスタンスのシャットダウン(instance-retirement)
$ aws ec2 describe-instance-status --instance-ids i-6a8ec568
[
    {
        "InstanceId": "i-6a8ec568", 
        "InstanceState": {
            "Code": 16, 
            "Name": "running"
        }, 
        "AvailabilityZone": "ap-northeast-1a", 
        "SystemStatus": {
            "Status": "ok", 
            "Details": [
                {
                    "Status": "passed", 
                    "Name": "reachability"
                }
            ]
        }, 
        "InstanceStatus": {
            "Status": "ok", 
            "Details": [
                {
                    "Status": "passed", 
                    "Name": "reachability"
                }
            ]
        }
    }
]

 

report-instance-status

インスタンスのレポートを出力するコマンド?ヘルプ見る限りだと特に説明記述は無い模様。

ヘルプを見つつ実行してみます。ステータスを指定するところで実行は出来ました(true)が、特に結果は帰って来ていないみたい。どういう使い方するのかしら?これはひとまず保留としたいと思います。

ec2-report-instance-status - Amazon Elastic Compute Cloud

EC2:インスタンス属性情報(instance-attribute)に関する操作

 

describe-instance-attribute

インスタンスの属性値(attribute)に関する情報を取得。1回での呼び出しでインスタンスIDと属性1つを指定する必要があります。指定出来るのは以下。

  • instanceType
  • kernel
  • ramdisk
  • userData
  • disableApiTermination
  • instanceInitiatedShutdownBehavior
  • rootDeviceName
  • blockDeviceMapping

実行してみましたが、今イチ結果がおかしい?instanceTypeだけが得られると思っていたら、ひと通り結果が返って来て居たり(結果内容は微妙い)。

$ aws ec2 describe-instance-attribute --instance-id i-6a8ec568 --attribute instanceType{
    "UserData": {
        "Value": "t1.micro"
    }, 
    "ResponseMetadata": {
        "RequestId": "38704544-3dd8-4486-828c-0d17e18222bc"
    }, 
    "ProductCodes": [], 
    "InstanceId": "i-6a8ec568", 
    "InstanceInitiatedShutdownBehavior": {
        "Value": "t1.micro"
    }, 
    "RootDeviceName": {
        "Value": "t1.micro"
    }, 
    "EbsOptimized": {
        "Value": false
    }, 
    "BlockDeviceMappings": [], 
    "KernelId": {
        "Value": "t1.micro"
    }, 
    "RamdiskId": {
        "Value": "t1.micro"
    }, 
    "DisableApiTermination": {
        "Value": false
    }, 
    "InstanceType": {
        "Value": "t1.micro"
    }
}

ひと通り返ってくる結果の中から所定の内容のみ抽出して使ってください、という事であれば、データとしては抽出出来てそうです。

$ aws ec2 describe-instance-attribute --instance-id i-6a8ec568 --attribute 'instanceType' | jq '.InstanceType'
{
  "Value": "t1.micro"
}
$ aws ec2 describe-instance-attribute --instance-id i-6a8ec568 --attribute  'disableApiTermination' | jq '.DisableApiTermination'
{
  "Value": false
}
$ aws ec2 describe-instance-attribute --instance-id i-6a8ec568 --attribute  'instanceInitiatedShutdownBehavior' | jq '.InstanceInitiatedShutdownBehavior'
{
  "Value": "terminate"
}
$ aws ec2 describe-instance-attribute --instance-id i-6a8ec568 --attribute  'rootDeviceName' | jq '.RootDeviceName'
{
  "Value": "/dev/sda1"
}

$ aws ec2 describe-instance-attribute --instance-id i-6a8ec568 --attribute  'userData' | jq '.UserData'
{
  "Value": "IyEvYmluL2Jhc2ggLWV4CmVjaG8gJ2hlbGxvLCBlYzItd29ybGQhJw=="
}

 

modify-instance-attribute

インスタンスの属性値を変更します。instance-idと共に以下の属性キー、値を指定して変更する模様。

aws ec2 modify-instance-attribute
  --instance-id <value>
  [--attribute <value>]
  [--value <value>]
  [--block-device-mappings <value>]
  [--source-dest-check <value>]
  [--disable-api-termination <value>]
  [--instance-type <value>]
  [--kernel <value>]
  [--ramdisk <value>]
  [--user-data <value>]
  [--instance-initiated-shutdown-behavior <value>]
  [--groups <value>]
  [--ebs-optimized <value>]

インスタンスタイプを変更してみます。元々t1.microでしたが...

modify-instance-01

コマンド実行で、

$ aws ec2 modify-instance-attribute --instance-id i-6a8ec568 --attribute instanceType --value m1.small
{
    "return": "true", 
    "ResponseMetadata": {
        "RequestId": "d554d17b-b84c-41fc-86a1-7ed1b905263a"
    }
}

変更されました!

modify-instance-02

 

reset-instance-attribute

属性値情報のリセットを行います。しかしこのコマンド、現状ではkernel , ramdiskの2つしか対応していない模様です。

$ aws ec2 reset-instance-attribute --instance-id i-6a8ec568 --attribute kernel
{
    "return": "true", 
    "ResponseMetadata": {
        "RequestId": "fdfbe429-1a73-4712-a7a8-157fed59a5a6"
    }
}