今回は、コマンドライン(CUI)から EC2インスタンを 作成、削除する操作を行います。


・前準備

以前の手順に従って、AmazonLinux を OS とする EC2インスタンスを起動します。起動した AmazonLinux に ssh 接続し、アクセスキー設定もしておいてください。
AWS上に用意した AmazonLinux環境経由でなく、ローカルPCに Amazonが提供するコマンドライン用のツールをインストールしておいても構いません(ソチラの方が普通かも???)。



・リージョンを固定するための設定
まず、AWS側に登録済みの keypais (ssh鍵)の確認してみます。
$ ec2-describe-keypairs
あれ? 何も表示されませんけど...。ここでは、default という keypair が存在するはずなのですが…。 ec2-describe-keypairs --help として、ヘルプを見てみましょう。
-U, --url URL
    Specify URL as the web service URL to use. Defaults to the value of
    'https://ec2.amazonaws.com' (us-east-1) or to that of the
    EC2_URL environment variable (if set). Overrides the default.

--region REGION
    Specify REGION as the web service region to use.
    This option will override the URL specified by the "-U URL" option
    and EC2_URL environment variable.
    This option defaults to the region specified by the EC2_URL environment variable
    or us-east-1 if this environment variable is not set.
ヘルプを見てみると上記のように記載されています。つまり、環境変数 EC2_URL あるいは --url / --region オプションで指定しない限り、us-east-1 がデフォルトのリージョンとして使用されてしまうようです。
毎回手動で設定するのもメンドクサイので、環境変数設定用のバッチに追記しておくことにします。
cat ~/bin/initaws.sh
#!/bin/sh
export AWS_ACCESS_KEY='アクセスキー文字列'
export AWS_SECRET_KEY='シークレットアクセスキー文字列'
export EC2_URL='ec2.ap-northeast-1.amazonaws.com'
これで、特に指定しなければ tokyo リージョンが指定されることになります。用意したバッチを使って、環境変数 EC2_URL を設定しておいてください。
source ~/bin/initaws.sh
環境変数を設定してから、ec2-describe-keypairs もう一度実行してみると……
$ ec2-describe-keypairs
KEYPAIR default **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**
バッチリ。ちゃんと tokyo リージョンに登録されているはずの default という名前の鍵が表示されています。



・新しい鍵ペアの登録
keypair を追加するには ec2-add-keypair (ec2addkey や ec2-create-keypair でも同じらしい)というコマンドを使用するみたい。ここでは sample というキーペアを作成してみます。
$ ec2-add-keypair sample
KEYPAIR sample  63:*5:*0:*d:*6:*8:*0:*9:*5:*3:*3:*f:*a:*f:*e:*2:*3:*e:*4:22
-----BEGIN RSA PRIVATE KEY-----
*II*pA*BA*KC*QE*kW*Yx*MH*W9*+F*r6*28*+U*6i*Wf*cU*Jc*3M*54*qy*lp*af*FO*Ed*NG*



