S3Syncを使ってローカルディレクトリからAmazon S3にファイルをアップロードする

まずはS3Syncをインストールします。

$ wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
$ tar zxvf s3sync.tar.gz
$ sudo cp -pr s3sync/ /usr/local/

ローカルディレクトリとAmazon S3間の通信にSSLを使いたいので、ssl.certs.sharをダウンロードして実行します。

$ mkdir /usr/local/s3sync/certs
$ cd /usr/local/s3sync/certs
$ wget http://mirbsd.mirsolutions.de/cvs.cgi/~checkout~/src/etc/ssl.certs.shar
$ sh ssl.certs.shar

自動実行するためのスクリプトを用意します。例えば、こんなの。

FILE : upload_to_s3

#!/bin/bash
# script to upload local directory upto s3
export EC2_URL=https://ec2.ap-southeast-1.amazonaws.com
export AWS_CALLING_FORMAT="SUBDOMAIN"
export AWS_ACCESS_KEY_ID=my_accesskey
export AWS_SECRET_ACCESS_KEY=my_secretkey
ruby /usr/local/s3sync/s3sync.rb -r --ssl --exclude="\.log$" /upload/from/ my_bucketname:upload/to/

AWS_CALLING_FORMAT="SUBDOMAIN"はサブドメイン形式(http://bucket.s3.amazonaws.com/key)でバケットを指定するという意味です。US-EAST以外のリージョンでS3Syncを使う場合、環境変数にこの設定をしておかないと、実行時に以下のエラーが発生します。

Permanent redirect received. Try setting AWS_CALLING_FORMAT to SUBDOMAIN
S3 ERROR: #<Net::HTTPMovedPermanently:0x2aaaaedd5ff8>

S3SyncのREADME.txtによれば、AWS_CALLING_FORMATの設定は以下のようになっています。

AWS_CALLING_FORMAT - Defaults to REGULAR
  REGULAR   # http://s3.amazonaws.com/bucket/key
  SUBDOMAIN # http://bucket.s3.amazonaws.com/key
  VANITY    # http://<vanity_domain>/key

スクリプトパーミッションを設定し、cronに登録します。

$ chmod 700 upload_to_s3
$ crontab -e
0       3       *       *       *       /home/myuser/bin/upload_to_s3

おしまい。