Home > 11月, 2013

2013.11.22

Instanceから作成したAMIの中で最新のAMI IDを取得してみた

タイトルの通りです。

使うときは一番最初のechoで出力するインスタンスIDを検索したいIDに書き換えて使います。

$ echo [インスタンスID] | xargs -i aws --output text ec2 describe-instances --instance-ids {} | awk 'BEGIN{FS="\t"} {if($1=="INSTANCES") {rootdev=0;vol="";dev=$17;} if($1=="BLOCKDEVICEMAPPINGS") {if($2==dev) rootdev=1; else rootdev=0;} if($1=="EBS" && rootdev==1) vol=$5;} END{print vol}' | xargs -i aws --output text ec2 describe-snapshots --filters Name=volume-id,Values={} | sort -t$'\t' -k 6 -r | head -n 1 | cut -f5 | xargs echo | sed 's/ /,/g' |  xargs -i aws --output text ec2 describe-images --filters Name=block-device-mapping.snapshot-id,Values={} | awk 'BEGIN{FS="\t"} {if($1=="IMAGES") print $5;}'

ちなみに指定したInstanceから作成したAMI IDの一覧を出力するには

$ echo [インスタンスID] | xargs -i aws --output text ec2 describe-instances --instance-ids {} | awk 'BEGIN{FS="\t"} {if($1=="INSTANCES") {rootdev=0;vol="";dev=$17;} if($1=="BLOCKDEVICEMAPPINGS") {if($2==dev) rootdev=1; else rootdev=0;} if($1=="EBS" && rootdev==1) vol=$5;} END{print vol}' | xargs -i aws --output text ec2 describe-snapshots --filters Name=volume-id,Values={} | cut -f5 | xargs echo | sed 's/ /,/g' |  xargs -i aws --output text ec2 describe-images --filters Name=block-device-mapping.snapshot-id,Values={} | awk 'BEGIN{FS="\t"} {if($1=="IMAGES") print $5;}'

さすがにこれはscriptで書いた方がもっと出力工夫できた
と思いつつも後悔はしていない。

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つくらいいたので、これは手動で削除しました。