*2q*/S*GS*Ns*4k*cz*4t*B1*au*yG*qc*HB*6B*xf*RK*tv*dR*uE*Gp*ss*bw*4T*q/*==
-----END RSA PRIVATE KEY-----
出力結果の一行目はフィンガープリントで、二行目以下が秘密鍵ファイルですね…。二行目以降の部分(-----BEGIN RSA PRIVATE KEY----- 以降の部分)を sample.pem として保存しておいてください。ここでは ~/.ssh/sample.pem として保存しておきます。
⇒ 保存した pem ファイルのpermissionを設定、他人から読み取られないようにしておいてください。
    chmod og= ~/.ssh/sample.pem とします。
   この操作をしていないと、後で、ssh コマンドを使用する際にエラーになってしまいます。


・セキュリティグループの作成
ファイアーウォールというか iptables というか、それらに相当するのがAWSのセキュリティグループらしいです。何も設定していないと、デフォルトですべての通信を遮断するらしいので、ここでは 22番(ssh)ポートを解放する sample という名前のグループを設定します。

セキュリティグループを作成するコマンドは ec2-add-group (ec2-create-group、ec2addgrp でも同義らしい)です。ここでは sample という名前の新規グループを作成します。
$ ec2-add-group sample --description 'sample security group'
GROUP   sg-692e5b68     sample  sample security group
出来たばかりセキュリティグループには、何も設定(フィルタ)が無いので、 22~25番ポート(ssh)を通過させる設定を追加します(23,24,25 ポートは不要ですが、範囲指定のサンプルとして開放しています)
セキュリティグループにフィルタ設定を追加するのは ec2-authorize (ec2auth でも同じ)コマンドで、以下のように設定します。
$ ec2-authorize \
     sample \
     --protocol tcp \
     --port-range 22-25 \
     --cidr '0.0.0.0/0'
GROUP                   sample
PERMISSION              sample  ALLOWS  tcp     22      25      FROM    CIDR    0.0.0.0/0       ingress
ingress は「外から中に向かってパケットが通過する場合の設定」ということらしいです。
反対は egress。

とりあえず、これでセキュリティグループは出来たつもり。



・EC2インスタンスの作成
EC2インスタンスを起動するためのコマンドは ec2-run-instances (ec2run でもOK) です。ヘルプをザッと眺める限り、ここで指定しておいた方が良さそうなパラメータは以下の通り。
AMI識別子(ブートイメージ)
--group セキュリティグループ(複数指定可能)
--key 使用するkeypair
--instance-count 起動するインスタンスの数
--instance-type インスタンスタイプ(マイクロとかラージとか)
--availability-zone AZ。指定しなければ適当な場所が選択されるらしい…
--disable-api-termination TerminationProtectionの設定
--instance-initiated-shutdown-behavior シャットダウン時の挙動(stop/terminate)
AMI識別子は…ec2-describe-images で探せるらしいのですが、--filter オプションを使ってもウマク探せませんでした。AWS Management Console (のEC2起動用 ClassicWizard)から探すか、あるいは ec2-describe-images --all として出力されたものの中から探すか…になると思います。AM識別子が分かっているなら、ソレを使うと良いでしょう。
ここでは、Ubuntu Server 12.04.1 LTS である ami-20ad1221 を使用することにします。

セキュリティグループは今回は1つしか使用しません。複数設定する場合は --group A --group B --group C ...というように、オプションを複数回使用するようです(※未調査)。

インスタンスタイプは…コマンドラインから直接識別子を得る方法が分かりませんでした。Amazon のサイトにインスタンスタイプ一覧があったので、そこから識別子を抽出して利用します。マイクロは「t1.micro」となるようです。
⇒ http://aws.amazon.com/jp/ec2/instance-types/

AvailabilityZones は ec2-describe-availability-zones コマンドで一覧が入手できます。全リージョンのものを一度に入手することはできないようなので、希望するリージョンを指定する必要があります。
$ ec2-describe-availability-zones
AVAILABILITYZONE        ap-northeast-1a available       ap-northeast-1
AVAILABILITYZONE        ap-northeast-1b available       ap-northeast-1
AVAILABILITYZONE        ap-northeast-1c available       ap-northeast-1

$ ec2-describe-regions
REGION  eu-west-1       ec2.eu-west-1.amazonaws.com
REGION  sa-east-1       ec2.sa-east-1.amazonaws.com
REGION  us-east-1       ec2.us-east-1.amazonaws.com
REGION  ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
REGION  us-west-2       ec2.us-west-2.amazonaws.com
REGION  us-west-1       ec2.us-west-1.amazonaws.com
REGION  ap-southeast-1  ec2.ap-southeast-1.amazonaws.com
REGION  ap-southeast-2  ec2.ap-southeast-2.amazonaws.com

$ ec2-describe-availability-zones --region eu-west-1
AVAILABILITYZONE        eu-west-1a      available       eu-west-1
AVAILABILITYZONE        eu-west-1b      available       eu-west-1
AVAILABILITYZONE        eu-west-1c      available       eu-west-1
最終的に、EC2インスタンスを作成するためのコマンドは以下のような感じ。
$ ec2-run-instances  ami-20ad1221 \
     --group sample  \
     --key sample  \
     --instance-count 1  \
     --instance-type t1.micro  \
     --availability-zone ap-northeast-1a  \
     --disable-api-termination  \
     --instance-initiated-shutdown-behavior stop

RESERVATION     r-3763df34      354893364746    sample
INSTANCE        i-15490116      ami-20ad1221                    pending sample  0               t1.micro        2013-01-21T13:39:27+0000       ap-northeast-1a aki-ec5df7ed                    monitoring-disabled                                     ebs                                    paravirtual     xen             sg-692e5b68     default false

実行してしばらく待てば EC2インスタンスの起動が完了します。ec2-describe-instance コマンドで確認すれば、起動が完了したかどうか分かります。インスタンスID(i-で始まる識別子)を指定すれば、そのインスタンスだけ調べられます。

起動が完了すれば、ssh でログインできます。
ssh -i ~/.ssh/sample.pem -l ubuntu YOUHOSTNAME.compute.amazonaws.com


・EC2インスタンスの削除
作成したEC2インスタンスは不要になったら削除します。まずは、インスタンスを STOP させます。

$ ec2-stop-instances i-15490116
INSTANCE        i-15490116      running stopping

$ ec2-describe-instances i-15490116
RESERVATION     r-3763df34      354893364746    sample
INSTANCE        i-15490116      ami-20ad1221    ec2-54-248-202-225.ap-northeast-1.compute.amazonaws.com ip-10-132-98-57.ap-northeast-1.compute.internal        stopping        sample  0               t1.micro        2013-01-21T13:39:27+0000        ap-northeast-1a        aki-ec5df7ed                    monitoring-disabled     54.248.202.225  10.132.98.57                    ebs                                    paravirtual     xen             sg-692e5b68     default false
BLOCKDEVICE     /dev/sda1       vol-8f02b5ad    2013-01-21T13:39:31.000Z        true

$ ec2-describe-instances i-15490116
RESERVATION     r-3763df34      354893364746    sample
INSTANCE        i-15490116      ami-20ad1221                    stopped sample  0               t1.micro        2013-01-21T13:39:27+0000       ap-northeast-1a aki-ec5df7ed                    monitoring-disabled                                     ebs                                    paravirtual     xen             sg-692e5b68     default false
BLOCKDEVICE     /dev/sda1       vol-8f02b5ad    2013-01-21T13:39:31.000Z        true
インスタンスのSTOP状態が確認できたら、次は TerminationProtectionを解除します。

AWSのマニュアルによるとTerminationProtectionを disable にするための専用コマンドは無いみたいなので、汎用のコマンドで設定解除します。
⇒ http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_ChangingDisableAPITermination.html
$ ec2-modify-instance-attribute i-15490116 --disable-api-termination false
disableApiTermination   i-15490116      false
ec2-modify-instance-attribute という長~いコマンド名に、EC2インスタンスID と合わせて解除指定を行えばOK。インスタンス作成時と違って、すぐに応答があります。


最後に、EC2インスタンスを terminate します。ec2-terminate-instances (ec2kill というのも同義らしい)コマンドを使います。
$ ec2-terminate-instances i-15490116
INSTANCE        i-15490116      stopped terminated
Terminate 処理が完了しているかどうか、ec2-describe-instances で確認しておきましょう。
$ ec2-describe-instances i-15490116
RESERVATION     r-3763df34      354893364746    sample
INSTANCE        i-15490116      ami-20ad1221                    terminated      sample  0               t1.micro        2013-01-21T13:39:27+0000       ap-northeast-1a aki-ec5df7ed                    monitoring-disabled                                    ebs                                     paravirtual     xen             sg-692e5b68     default false
ちゃんと、teminated となっていますね。



・セキリティグループの削除
今回作った sample というセキュリティグループを削除します。
ec2-delete-group コマンド(ec2delgrpでも同じ)を使います。
$ ec2-delete-group sample
RETURN  true
キチンと消えたかどうか、ec2-describe-group を使って確認しておいてください。



・keypair の削除
ここでは、sample という名のkeypair を作りましたが、もう使わないので削除しておきます。間違った鍵を消さないように注意してください(^^;
$ ec2-delete-keypair sample
KEYPAIR sample
こちらも、キチンと消えたかどうか ec2-describe-keypairs コマンドで確認しておいてください。




これで、EC2インスタンスの起動と終了を コマンドラインから操作できるようになりました!