s3cmdでS3に簡単アップロード

このエントリーをはてなブックマークに追加
| コメント(0) | トラックバック(0)

S3話題続きです。

現在仕事でもS3(とCloudFront)使ったりしてますがs3cmdの使い方を簡単に紹介します。

s3cmdとは

s3cmd --helpとして出てくる通りS3を管理できるツールです。
バケットを作成したりファイルやフォルダをアップロードしたり公開設定を指定したりといった事が簡単にできます。

S3cmd is a tool for managing objects in Amazon S3 storage. It allows for
making and removing "buckets" and uploading, downloading and removing
"objects" from these buckets.


s3cmdのインストール

Amazon EC2インスタンス(Amazon Linuxを想定)の場合は以下のコマンドでyumインストールできます。

yum --enablerepo=epel install s3cmd

CentOS(RHEL)系は以下のようにs3toolsのサイトから対象のバージョンのrepoファイルのURLをコピーしてダウンロードすることでyumインストールが可能です。

cd /etc/yum.repos.d
curl -O http://s3tools.org/repo/RHEL_5/s3tools.repo
yum install s3cmd


初期設定

s3cmd --configure で初期設定を行います。
アクセスキーIDとシークレットアクセスキーはAWS ManagementConsoleからそれぞれ取得して設定します。
設定する内容は以下のとおり。

Access Key アクセスキーIDを指定
Secret Key シークレットアクセスキーを指定
Encryption password GPG encryptionを用いる事でデータを暗号化してくれるようです。(よく分かっていません)
Path to GPG program [/usr/bin/gpg] GPGの場所を指定します。特に変更はいらないと思いますので空のままで良いと思います
Use HTTPS protocol [No] S3への通信をHTTPSにするか否かです。(DefaultはNo)HTTPSを用いることで通信効率はHTTPよりも劣ります
HTTP Proxy server name Proxyを使う場合はその指定

あとはSave Settingで'y'と入力すれば設定は完了です。

バケットを作成

コマンドは以下の通りです。

s3cmd mb --bucket-location=<Region> s3://<BucketName>

指定するものは以下の2点です。
Region
AWSの一覧からバケットを作成するロケーションを指定します。
指定するものはテーブルの"Location Constraint"欄の文字列を指定します。
BucketName
バケット名を指定します。バケット名はすべてのAWSアカウントで共通となるためかぶらないような名前を指定する必要があります。
作った後は以下のコマンドで確認することが可能です。

s3cmd ls


ファイルをアップロード

次にファイルをアップロードしてみます。

s3cmd put /path/to/file s3://<bucket-name>/path/to/file

通信状態が悪かった場合などアップロードに失敗した場合は通信設定を変えながら何度か試行するようです。
※ローカルでは6回(再試行5回)失敗後アップロード失敗となりました。

フォルダをアップロード

フォルダ以下の全てをS3にアップロードします。

s3cmd put --recursive /path/to/folder s3://<bucket-name>/path/to/folder

※ --recursiveは-rでも可能です。

S3上のファイルの取得

ファイル取得はgetコマンドで実行します。

s3cmd get -r s3://<bucket-name>/path/to/folder /path/to/folder


公開設定/非公開設定

S3はS3上にHTMLや画像ファイルなど静的ファイルを置いてWebサイトをホスティングしたりもできます。あるいはCloudFrontのバックグラウンドにS3を指定してS3上の静的ファイルをキャッシュさせることも可能です。
その場合にはS3上のファイルを公開設定する必要があります。

ファイルまたはフォルダをアップロード時に公開オプション(--acl-public)をつけることで公開設定が行えます。

s3cmd put -r --acl-public /path/to/folder s3://<bucket-name>/path/to/folder

またDefaultでは非公開設定ですが、明示的に非公開設定を行う場合には非公開オプション(--acl-private)をつけることも可能です。

S3上のファイルの削除

ファイルとフォルダは同一のコマンド(del)で削除可能です。
フォルダは(--recursive or -r)オプションをつけてください。

s3cmd del -r s3://<bucket-name>/path/to/folder

バケットの削除

バケットを削除する場合はrbコマンドで実行します。
rbコマンド実行前にはバケット内に何もファイルやフォルダがある場合エラーとなります。

s3cmd rb s3://<bucket-name>


その他

--add-headerオプション

 --add-headerオプションをつけることでアップロードしたファイルにヘッダを付与できます。
これは例えばCloudFrontを利用した場合Cache-Control:max-age=300というヘッダをつけた場合
CloudFront側でキャッシュする時間を300秒に指定することができます。

syncコマンド

s3cmd sync -r /path/to/folder s3:///path/to/folder
とすることでrsyncのように更新の有ったものだけをアップロードすることが可能です。
ただ全部のファイルに対して更新を確認するためファイル数が多い場合は結構時間を要します。

ローカルからよりEC2インスタンスから

これはTIPSになるのですが、AWS外部からs3cmdを行うよりAWS内部でs3cmdを行ったほうが転送速度がかなり高速です。
そのためS3にアップロードする場合はEC2インスタンスにrsyncなどでアップロードするかsvn uploadやgit pullなどでバージョン管理から更新してEC2インスタンスからS3にアップロードした方が効率的です。
アップロードするだけであればマイクロインスタンス(+EBS)でも充分だと思いますのでコスト面でもそれほど負担は多くないのでオススメですよ。

トラックバック(0)

トラックバックURL: http://makeitsmartjp.com/cms/mtos/mt-tb.cgi/70

コメントする