11 November 2008

(Perl) LinuxサーバからAmazon S3を用いる (1/2)

最近何かと話題の「クラウド・コンピューティング」。Amazon S3が10月下旬に正式サービスになったことを受けて、企業の情報システムでもコスト削減と信頼性向上のため、このサービスを使わない手はない。 情報システムを一気にクラウドに移行するのではなく、まずはバックアップをクラウドに対して行うという比較的ハードルの低いところから攻めてみようと思う。

LinuxサーバのデータをAmazon S3にバックアップするための、Perlスクリプト(実証コード)を実行するためのインストール作業。

CentOS 5.2(Linux)をインストールした状態で、ApacheとMySQLが稼動している最低限のWebサーバでこの作業を行う。このサーバには、開発環境(gccなど)もセットアップされていない状態。

CPANでNet::Amazon::S3モジュールをインストールすればよいのだが、このモジュールが依存している別モジュールを全てインストールする必要がある。おそらく、次の順でインストールすれば良いと思われる。

・gcc

・libxml2-devel

・Bundle::CPAN

・LWP

・LWP::UserAgent::Determined

・XML::LibXML

・Net::Amazon::S3

なお、用いたPerl実証コードは次のようなもので、単にファイルをAmazon S3に転送保存するだけ。ここまで出来れば、あとはcronに放り込んで定時実行すれば、自動バックアップシステムの完成である。

amazon-s3-test.pl

#!/usr/bin/perl
use strict;
use warnings;

use Net::Amazon::S3;

my $s3 = Net::Amazon::S3->new(
{ aws_access_key_id => 'ユーザのKEY IDをここに入力',
aws_secret_access_key => 'ユーザのACCESS KEYをここに入力',
}
);

my $bucket = $s3->bucket('ファイルの保存先バケットをここに入力');

# ファイル転送
$bucket->add_key_filename( 'test_dest.dat', 'test_src.dat',
{ content_type => 'application.octet-stream', },
);


実際に、試行錯誤しながらインストールした経過は…

まず、Net::Amazon::S3を素直にインストールしようとしたら、途中でエラーが発生し長時間フリーズ状態となる。LWP::UserAgent::Determinedモジュールのインストール途中で異常が発生しているようである。


[root@localhost ~]# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install Net::Amazon::S3


~ 中略 ~

Writing Makefile for LWP::UserAgent::Determined
cp lib/LWP/UserAgent/Determined.pm blib/lib/LWP/UserAgent/Determined.pm
Manifying blib/man3/LWP::UserAgent::Determined.3pm
/usr/bin/make -- OK
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/01_about_verbose......ok
t/10_determined_test....ok 5/11 ← ここでフリーズする

Ctrl+C を押して強制終了すると、この先の処理が進む ~

/usr/bin/make install -- OK

cpan>

LWP::UserAgent::Determinedモジュールの組み込みが終了していないため、『Perlの実証コード』を起動すると、当然のことながらエラーとなる。


[root@localhost perl]# perl amazon-s3-test1.pl ← 実証コードを起動してみる
Can't locate LWP/UserAgent/Determined.pm in @INC ~ 中略(パス名)~ at
/usr/lib/perl5/site_perl/5.8.8/Net/Amazon/S3.pm line 106.

LWP/UserAgent/Determined.pmが見つからない、つまりLWP::UserAgent::Determinedモジュールのインストール失敗が再検証されたわけである。

もう一度LWP::UserAgent::Determinedをインストールしてみることとする。


[root@localhost perl]# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install LWP::UserAgent::Determined

~ 中略 ~

t/10_determined_test....ok 5/11# Test 9 got: "2" (t/10_determined_test.t at line 79)
# Expected: "1"
# t/10_determined_test.t line 79 is: ok $before_count, 1;
# Test 10 got: "2" (t/10_determined_test.t at line 81)
# Expected: "1"
# t/10_determined_test.t line 81 is: ok $after_count, 1;
t/10_determined_test....ok 8/11 t/10_determined_test....NOK 9 t/10_determined_test....FAILED tests 9-10
Failed 2/11 tests, 81.82% okay
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
t/10_determined_test.t 11 2 18.18% 9-10
Failed 1/2 test scripts, 50.00% okay. 2/13 subtests failed, 84.62% okay.
make: *** [test_dynamic] エラー 255
/usr/bin/make test -- NOT OK
Running make install
make test had returned bad status, won't install without force

先ほどエラーとなってフリーズしていたところで、数分程度気長に待っていると、エラーが自動的に検知されて先に進むが、最終的に「2/13 subtests failed」ということで、インストールは完了しない。


解決の糸口が無いかと、メッセージを見回してみると、CPAN自体が何らかのメッセージを発しているのを発見する。


