読者です 読者をやめる 読者になる 読者になる

AWS CLIのS3コマンドまとめ

AWS CLI
スポンサーリンク

普段 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