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にファイルが正しく送信・保存されることを確認し、一連のインストール作業を終了。