2015年9月16日水曜日

AWS SDK for Rubyでインスタンスに関連づいていないセキュリティグループを削除する

こんにちは、井下です。

前回の鷲尾のブログに引き続いて、AWS SDK for Rubyを利用して、AWSの操作を行ってみます。
AWSへの操作という点では、AWS CLIと同じなのですが、SDKの場合は好きな言語で操作を行える点が魅力ですね。
なお、今回利用するAWS SDK for Rubyはv2です。導入方法・利用方法は最後に補足として説明しています。

さて、今回のテーマはタイトル通り、インスタンスに関連づいていないセキュリティグループの削除ですが、セキュリティグループはいくつ作っても課金対象ではありません。
そのセキュリティグループをわざわざSDKで削除させようとしているのは、セキュリティグループが意図せず増える土壌があるからです。

まず、EC2インスタンスを新規作成するとき、デフォルトの設定ではセキュリティグループもそのインスタンス用に新規作成・関連づけしてくれるようになっています。
ただし、EC2インスタンスを削除するときには、関連づいたセキュリティグループを削除してくれません。恐らくはセキュリティグループの仕様として、セキュリティグループ1つで複数のEC2インスタンスと関連づけが可能なためですね。

つまり、"とりあえず使える環境が欲しい"とEC2インスタンスをデフォルト設定で作成・削除を繰り返すと、使われないセキュリティグループがどんどん増えていきます。
また、セキュリティグループの一覧画面からは、EC2インスタンスに関連づいているかが見えないため(EC2インスタンス側からは、どのセキュリティグループが関連づいているかが見えます)、不要なセキュリティグループの削除には手間がかかってしまいます。

下の画像は私個人のAWSコンソールですが、EC2インスタンス4つに対し、セキュリティグループは19個もあります。15個は使われてない&今後使われることもないセキュリティグループです…。

前置きが長くなりましたが、実際にAWS SDK for Rubyを使ってインスタンスに関連づいていないセキュリティグループを削除してみます。
コードは以下のようになりました。

2015年9月11日金曜日

AWS SDK for Ruby を使って、インスタンスの一覧を取得してみる

こんにちは。
鷲尾です。

現在AWSからは様々な言語用のSDKが提供されていますが、今回はRuby用のSDK"AWS SDK for Ruby"を使って、AWS上のインスタンスの一覧を取得したいと思います。


それでは、はじめにプログラムを実行する準備からです。

1.必要なもの
RubyでAWSのインスタンス情報を取得する際に必要となるものは、以下の4つです。

・Rubyの実行環境
・AWS SDK for Ruby
・AWSアカウント(認証情報)
・リージョン情報(EC2)


※今回は実行環境としてRedHatを使用していますが、事前にRubyのプログラムを実行できる環境を作成しておいてください。
※AWSアカウント、及びIAMユーザは既に作成済みであることを前提としています。RubyでAWSにアクセスする際にはIAMユーザを作成時にのみ取得することが出来る認証情報(シークレットアクセスキー)を使用しますので、忘れずに保存してください。

なお、現在使用できるリージョンの一覧を以下に記載します。(2015年9月7日現在)


リージョン一覧(引用:http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#ec2_region)
Region NameRegionEndpointProtocol
米国東部(バージニア北部)リージョンus-east-1ec2.us-east-1.amazonaws.comHTTP and HTTPS
米国西部(オレゴンリージョン)us-west-2ec2.us-west-2.amazonaws.comHTTP and HTTPS
米国西部(北カリフォルニア)リージョンus-west-1ec2.us-west-1.amazonaws.comHTTP and HTTPS
欧州(アイルランド)リージョンeu-west-1ec2.eu-west-1.amazonaws.comHTTP and HTTPS
アジアパシフィック(シンガポール)リージョンap-southeast-1ec2.ap-southeast-1.amazonaws.comHTTP and HTTPS
アジアパシフィック(シドニーリージョン)ap-southeast-2ec2.ap-southeast-2.amazonaws.comHTTP and HTTPS
アジアパシフィック(東京)リージョンap-northeast-1ec2.ap-northeast-1.amazonaws.comHTTP and HTTPS
南米(サンパウロ)リージョンsa-east-1ec2.sa-east-1.amazonaws.comHTTP and HTTPS



1.aws-sdkをインストールする
以下のようにGemコマンドを利用して、aws-sdkをインストールすることができます。
RubyでSDKを使用する場合は、非常に簡単に準備が出来てしまうのがいいですね。

なお、AWS SDK for Rubyには、"v1"と"v2"という2つのバージョンが存在します。本来はv2を使用する予定だったのですが、私の環境だとなぜかうまく動いてくれず、今回は泣く泣くv1を使用しています。そのため、今回は明示的にv1のバージョンを使用することを明記してSDKのインストールを行います。


gem install aws-sdk -v "~>1"


これでインストールは完了です。


2.Rubyのプログラムを作成する
では実際にインスタンスの一覧を取得するRubyのプログラムを作成します。
今回はインスタンスの一覧と同時に、"インスタンスのID"、"インスタンスのステータス"、"インスタンスのIPアドレス"の3つを取得してみます。


◆ aws_instance_list.rb
プログラムはこちらからダウンロード出来ます。

require 'aws-sdk-v1'

AWS.config(:access_key_id => 'アクセスキー',
           :secret_access_key => 'シークレットアクセスキー',
           :ec2_endpoint => 'リージョン')

ec2 = AWS::EC2.new
puts '#instance-id    status    ip-address'

ec2.instances.each{|instance|
  puts "#{instance.id}\t#{instance.status}\t  #{instance.ip_address}"
}



なお、処理の流れとしては、"aws-sdk"を使用するためにrequireで外部ライブラリを宣言しておき、AWS.configで認証情報を設定した後に、その認証情報をもとにインスタンス情報を取得してくるという流れになっています。


3.実行
それでは気を取り直して、作成したRubyプログラムを実行してみましょう。

プログラム修正後、プログラムを実行します。

ruby aws_instance_list.rb


実行結果:

[ec2-user@ip-172-31-40-77 ~]$ ruby aws_instance_list.rb
#instance-id    status    ip-address
i-9*******      stopped
i-a*******      stopped
i-7*******      stopped
i-5*******      running   52.**.***.**
i-e*******      running   52.**.***.**
i-5*******      stopped

このように、インスタンスID、インスタンスのステータス、インスタンスのIPアドレスを取得することが出来ました。
AWSでは基本的に実行しているインスタンスにしかグローバルIPアドレスは付与されないため、現在ステータスが"running(実行中)"のもの以外は、割り当てられていないために、表示されていません(※)。

※Elastic IPが割り振られているインスタンスであれば、ステータスが"stopped"でも、グローバルIPアドレスが表示されます。



以上、AWS SDK for Rubyを使用してAWSのインスタンス一覧を取得してくるまでの流れになります。

なお、取得できるインスタンスの情報として、今回の情報以外にも様々な情報を取得することが出来ます。

・使用できるメソッド一覧
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html#hypervisor-instance_method


使用する際は、ぜひ参考にしてみてください。

※v2での動作確認が出来ましたら、また報告します!


以上です。