EC2使ってると新しいイメージを作った時に毎回前のイメージをS3から消し損ねそうになる。お金がもったいないしいやんいやんなので、スクリプト書いた。

以下のように呼び出すとEC2に登録したイメージをderegister+バケットを空にする。
perl ec2-remove-image.pl -a ACCESS_KEY -s SECRET_KEY -b BUCKET_NAME -i IMAGE_NAME
ソースはこんな感じ。あんまりテストしてないから気をつけて!
use strict; use Net::Amazon::S3; use Getopt::Long; use constant EC2_DEREGISTER => "/usr/local/ec2/bin/ec2-deregister"; main(); sub main { my %options; if (! GetOptions(\%options, "access_key|a=s", "secret_key|s=s", "bucket|b=s", "image|i=s", )) { exit 1; } my $aws_access_key_id = $options{access_key} or die "No access_key"; my $aws_secret_access_key = $options{secret_key} or die "No secret_key"; my $bucket = $options{bucket} or die "No bucket"; my $image = $options{image} or die "No image"; system("/usr/local/ec2/bin/ec2-deregister", $image) == 0 or die "Failed to execute ec2-deregister"; my $s3 = Net::Amazon::S3->new( { aws_access_key_id => $aws_access_key_id, aws_secret_access_key => $aws_secret_access_key, retry => 1, } ); my $bucket = $s3->bucket($options{bucket}); my $response = $bucket->list; foreach my $key ( @{ $response->{keys} } ) { next unless ( $key->{key} =~ /image\.part\.\d+$/ || $key->{key} eq 'image.manife st.xml'); print "deleting '$key->{key}'\n"; $bucket->delete_key( $key->{key} ) or die $s3->errstr; } }