[root@localhost ~]# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

「コマンドラインのヒストリ機能を有効にするには、Bundle::CPANをインストールしたらどうか」という、どちらかというと今回の件とは関係なさそうなメッセージだが、一般的なパッケージの詰め合わせであるBundle::CPANに何らかの依存モジュールがあることも考えられるので、とりあえずインストールしてみることに。(Googleで調べると、同時にLWPもよく使われるコンポーネントとして紹介されているので、ついでにインストールしておく)


cpan> install Bundle::CPAN

cpan> install LWP

cpan> reload cpan
.......................................................................................................................................................................................................
199 subroutines redefined

再び、LWP::UserAgent::Determinedモジュールのインストールを行うと、成功した。(話は脱線するが、コマンドラインにヒストリ機能が加わり、プロンプトの後ろにヒストリ番号 [1] というのが今回から現れている)


cpan[1]> install LWP::UserAgent::Determined

再び実証コードを起動してみると、今度はXML/LibXML.pmモジュールが足りないそうである。


[root@localhost perl]# perl amazon-s3-test1.pl ← 実証コードを起動してみる
Can't locate XML/LibXML.pm in @INC ~ 中略(パス名)~ at
/usr/lib/perl5/site_perl/5.8.8/Net/Amazon/S3.pm line 108.

XML::LibXML.pmモジュールのインストールを行うと、エラーとなる。xmlとlibxml2ライブラリが足りないようである。


cpan[1]> install XML::LibXML

~ 中略 ~

using fallback values for LIBS and INC
options:
LIBS='-L/usr/local/lib -L/usr/lib -lxml2 -lm'
INC='-I/usr/local/include -I/usr/include'
If this is wrong, Re-run as:
$ /usr/bin/perl Makefile.PL LIBS='-L/path/to/lib' INC='-I/path/to/include'

looking for -lxml2... no
looking for -llibxml2... no
libxml2 not found

Try setting LIBS and INC values on the command line
Or get libxml2 from
http://xmlsoft.org/
If you install via RPMs, make sure you also install the -devel
RPMs, as this is where the headers (.h files) are.

Also, you may try to run perl Makefile.PL with the DEBUG=1 parameter
to see the exact reason why the detection of libxml2 installation
failed or why Makefile.PL was not able to compile a test program.
No 'Makefile' created PAJAS/XML-LibXML-1.68.tar.gz
/usr/bin/perl Makefile.PL -- NOT OK
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install
Failed during this command:
PAJAS/XML-LibXML-1.68.tar.gz : writemakefile NO -- No 'Makefile' created

libxml2ライブラリをインストールする。


[root@localhost perl]# yum install libxml2

[root@localhost perl]# yum install libxml2-devel ← ライブラリだけならこちらのみ

再度XML::LibXML.pmモジュールのインストールを行っても、エラーとなる。原因はよく分からない。相変わらずlibxml2ライブラリは見つからないというメッセージは出たまま…


cpan[1]> install XML::LibXML

~ 中略 ~

enable native perl UTF8
running xml2-config...ok (2.6.26)
looking for -lxml2... no
looking for -llibxml2... no
libxml2 not found

~ 略 ~

CPAN自体に、警告メッセージらしきものが出ているので、とりあえずそれを解決してみることとする。


[root@localhost perl]# cpan
cpan shell -- CPAN exploration and modules installation (v1.9301)
ReadLine support enabled

Can't ioctl TIOCGETP: 無効な引数です
Consider installing Term::ReadKey from CPAN site nearby
at http://www.perl.com/CPAN
Or use
perl -MCPAN -e shell
to reach CPAN. Falling back to 'stty'.
If you do not want to see this warning, set PERL_READLINE_NOWARN
in your environment.
cpan[1]>

Term::ReadKeyモジュールをインストールしてみる。今度はgccが存在しないというエラーが表示される。


cpan[1]> install Term::ReadKey

~ 中略 ~

I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE" ReadKey.c
/bin/sh: gcc: command not found
make: *** [ReadKey.o] エラー 127
JSTOWE/TermReadKey-2.30.tar.gz
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
Make had returned bad status, install seems impossible
Failed during this command:
JSTOWE/TermReadKey-2.30.tar.gz : make NO

gccをインストールする。(まさか、GNU Cコンパイラがインストールされていないとは思わなかった…)


[root@localhost perl]# yum install gcc

再度、Term::ReadKeyモジュールをインストールし、成功。


cpan[1]> install Term::ReadKey

そして、XML/LibXML.pmモジュールのインストールを行い、やっと成功。


cpan[1]> install XML/LibXML.pm

Perl実証コードを実行して、Amazon S3にファイルが正しく送信・保存されることを確認し、一連のインストール作業を終了。