普段 AWS CLI を使うことはそんなにないんですが、S3 コマンドだけはよく使うのでまとめました。といっても全てではなく、ファイルやディレクトリ操作に関する部分です。
基本コマンド
AWS CLI の S3 コマンドは以下の形式で実行します。
aws s3 <Command> [<Arg> ...]
基本的に Arg の箇所はパスを入力することになるのですが、ローカルのパスは「ローカルファイルまたはディレクトリの絶対パスまたは相対パス」、S3のパスは「s3://<bucket>/<prefix>/<object>」となります。prefix とはディレクトリやフォルダのイメージです。
Command | Description |
---|---|
cp | オブジェクトのコピー |
ls | オブジェクトの一覧 |
mb | S3バケットの作成 |
mv | オブジェクトの移動 |
rb | S3バケットの削除 |
rm | オブジェクトの削除 |
sync | ディレクトリの同期 |
s3 — AWS CLI 1.8.0 documentation
バケットの作成/削除
バケットを作成するにはmb
コマンドを使用します。--region us-west-1
オプションを付けるとリージョンの指定も可能です。バケットの削除にはrb
コマンドを使用します。バケット内にオブジェクトが存在すると失敗しますので、問題ない場合は--force
オプションを使用します。
# バケットの作成 $ aws s3 mb s3://workbt make_bucket: s3://workbt/ # バケットの削除 $ aws s3 rb s3://workbt remove_bucket failed: s3://workbt/ A client error (BucketNotEmpty) occurred when calling the DeleteBucket operation: The bucket you tried to delete is not empty $ aws s3 rb s3://workbt --force delete: s3://workbt/test1.txt remove_bucket: s3://workbt/
S3にファイルをコピー/S3からファイルをコピー
ファイルのコピーにはcp
コマンドを使用しますが以下の3パターンがあります。LocalPath は絶対パスか、カレントディレクトリからの相対パスで指定します。
- ローカルからS3にコピー
aws s3 cp <LocalPath> <S3Path>
- S3からローカルにコピー
aws s3 cp <S3Path> <LocalPath>
- S3からS3にコピー
aws s3 cp <S3Path> <S3Path>
# ローカルからS3にファイルをコピーする $ aws s3 cp test1.txt s3://workbt/hoge/ upload: ./test1.txt to s3://workbt/hoge/test1.txt # S3Pathの最後がスラッシュでない場合は、ファイルとみなされてその名前でコピーされる $ aws s3 cp test1.txt s3://workbt/hoge upload: ./test1.txt to s3://workbt/hoge # S3からローカルにファイルをコピー $ aws s3 cp s3://workbt/hoge/test1.txt ./ download: s3://workbt/hoge/test1.txt to ./test1.txt # S3からS3にコピー $ aws s3 cp s3://workbt/hoge/test1.txt s3://workbt/fuga/ copy: s3://workbt/hoge/test1.txt to s3://workbt/fuga/test1.txt # ディレクトリを再帰的にコピー $ aws s3 cp bar/ s3://workbt/ --recursive upload: bar/test1.txt to s3://workbt/test1.txt upload: bar/test1.jpg to s3://workbt/test1.jpg upload: bar/test2.txt to s3://workbt/test2.txt upload: bar/test2.jpg to s3://workbt/test2.jpg # --include は試した結果 --exclude オプションに対してじゃないと効かなかった # つまり --exclude で対象外にしたファイルに対して --include で対象にしたいファイルを指定する # 以下は全て対象外にして *.txt ファイルだけ対象にしている例 $ aws s3 cp bar s3://workbt/ --exclude "*" --include "*.txt" --recursive upload: bar/test1.txt to s3://workbt/test1.txt upload: bar/test2.txt to s3://workbt/test2.txt # --include を複数指定することも可能 $ aws s3 cp bar s3://workbt/ --exclude "*" --include "*.txt" --include "*.jpg" --recursive # --acl オプションでアクセスコントロールを指定 $ aws s3 cp test2.txt s3://workbt/hoge/ --acl private upload: ./test2.txt to s3://workbt/hoge/test2.txt
cp
コマンドについてはこれ以外にもオプションがいくつかありますが、別枠でまとめたいと思います。--acl
オプションについては アクセスコントロールリスト(ACL)の概要 - Amazon Simple Storage Service を参照。
S3にファイルを移動/S3からファイルを移動
ファイルの移動にはmv
コマンドを使用します。基本的にはcp
コマンドと同じですが、移動元にファイルが残りません。
# ローカルからS3に移動 $ aws s3 mv test1.txt s3://workbt/hoge/ move: ./test1.txt to s3://workbt/hoge/test1.txt # S3からローカルに移動 $ aws s3 mv s3://workbt/hoge/test1.txt ./ move: s3://workbt/hoge/test1.txt to ./test1.txt # S3からS3に移動 $ aws s3 mv s3://workbt/hoge/test1.txt s3://workbt/fuga/ move: s3://workbt/hoge/test1.txt to s3://workbt/fuga/test1.txt
バケットのオブジェクト一覧
バケット内のオブジェクト一覧を確認したい場合はls
コマンドを使用します。ls
コマンドの場合は引数のS3パスにs3://
のプレフィックスは不要です。
# 引数なし - バケット一覧 $ aws s3 ls 2015-08-30 14:05:20 workbt # 引数あり - オブジェクト一覧 $ aws s3 ls s3://workbt PRE text/ 2015-08-30 14:06:09 525217 test1.txt # --recursive オプションで再帰的に表示 $ aws s3 ls workbt --recursive 2015-08-30 14:06:09 525217 test1.txt 2015-08-30 14:08:27 16363 text/test2.txt # --human-readable オプションでサイズの表示を変更 # --summarize オプションでオブジェクトの数とサイズを集計 $ aws s3 ls workbt --recursive --human-readable --summarize 2015-08-30 14:06:09 512.9 KiB test1.txt 2015-08-30 14:08:27 16.0 KiB text/test2.txt Total Objects: 2 Total Size: 528.9 KiB
オブジェクトの削除
オブジェクトの削除にはrm
コマンドを使用します。以下の例以外のオプションとして--quiet
オプションは結果を表示しない、--only-show-errors
オプションはエラーとワーニングのみ表示する、というものがあります。
# オブジェクトの削除 $ aws s3 rm s3://workbt/test1.txt delete: s3://workbt/test1.txt # ディレクトリは削除出来ない $ aws s3 rm s3://workbt/hoge A client error (404) occurred when calling the HeadObject operation: Key "hoge" does not exist Completed 1 part(s) with ... file(s) remaining # --recursive オプションでディレクトリを再帰的に削除 $ aws s3 rm s3://workbt/hoge --recursive delete: s3://workbt/hoge/test1.txt # --recursive オプションを付けてもバケットは削除できない $ aws s3 rm s3://workbt --recursive delete: s3://workbt/hoge/test1.txt $ aws s3 ls 2015-08-30 14:05:20 workbt # --dryrun オプションを付けるとどのように削除されるか確認できる $ aws s3 rm s3://workbt --recursive --dryrun (dryrun) delete: s3://workbt/hoge/test1.txt (dryrun) delete: s3://workbt/hoge/test2.txt # --include と --exclude オプションは後に付けたオプションが優先される $ $ aws s3 rm s3://workbt --recursive --exclude "*.jpg" --include "*" delete: s3://workbt/hoge/test1.jpg delete: s3://workbt/hoge/test2.jpg
|オプション|機能| |--dryrun|実際に実行しないでコマンドの挙動だけを確認| |--quiet|実行結果の非表示| |--recursive|指定したディレクトリ、またはプレフィックス以下全てに対して実行| |--include <value>|対象のオブジェクトを指定| |--exclude <value>|対象外のオブジェクトを指定| |--only-show-errors|エラー、またはワーニングのみ結果を表示|
ディレクトリの同期
ディレクトリの同期をする場合はsync
コマンドを使用します。ファイル単位のコピーはできません。
# ローカルのディレクトリを同期 $ aws s3 sync bar s3://workbt/bar/ upload: bar/test1.jpg to s3://workbt/bar/test1.jpg upload: bar/test2.jpg to s3://workbt/bar/test2.jpg upload: bar/test1.txt to s3://workbt/bar/test1.txt upload: bar/test2.txt to s3://workbt/bar/test2.txt # 2回目以降は変更のあったファイルのみ同期されます $ vi bar/test2.txt $ aws s3 sync bar s3://workbt/bar/ upload: bar/test2.txt to s3://workbt/bar/test2.txt # ファイルを同期しようとするとディレクトリとみなされてできません $ aws s3 sync bar/test1.txt s3://workbt warning: Skipping file /Users/tasukujp/Documents/aws_work/bar/test1.txt/. File does not exist. Completed 0 part(s) with ... file(s) remaining # デフォルトでは削除されたファイルは同期されません $ rm bar/test1.txt $ rm bar/test2.txt $ aws s3 sync bar s3://workbt/bar/ # 何も起こらない $ aws s3 sync bar s3://workbt/bar/ --delete # 削除ファイルも同期する delete: s3://workbt/bar/test1.txt delete: s3://workbt/bar/test2.txt