EC2インスタンスをawscliから操作する

Pocket

今までAWS Management ConsoleからEC2インスタンスの作成、停止、起動をしていました。
しかし次のような不都合を感じることが多くなりました。

  • 実験用のインスタンスを作ったり削除したりする場合はいつも同じAMI、セキュリティグループを使用することが多い。 → 一発でインスタンスを作成したい。
  • マイクロインスタンスといえども1ヶ月動かし続けると金額がバカにならないので、節約のため使わない時はこまめに停止する必要がある。(インスタンス停止中はElastic IPの課金が発生するっぽいですが・・・)
    いつも勉強用に使うEC2インスタンスの起動と停止はAWS Management Consoleからやっているのですが、その度にログイン、EC2のメニューに行く、右クリックして起動・停止操作で手が腱鞘炎になる。

そこで以前インストールしてそれっきりのawscliがあるので、それを使ってみることにしました。あまり詳しい使い方はわかっていないのですが、地味に感動したのでメモしておきたいと思います。

ここではawscliと、jqというJSON処理コマンドを使っているので、こちらのツールのインストールに関しては

をご覧になってみてください。なお、最近のAmazon LinuxのAMIには初めからawscliがインストールされているみたいです。なので適切なアクセスキーの設定をすればすぐに使えるようになります。

EC2インスタンスのAPI操作の手順

準備

まず、AWS Management Console上でEC2インスタンスを立ち上げるときにAMI IDも一緒に表示されていると思うのでそれをメモリます。
ちなみに現時点で私のよく使用しているAmazon Linux 64bitのAMIは ami-0d13700c でした。
awscliの設定では既にデフォルトリージョンが指定されているものと仮定します。

Amazon Linux AMI 2013.09.2 - ami-0d13700c (64-bit) / ami-0b13700a (32-bit)

ちなみに、長い名前のサブコマンドが続きますが、これはタブ補完が使えます。便利。

EC2インスタンスの起動

ここではAmazon Linux 64bitのAMIのマイクロインスタンスを1個 作成します。
必要最低限のオプションに絞ると以下のコマンドで立ち上げられることがわかりました。

aws ec2 run-instances --image-id ami-0d13700c --count 1 --instance-type t1.micro --key-name MyKeyPair --security-groups MySecurityGroup
  1. ここで指定されるセキュリティグループ MySecurityGroup では予めSSHのポートが開けてあるものとします。
  2. 既にMyKeyPairという鍵ペアがEC2コンソール上で作成されていることを前提とします。

EC2インスタンスの一覧を得る

以下のコマンドで現在定義されているインスタンスの一覧情報を取得します。
ここでEC2のインスタンスIDを調べておきます。
ずらずらとJSONが表示されて非常に見づらいですが、後ほどご紹介するjqコマンドでとてもみやすくできます。

aws ec2 describe-instances

EC2インスタンスの停止、起動、ターミネート

停止

EC2インスタンスが起動できているのを確認できたら停止します。インスタンスIDを指定するだけなので簡単です。
EBSをルートデバイスとするAMIのみでできます。AMIがS3から起動される場合はインスタンス自体が揮発性のものなのでインスタンスの停止=ターミネートの動作になります。

aws ec2 stop-instances --instance-ids i-01159999

起動

インスタンスを起動します。ここもインスタンスIDを指定するだけなので簡単です。

aws ec2 start-instances --instance-ids i-01159999

ターミネート

インスタンスを削除します。

aws ec2 terminate-instances --instance-ids i-01159999

jqコマンドにパイプして結果をみやすくする

これまでJSONがずらずら表示されて見づらかったと思います。JSONユーティリティのjqコマンドをインストールして使うと出力結果をシンタックスハイライト、整形して表示してくれてかなり見やすくしてくれます。以下はルートから展開するイメージ。

aws ec2 describe-instances | jq '.'

JSONの属性を掘り下げていくことで目的のインスタンス情報を整理して取得することができるようになります。詳しい使い方はまだわかっていないので、実際に私が試して便利だったフィルタリング方法を記載してみたいと思います。

パブリックDNS名

aws ec2 describe-instances | jq '.Reservations [] .Instances [] .PublicDnsName'

インスタンスID

aws ec2 describe-instances | jq '.Reservations [] .Instances [] .InstanceId'

AMI ID

aws ec2 describe-instances | jq '.Reservations [] .Instances [] .ImageId'

インスタンスの状態

aws ec2 describe-instances | jq '.[] [] .Instances [] .State'
{
  "Name": "running",
  "Code": 16
}
{
  "Name": "stopped",
  "Code": 80
}

リージョンの一覧

aws ec2 describe-regions | jq '.Regions [] .RegionName'
"eu-west-1"
"sa-east-1"
"us-east-1"
"ap-northeast-1"
"us-west-2"
"us-west-1"
"ap-southeast-1"
"ap-southeast-2"

まとめ

最後に、身も蓋もないですが、常用する予定のないすぐに壊すこと前提の単純なEC2インスタンスを扱う場合は普通にVagrant providerがあるようなので、そちらのほうが楽なのかなあと思います。

参考文献

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください