Furl::S3 を使ってオブジェクトのコピー

Amazon S3 をごにょるモジュールといえば Net::Amazon::S3 とか Amazon::S3 とかがあるのだけれど、LWP::UserAgent 使ってたり Net:: の方は Moose だったりするので、最近は Furl::S3 を使ってる。Furl::S3 には put とか get の基本的なメソッドとバケットの操作ぐらいしか無いんだけど、認証用のヘッダをよしなにしてくれる request メソッドがあるので追加のヘッダを指定してあげれば大抵の S3 の操作はできる。と思う。で、バケットのオブジェクトを別のバケットにまるっとコピーする必要があったので Furl::S3 でやってみた(同一のバケットでもやり方は同じ)。$header は2つめの参考文献に載ってるやつを必要に応じて指定するといいです。

実際には Coro::Semaphore とか Coro::Select あたりと組み合わせて並列にやってます。

use Furl::S3;

my $furl = Furl::S3->new(%conf);

my $source_bucket = 'from';
my $source_key    = 'path/to/photo.jpg';

my $copy_source = "/$source_bucket/$source_key";

my $header = {
    'x-amz-copy-source' => $copy_source,
    'x-amz-acl'         => 'public-read',
    'content_type'      => 'image/jpeg',
};

my $dest_bucket = 'to';
my $dest_key    = 'path/to/dir/image.jpg';

my $res = $furl->request('PUT', $dest_bucket, $dest_key, undef, $header);