s3cmdをPHPのexecで使うときの些細な盲点

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
盲点の解説図

この記事を三行にまとめると

s3cmdコマンドをPHPから実行したい
ファイルの実行権限に気をつけよう
他人様の彼女に手を出しちゃダメ
AWSを使っている人は、S3っていうストレージサービスを使っていると思うんですが、あのS3を使うのに便利なツールとして、s3cmdってのがあります。

僕はS3ではなくて、S3と互換性が高い別のストレージサービスを使っているんですが、そこでもs3cmdは使えるとのことで、最近、やたらといじくり倒しております。

使い方自体はそんなに難しくなくて、SSHでサーバーに接続してコマンドを叩いてファイルをアップロードしたり削除したりってとこまではわりとスムーズに行けたんですが、PHPのexec()やらshell_exec()でs3cmdコマンドを使おうと思ったらすんなりと行かなくて……今回はそれについてのお話っす。

いつものごとく、解決してみりゃ何てことない話だったんですが、解決するまでになかなか時間がかかってしまいまして……検索しても同じようにつまづいている人がなかなか見つからなかったし、だからあえてここに書こうじゃないかと。

意外に検索しても情報が見つからなかったってことは、こんなの当たり前すぎることだから、分からない僕がよほどアホなだけだったのか、情報の検索の仕方が悪かったということで、検索が下手な僕がよほどアホなだけだったのか。そのいずれかだと思います。



s3cmdについて

たぶん、この記事に辿り着くような人はすでにs3cmdを使えている人だと思うので、無駄な情報になってしまうような気もするんですが、s3cmdのコマンドを使えるようにするまでの手順を、簡単にさらっとおさらいしときましょー。

僕はCentOS6系を使っているので、今回はそれ前提で行きます。

まずは、s3cmdをインストールしてます。

# wget http://sourceforge.net/projects/s3tools/files/s3cmd/1.5.0-alpha3/s3cmd-1.5.0-alpha3.tar.gz
# tar zxvf s3cmd-1.5.0-alpha3.tar.gz
# cd s3cmd-1.5.0-alpha3
# python setup.py install

途中、何かしらのエラーとかが出なければ、この4つの手順を踏めばインストールが完了します。

やっていることは、wgetでs3cmdをダウンロードしてきて、それを解凍し、pythonコマンドを使ってインストールしています。今回は「s3cmd-1.5.0-alpha3」というバージョンをインストールしました。このバージョンはそのうち上がるだろうから、そのときに応じて最新のものをインストールすると良いと思います。何で僕が今回このバージョンを使ったかっていうと、お世話になっているストレージサービスのマニュアルに、このバージョンを推奨するって書いてあったから。ただそれだけっす。

インストールが完了したら、次は初期設定を行います。以下のコマンドを打って、初期設定を移行しましょう。

# s3cmd --configure

「Access Key」やら「Secret Key」やらの入力を求められますが、まあ、そんなに難しいことは聞かれませんし、もしうっかり間違えちゃっても設定はし直せますから、そこら辺は今回は省略させてもらいやす。アクセスキーなどの入力以外は、基本何も入力せずにエンターを押しときゃ設定は完了できます。

設定が終了すると、こんなメッセージが出るはずです。

Configuration saved to '/root/.s3cfg'

rootディレクトリの下に「.s3cfg」というファイルが保存されたっていう内容ですね。実際、rootディレクトリを見てみると、.s3cfgというファイルができているはずです。できてなかったら何かを間違えていると思うのだけど、何を間違えているのかはちょっと僕には分からない。すまんです。

この.s3cfgというファイルが無事にできれば、s3cmdコマンドを使えるようになります。YATTA!



.s3cfgファイルにapacheが手を出せないと……

じゃあ、SSHで接続した場合はs3cmdが使えているという前提で……今度はそれを、PHPから使いたい。

結論から言うと、上記の手順でs3cmdをインストールしただけだと、PHPのexec()では動きません。実際にやってみりゃ分かる。

例えばバケットを参照する場合。

//正常に動く
# s3cmd ls

//正常に動かない
exec('s3cmd ls', $output);

正常に動けば、$outputにバケットのリストが入っているはずなのですが……それがない。

何が問題なのかってーと、さっき出て来た「.s3cfg」というファイルの権限です。

人によって違う場合もあるかもしれませんが、通常、サーバーでPHPを実行するユーザーはapacheです。だけど.s3cfgっていうのは、実行権限を持っているのがrootなんですね。だからapacheは手が出せない。町中で見かけた理想の女性、何とかお近づきになって、あわよくば交際したい。そう思っていたのだけれど、彼女は地元でも有名なそっち系の親玉の女であることが判明。彼女と添い遂げたいけれど、相手が相手だけにどうしても手が出せない。言うなれば、そういう状態です。

じゃあどうするか。方法はいくつか考えられるけど、今ここで提供できるのは、何とかして彼女の細胞の一部を入手して、それを元に彼女のクローン人間を作り、その人に手を出す……といったところでしょうか。

.s3cfgというファイルは、デフォルトではrootディレクトリの直下に置かれますが、別に必ずしもここになければいけないということはないので、適当なディレクトリ、もちろんapacheがアクセスできるところじゃないとダメですけど、そこに.s3cfgを移動させるなりコピーするなりして、ついでにそのファイルの権限もrootからapacheに変えてしまえば良い。

# cp /root/.s3cfg /var/www/.s3cfg
# chown apache:apache /var/www/.s3cfg

こんな感じですかね。/var/www/の下に置くかどうかは個人の自由です。絶対ここじゃなきゃいけないってわけじゃなくて、例えばの話ね。

これで何とか彼女のクローンに手を出すことができましたね。YATTA!!



コピー先の.s3cfgを使えるようにする

残念ながら、話はここで終わりではない。もう一つだけ、やらなきゃいけない作業があるのです。

s3cmdコマンドを使う際、何も設定しないと、rootディレクトリの下にある.s3cfgファイルを使おうとしてしまうので、これをコピー先の方を使うように宣言しないといけない。

その方法は、こうっす。

exec('s3cmd -c /var/www/.s3cfg ls');

s3cmdコマンドには「c」っていうオプションがあって、そこで.s3cfgファイルのパスを指定することで、任意の.s3cfgを使うことができるようになるみたいです。なので、ここでapacheが手を出せる方のファイルを使用するようにしてやれば良い。

これでPHPのexec()などでも問題なくs3cmdコマンドが使えるはずです。もし使えなかった場合は……うーん、何がいけないんだろう。やっぱり人の女に手を出しちゃいけないってことなのかなぁ……クローン人間を作ることも、基本的には禁止されてるし……。






ファイルの実行権限ってのは、盲点でした。今回はs3cmdの話でしたけど、たぶんこれ、他の場合でも起こり得ることですよね。

何かが上手く動かないってときに、ファイルの権限をチェックするっていうのは意外とやらなかったので、これは別の機会にも活かせるかもしれないなーと、思いました。

今回得られた教訓は二つですね。

・ファイルの権限も気にしよう
・人の女には手を出してはいけない

肝に銘じておきます。
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2015年01月05日 07:11:21
Cheers pal. I do apicerpate the writing.
2015年04月01日 01:14:15
You couldn't pay me to ignore these posts!
2015年04月01日 09:59:55
まっち~(管理人)
>Kaylie
Sorry, I can't understand what apicerpate meaning.

>levitra
Oh dear…