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を使ってインスタンスに関連づいていないセキュリティグループを削除してみます。
コードは以下のようになりました。

require 'aws-sdk'

use_security_groups = []
security_groups = []

client = Aws::EC2::Client.new(
  :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
  :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
  :region => ENV['AWS_REGION']
)

resource = Aws::EC2::Resource.new(client: client)

client.describe_instances.reservations.each do |resp|
  use_security_groups.push resp.instances[0].security_groups[0].group_id
end

resource.security_groups.each do |security_group|
  next if security_group.group_name == 'default'
  security_group.delete unless use_security_groups.include? security_group.group_id
end
※AWS SDK for RubyはV2、Rubyは2.2を利用しています。

実行にあたっては、EC2へアクセスする権限を持ったIAMユーザのアクセスキー、シークレットキーおよび削除したいセキュリティグループがあるリージョンを環境変数にセットしておく必要があります。

・AWS_ACCESS_KEY_ID→アクセスキー
・AWS_SECRET_ACCESS_KEY→シークレットキー
・AWS_REGION→リージョン(東京リージョンなら"ap-northeast-1")

AWS SDKを利用しても、セキュリティグループ側から関連づいているEC2の情報は得られないため、"EC2側から利用しているセキュリティグループを取得"→"全セキュリティグループから、取得したセキュリティグループにないものを削除"の手順でセキュリティグループを削除しています。

注意点としては、セキュリティグループはEC2だけでなく、RDSなどでも利用されています。今回のコードでは、EC2で利用しているセキュリティグループ以外は全て削除しようとしますが、RDSと関連づいているセキュリティグループがあった場合、削除することができません。
そのため、事前にRDSと関連づいているセキュリティグループがないかを確認したうえで、実行する必要があります。

もしセキュリティグループがありすぎて、整理できていない方は、一度お試しください。


補足:AWS SDK for Ruby v2の導入方法・利用方法

①gemを利用してAWS SDK for Ruby v2を導入する。
コマンドとしては下記の通りです。
gem install aws-sdk
※現在(2015年9月)では最新バージョンがv2なので、バージョンを指定しないとv2が自動でインストールされますが、将来的にv3以降が出た場合、v2であることを明記する必要があるので、ご注意ください。

②アクセスキー・シークレットキーの情報を設定する
AWS CLIと同様、AWSの各サービスにアクセスする権限を持ったIAMユーザのアクセスキー・シークレットキーの情報を設定します。
設定方法としては、主に次の2つの方法が用意されています。

1.credentialsファイルとして配置する。
 アクセスキー・シークレットキーの情報をcredentialsファイルとして記載し、保存します。ファイルの保存場所は、Linux系なら"~/.aws/credentials"、Windowsなら"C:\Users\ユーザ名\.aws\credentials"です。
 credentialsファイルのフォーマットは下記の通りです。
[profile_name]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットキー

なお、"profile_name"に"default"を設定すると、SDK利用時のデフォルトのアクセスキー・シークレットキーと見なされます。それ以外の任意の名前を選択した場合、SDK利用時にどのアクセスキー・シークレットキーを利用するかを指定する必要があります。

2.環境変数として設定する
 アクセスキー・シークレットキーの情報を環境変数として設定します。設定する環境変数は下記の通りです。
AWS_ACCESS_KEY_ID= アクセスキー
AWS_SECRET_ACCESS_KEY= シークレットキー

以上の手順を踏むことで、AWS SDK for Ruby v2を利用することができるようになります。

0 件のコメント:

コメントを投稿