@kyanny's blog

創造性は記憶によるところが大きい - 黒澤明

Net::Amazon::S3 と Config::Pit を使ってみた

Perl から S3 へアクセスできる Net::Amazon::S3 を試してみた。ブログにコピペするのに、アカウント情報をべた書きするのはまずい、かといってファイルに書いておいてオープンしてどうこう、を毎回やるのはだるい、そういえばそういうのを便利に扱える Config::Pit というのがあったはずだ、と思いだしてこれも使ってみた。

Net::Amazon::S3 の使い方じたいは、特に何も難しいこともなく。 description をみると「これは古いスタイルなので Net::Amazon::S3::Client を使うように」と書いてあった。同じディストリビューションに同梱されている。こちらをちらっとみると、ハッシュリファレンスへ直にアクセスしたりするのじゃなくてメソッド名でもうちょっといい感じに扱えるっぽい。とりあえず、古いスタイルのほうで書いてみた。

Config::Pit は以前チャレンジしたときはどういう仕組みになってるのかちゃんと説明を読まなかったので使い方がわからなかったが、今回は ruby の pit の説明の本家っぽい アカウント情報を管理するコマンド pit - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech とか pitがちょう便利だよ! (ついでに Net::Netrc の紹介) - noplans_rubyの日記 などを参考にしつつ、Config::Pit - Manage settings - metacpan.org と見比べて使ってみた。 YAML を自分で手書きするのは大変そうだなあ、どこに正しい書式が説明してあったっけ、とか思っていたらふつうにプログラムから設定できちゃうようで、楽だった。 $EDITOR が bash にも eshell にもなかったので bash のほうで /Application/Emacs.app/Contents/MacOS/bin/emacsclient とかを設定してやって、適当に書き捨ての pit_get('s3.amazonaws.com', require => {}) するだけのプログラムをかいて保存して終了。しかし emacsclient はオープンしたバッファに一切変更がないとファイルを保存しないのだろうか、 ppit get s3.amazonaws.com したら空のままだったので、適当に改行→バックスペースなどしてバッファに編集マークをつけてから保存して終了したら無事反映された。

#!/usr/bin/perl
use strict;
use warnings;
use Net::Amazon::S3;
use Perl6::Say;
use Data::Dumper;
use Config::Pit;
use Test::More; plan tests => 1;

my $config = pit_get('s3.amazonaws.com');

my $s3 = Net::Amazon::S3->new({
    aws_access_key_id => $config->{aws_access_key_id},
    aws_secret_access_key => $config->{aws_secret_access_key},
    retry => 1,
});

my $response = $s3->buckets;
for my $bucket (@{$response->{buckets}}) {
    say $bucket->bucket;
    my $response = $bucket->list_all;
    for my $key (@{$response->{keys}}) {
        my $key_name = $key->{key};
        my $key_size = $key->{size};
        next if $key_name =~ /^image\./;
        say "$key_name $key_size";
        my $response = $bucket->get_key_filename($key_name);
        say Dumper $response;
        my $response2 = $bucket->get_key($key_name);
        say Dumper $response2;
        is_deeply($response, $response2);
    }
}