最近何かと話題の「クラウド・コンピューティング」。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に放り込んで定時実行すれば、自動バックアップシステムの完成である。
#!/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にファイルが正しく送信・保存されることを確認し、一連のインストール作業を終了。