Home > 11月 21st, 2013

2013.11.21

AWS OpsWorksのゴミを削除してみた

AWS OpsWorksを使うとStackを削除しても大量のSecurityGroupのゴミが残ります。
Nameが”AWS-OpsWorks-“で始まるゴミたちです。
やっかいなことにこれらのSecurityGroup同士が依存しあっているため(他のSecurityGroupがSourceに指定されている)手動で消すのは折れない心が無い限り無理です。

ということでAWS CLIを使って削除するコマンドを作ってみました。
regionやAccessKeyはconfigで指定されている前提です。

$ aws --output text ec2 describe-security-groups --filters Name=group-name,Values="AWS-OpsWorks-*" | awk 'BEGIN{FS="\t"; count=0; sg_cmd="aws ec2 delete-security-group --group-id "; ing_cmd="aws ec2 revoke-security-group-ingress"} {if($1=="SECURITYGROUPS") {sg="";pfrom=="";pto="";proto="";source="";sg=$3;sg_list=sg_list "\n" sg_cmd sg} if($1=="IPPERMISSIONS"){pfrom=$2;pto=$4;proto=$3;} if($1=="USERIDGROUPPAIRS") {source=$2;count=count+1;ingress_list[count]=ing_cmd " --group-id " sg " --source-group " source " --protocol " proto " --port " pfrom; if(pto!="-1") ingress_list[count]=ingress_list[count] "-" pto}} END{for(i in ingress_list) print ingress_list[i]; print sg_list}'

内容としてはこんな感じです。

・SecurityGroupのNameの先頭に「AWS-OpsWorks-」が付いているものをリストアップ
・リストアップされたSecurityGroupのInboudで、Sourceに他のSecurityGroupが指定されているルールを削除
・リストアップされたSecurityGroupを削除

上記コマンドを実行すると削除コマンドが標準出力に出力されます。

こんな感じ。

aws ec2 revoke-security-group-ingress --group-id sg-f1637593 --source-group sg-f4637596 --protocol tcp --port 1-65535
aws ec2 revoke-security-group-ingress --group-id sg-f1637593 --source-group sg-ef63758d --protocol udp --port 1-65535
aws ec2 revoke-security-group-ingress --group-id sg-f1637593 --source-group sg-ec63758e --protocol udp --port 1-65535
aws ec2 revoke-security-group-ingress --group-id sg-f1637593 --source-group sg-e963758b --protocol udp --port 1-65535
~~中略~~
aws ec2 delete-security-group --group-id sg-f7637595
aws ec2 delete-security-group --group-id sg-ef63758d
aws ec2 delete-security-group --group-id sg-e863758a
aws ec2 delete-security-group --group-id sg-f1637593

なので結果を確認して問題なければ出力をパイプで”sh”に渡してあげると実行できます。

$ aws --output text ec2 describe-security-groups --filters Name=group-name,Values="AWS-OpsWorks-*" | awk 'BEGIN{FS="\t"; count=0; sg_cmd="aws ec2 delete-security-group --group-id "; ing_cmd="aws ec2 revoke-security-group-ingress"} {if($1=="SECURITYGROUPS") {sg="";pfrom=="";pto="";proto="";source="";sg=$3;sg_list=sg_list "\n" sg_cmd sg} if($1=="IPPERMISSIONS"){pfrom=$2;pto=$4;proto=$3;} if($1=="USERIDGROUPPAIRS") {source=$2;count=count+1;ingress_list[count]=ing_cmd " --group-id " sg " --source-group " source " --protocol " proto " --port " pfrom; if(pto!="-1") ingress_list[count]=ingress_list[count] "-" pto}} END{for(i in ingress_list) print ingress_list[i]; print sg_list}' | sh -x

これで僕の環境はきれいになりました。

あとIAM Roleにも”aws-opsworks-“なゴミが2つくらいいたので、これは手動で削除しました。