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;
}
}
コメント