Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

PerlでAWS S3にアクセスする

今やっている仕事でAWS S3上のファイルを取得する必要があり、AWSSDKを探していたんですが、AmazonさんはPerl用のモジュールは用意してくれていなかった・・

でもCPAN上にはたくさんモジュールがあり、中でも比較的によく使われているのは

という2つのモジュールだそうです。

Net::Amazon::S3は高機能で高依存なモジュールで、Amazon::S3は低機能で低依存なモジュールらしい・・

今後、使うこともなさそうだったので、Amazon::S3にしようと思ったのですが、シンプル過ぎてやりたいことができなかったorz

仕方がないのでNet::Amazon::S3を使ってみるとさっそくエラーが返ってきました(AWS S3をほとんど触ったことがなかったので何が何だか分からない・・)

RequestTimeTooSkewed: The difference between the request time and the current time is too large. at ...

「リクエスト時間とAWS S3のサーバ時間が違い過ぎるぞ!!」というエラーだそうで、開発サーバのローカルタイムを合わせたら普通にアクセスできるようになりました。

他にもAccessDeniedが返ってきたりしたんですが、ケアレスミスだったので割愛!!


ちなみに今回書いたコードは大体こんな感じです。

use strict;
use warnings;

use Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new(
  aws_access_key_id     => 'hogehoge',
  aws_secret_access_key => 'hugahuga',
);
my $client = Net::Amazon::S3::Client->new( s3 => $s3 );

my $bucket = $client->bucket( name => 'foofoo' );
my $object = $bucket->object( key  => 'barbar' );

print $object->get;

指定されたバケットのオブジェクトを取得しているだけの簡単なコードです。

参考URL

洗練されたPerl: Amazon S3 でのストレージ管理