massの日記

日々の薪

s3cmdを使ってみた

サービスで利用している画像ファイルをAWSに移行することになった。

今までS3そのものは使ったことがあったけれど、s3cmdは使ったことがなかったが、今回はサーバ側にs3cmdを入れてもらい、それを利用することになった。s3cmdを使うことになった理由として、下記の点がある。

  • アプリ側とAWSの鍵情報を切り離して考えやすい
  • ライブラリの選定などしなくてよい

以前はアプリ側の設定ファイルに秘密鍵とトークンを書いていたけれど、今回は外部サービスにアプリケーションのソースを配置しているので、できるだけ設定関係のファイルはアプリケーションの中から排除したかった。そこで、コマンドベースにすれば、管理上アプリから切り離しやすいといった流れになり、s3cmdを使うことになった。

s3cmdの使い方はとてもシンプルで、ファイルの追加、取得、削除は簡単にできる。

#ファイルの追加
s3cmd -c #{config_file} put #{path_from} s3://#{bucket_name}/#{s3_path_to} 
#ファイルの取得
s3cmd -c #{config_file} get s3://#{bucket_name}/#{s3_path_to} 
#ファイルの削除
s3cmd -c #{config_file} del s3://#{bucket_name}/#{s3_path_to} 
#ファイルの確認
s3cmd -c #{config_file} info s3://#{bucket_name}/#{s3_path_to} 
#bucketの確認
s3cmd -c #{config_file} ls s3://#{bucket_name}/
#bucketとの同期
s3cmd -c #{config_file} sync #{path_from} s3://#{bucket_name}/#{s3_path_to} 

※オプションとして任意のファイルのみ、任意のファイルを除外といった指定もできる。例えば、svnファイルは除外したいというときは、下記のようにすればよい。
s3cmd -c #{config_file} put --exclude '.svn*' #{path_from} s3://#{bucket_name}/#{s3_path_to}

内部的にはHTTPの通信が行われて、pythonで作られている。ソースコードは公開されているので、内部でどんな処理が行われているかみればわかる。ソースコードはさほど多くないので、サクサク読める。
今回設定ファイルで制御したのは、socket_timeoutの設定だった。デフォルトは300秒=5分となっており、Webアプリケーションとしてはそれはないよね?というtimeout設定だった。また、timeoutの設定値はリトライの待機時間としても使用されているようなので、ここを300秒にしておくとリトライが走った場合に5分以上の待ち時間が発生する、多分。
S3へのアップロード時間を毎日1時間おきに測定したところ1.5Mの1ファイルをアップするのにおおよそ1秒かかっていた。しかし、1週間に3回ほどは5秒くらいになっていたので、timeout設定は5秒にしておくことにした。

他にも、今回はS3をwebsite化したり、bucketをロギングしたりと、使ったことのない機能をいくつか使ってみた。
またconfigファイルに設定できる情報がwebに見当たらなかったので次のブログで各設定値をまとめてみたい。今回はs3cmdの備忘録としてシンプルな使い方だけ書いておく。