2013.12.02
CloudTrailのデータは日次でディレクトリが作成された中に保存されるので、面倒なのでCLI使ってまとめて表示してみた。
$ bucket_name=[bucket_name] ;mkdir /tmp/trail-temp 2>/dev/null; aws s3 sync s3://${bucket_name} /tmp/trail-temp > /dev/null; find /tmp/trail-temp -type f -name "*.json.gz" | xargs -i gzip -cd {} | sed "s/\]}{\"Records\":\[/,/g"
一番最初の[bucket_name]だけCloudTrailの保存先に指定しているbucket名を指定して使います。
これでだらだらJSONが表示されるのでpytnonのjson.toolなんかを利用するとフォーマットされます。
$ bucket_name=[bucket_name] ;mkdir /tmp/trail-temp 2>/dev/null; aws s3 sync s3://${bucket_name} /tmp/trail-temp > /dev/null; find /tmp/trail-temp -type f -name "*.json.gz" | xargs -i gzip -cd {} | sed "s/\]}{\"Records\":\[/,/g" | python -m json.tool
DBとかにつっこんで利用する方法、まで書ければかっこよかったんですが
僕の場合ファイルに出力してvimで検索して満足したんで、これで終わりです。
2013.11.22
タイトルの通りです。
使うときは一番最初の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を使うと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つくらいいたので、これは手動で削除しました。