2013.11.21
AWS OpsWorksを使うとStackを削除しても大量のSecurityGroupのゴミが残ります。
Nameが”AWS-OpsWorks-“で始まるゴミたちです。
やっかいなことにこれらのSecurityGroup同士が依存しあっているため(他のSecurityGroupがSourceに指定されている)手動で消すのは折れない心が無い限り無理です。
ということでAWS CLIを使って削除するコマンドを作ってみました。
regionやAccessKeyはconfigで指定されている前提です。
1 | $ 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を削除
上記コマンドを実行すると削除コマンドが標準出力に出力されます。
こんな感じ。
1 | aws ec2 revoke-security-group-ingress --group- id sg-f1637593 -- source -group sg-f4637596 --protocol tcp --port 1-65535 |
2 | aws ec2 revoke-security-group-ingress --group- id sg-f1637593 -- source -group sg-ef63758d --protocol udp --port 1-65535 |
3 | aws ec2 revoke-security-group-ingress --group- id sg-f1637593 -- source -group sg-ec63758e --protocol udp --port 1-65535 |
4 | aws ec2 revoke-security-group-ingress --group- id sg-f1637593 -- source -group sg-e963758b --protocol udp --port 1-65535 |
6 | aws ec2 delete-security-group --group- id sg-f7637595 |
7 | aws ec2 delete-security-group --group- id sg-ef63758d |
8 | aws ec2 delete-security-group --group- id sg-e863758a |
9 | aws ec2 delete-security-group --group- id sg-f1637593 |
なので結果を確認して問題なければ出力をパイプで”sh”に渡してあげると実行できます。
1 | $ 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つくらいいたので、これは手動で削除しました。