前回の鷲尾のブログに引き続いて、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を利用しています。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
実行にあたっては、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 = シークレットキー
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットキー
なお、"profile_name"に"default"を設定すると、SDK利用時のデフォルトのアクセスキー・シークレットキーと見なされます。それ以外の任意の名前を選択した場合、SDK利用時にどのアクセスキー・シークレットキーを利用するかを指定する必要があります。
2.環境変数として設定する
アクセスキー・シークレットキーの情報を環境変数として設定します。設定する環境変数は下記の通りです。
AWS_ACCESS_KEY_ID= アクセスキー
AWS_SECRET_ACCESS_KEY= シークレットキー
AWS_SECRET_ACCESS_KEY= シークレットキー
以上の手順を踏むことで、AWS SDK for Ruby v2を利用することができるようになります。
0 件のコメント:
コメントを投稿