AWS CLI S3のコマンドをまとめた俺俺チートシートです。
初めて使う方がハマりがちなポイントを押さえつつ、普段AWS CLI S3をお使いの方にも逆引きレシピとして使えるような形にしてみました。
以下のAWS公式ドキュメントの内容をベースにしています。
- s3 — AWS CLI 1.16.57 Command Reference
- AWS Command Line Interface での高レベルの S3 コマンドの使用 - AWS Command Line Interface
目次
大きく3つのセクションに分けて記載しています。文量がかなり多くなってしまったので適宜ページ内検索などでジャンプ頂くのが良さそうです。
- オブジェクトの読み込み操作
- オブジェクトの書き込み操作
- バケットの管理
ls - オブジェクトのリスト
aws s3 ls
コマンドではS3のバケットやオブジェクトのリスト操作が行えます。
このセクションではオブジェクトのリスト操作に絞って記載します。
- コマンドリファレンスのURL
オブジェクトとプレフィックスをリストする
S3 URIを指定するとオブジェクトとプレフィックスをリストできます。
プレフィックスはPRE
とマークされます。作成日時は出力されません。
$ aws s3 ls s3://example-mybucket
PRE mydir-a/
2018-10-20 23:28:42 3 bar.txt
2018-10-20 23:28:43 3 foo.txt
$ aws s3 ls s3://example-mybucket/mydir-a/
PRE mydir-b/
2018-10-20 23:33:15 0
2018-10-20 23:33:40 4 fuga.txt
2018-10-20 23:33:40 4 hoge.txt
オブジェクトとプレフィックスを再帰的にリストする
--recursive
オプションを付けると再帰的にリストできます。
プレフィックスはサイズが0
で出力されます。作成日時も出力されます。
$ aws s3 ls s3://example-mybucket --recursive
2018-10-20 23:28:42 3 bar.txt
2018-10-20 23:28:43 3 foo.txt
2018-10-20 23:33:15 0 mydir-a/
2018-10-20 23:33:40 4 mydir-a/fuga.txt
2018-10-20 23:33:40 4 mydir-a/hoge.txt
2018-10-20 23:40:43 0 mydir-a/mydir-b/
2018-10-20 23:41:11 3 mydir-a/mydir-b/baz.txt
リスト結果をオブジェクトのみに絞り込む
grep
コマンドで末尾がスラッシュのものを除外することでオブジェクトのみをリストできます。
$ aws s3 ls s3://example-mybucket --recursive | grep -v '/$'
2018-10-20 23:28:42 3 bar.txt
2018-10-20 23:28:43 3 foo.txt
2018-10-20 23:33:40 4 mydir-a/fuga.txt
2018-10-20 23:33:40 4 mydir-a/hoge.txt
2018-10-20 23:41:11 3 mydir-a/mydir-b/baz.txt
リスト結果をプレフィックスのみに絞り込む
grep
コマンドで末尾がスラッシュのもののみに絞り込むことでプレフィックスのみをリストできます。
$ aws s3 ls s3://example-mybucket --recursive | grep '/$'
2018-10-20 23:33:15 0 mydir-a/
2018-10-20 23:40:43 0 mydir-a/mydir-b/
オブジェクトとプレフィックスのみ出力する
awk
コマンドと組み合わせることで作成日時とデータサイズを出力せずに、オブジェクトとプレフィックスのみ出力できます。
$ aws s3 ls s3://example-mybucket --recursive | awk '{print $4}'
bar.txt
foo.txt
mydir-a/
mydir-a/fuga.txt
mydir-a/hoge.txt
mydir-a/mydir-b/
mydir-a/mydir-b/baz.txt
前述のgrep
コマンドを用いたイディオムと組み合わせることで、オブジェクトのみ、またはプレフィックスのみ出力できます。
$ aws s3 ls s3://example-mybucket --recursive | grep -v '/$' | awk '{print $4}'
bar.txt
foo.txt
mydir-a/fuga.txt
mydir-a/hoge.txt
mydir-a/mydir-b/baz.txt
$ aws s3 ls s3://example-mybucket --recursive | grep '/$' | awk '{print $4}'
mydir-a/
mydir-a/mydir-b/
オブジェクトとプレフィックスのS3 URLを出力する
上記の応用でawk
コマンドのprint
にS3バケットのURLを付加することで、オブジェクトとプレフィックスのS3 URLを出力できます。
$ aws s3 ls s3://example-mybucket --recursive | awk '{print "s3://example-mybucket/"$4}'
s3://example-mybucket/bar.txt
s3://example-mybucket/foo.txt
s3://example-mybucket/myfolder-a/
s3://example-mybucket/myfolder-a/fuga.txt
s3://example-mybucket/myfolder-a/hoge.txt
s3://example-mybucket/myfolder-a/myfolder-b/
s3://example-mybucket/myfolder-a/myfolder-b/baz.txt
データサイズに単位を付加する
--human-readable
オプションを付けるとデータサイズに単位Bytes/MiB/KiB/GiB/TiB/PiB/EiB
が付加されます。
$ aws s3 ls s3://example-mybucket --recursive --human-readable
2018-10-20 23:28:42 3 Bytes bar.txt
2018-10-20 23:28:43 3 Bytes foo.txt
2018-10-20 23:33:15 0 Bytes mydir-a/
2018-10-20 23:33:40 4 Bytes mydir-a/fuga.txt
2018-10-20 23:33:40 4 Bytes mydir-a/hoge.txt
2018-10-20 23:40:43 0 Bytes mydir-a/mydir-b/
2018-10-20 23:41:11 3 Bytes mydir-a/mydir-b/baz.txt
作成日時やデータサイズでソートする
sort
コマンドと組み合わせることで作成日時やデータサイズなどでソートできます。
-k
オプションでソートに使用する列の組み合わせを指定します。
-r
オプションを付けると降順でソートされます。
$ aws s3 ls s3://example-mybucket --recursive | sort -k 1,2
2018-10-20 23:28:42 3 bar.txt
2018-10-20 23:28:43 3 foo.txt
2018-10-20 23:33:15 0 mydir-a/
2018-10-20 23:33:40 4 mydir-a/fuga.txt
2018-10-20 23:33:40 4 mydir-a/hoge.txt
2018-10-20 23:40:43 0 mydir-a/mydir-b/
2018-10-20 23:41:11 3 mydir-a/mydir-b/baz.txt
$ aws s3 ls s3://example-mybucket --recursive | sort -r -k 1,2
2018-10-20 23:41:11 3 mydir-a/mydir-b/baz.txt
2018-10-20 23:40:43 0 mydir-a/mydir-b/
2018-10-20 23:33:40 4 mydir-a/hoge.txt
2018-10-20 23:33:40 4 mydir-a/fuga.txt
2018-10-20 23:33:15 0 mydir-a/
2018-10-20 23:28:43 3 foo.txt
2018-10-20 23:28:42 3 bar.txt
$ aws s3 ls s3://example-mybucket --recursive | sort -k 3
2018-10-20 23:33:15 0 mydir-a/
2018-10-20 23:40:43 0 mydir-a/mydir-b/
2018-10-20 23:28:42 3 bar.txt
2018-10-20 23:28:43 3 foo.txt
2018-10-20 23:41:11 3 mydir-a/mydir-b/baz.txt
2018-10-20 23:33:40 4 mydir-a/fuga.txt
2018-10-20 23:33:40 4 mydir-a/hoge.txt
$ aws s3 ls s3://example-mybucket --recursive | sort -r -k 3
2018-10-20 23:33:40 4 mydir-a/hoge.txt
2018-10-20 23:33:40 4 mydir-a/fuga.txt
2018-10-20 23:41:11 3 mydir-a/mydir-b/baz.txt
2018-10-20 23:28:43 3 foo.txt
2018-10-20 23:28:42 3 bar.txt
2018-10-20 23:40:43 0 mydir-a/mydir-b/
2018-10-20 23:33:15 0 mydir-a/
オブジェクト数とデータサイズのサマリーを出力する
--summarize
オプションを付けるとaws s3 ls
コマンドの結果のオブジェクト数と合計データサイズが結果の末尾に出力されます。
$ aws s3 ls s3://example-mybucket --recursive --human-readable --summarize
2018-10-20 23:28:42 3 Bytes bar.txt
2018-10-20 23:28:43 3 Bytes foo.txt
2018-10-20 23:33:15 0 Bytes mydir-a/
2018-10-20 23:33:40 4 Bytes mydir-a/fuga.txt
2018-10-20 23:33:40 4 Bytes mydir-a/hoge.txt
2018-10-20 23:40:43 0 Bytes mydir-a/mydir-b/
2018-10-20 23:41:11 3 Bytes mydir-a/mydir-b/baz.txt
Total Objects: 7
Total Size: 17 Bytes
presign - 署名付きURLの発行
aws s3 presign
コマンドではS3オブジェクトの署名付きURLが発行できます。
署名付きURLを発行する
オプション無しで実行すると、有効期限1時間(3,600秒)の署名付きURLを発行できます。
レスポンスのURLのExpires
の数字はエポック秒です。以下のサイトなどで実際の日時を確認するのがオススメです。
https://www.epochconverter.com/
$ aws s3 presign s3://example-mybucket/foo.txt
https://s3.us-west-2.amazonaws.com/example-mybucket/foo.txt?AWSAccessKeyId=xxx&Expires=1540214145&Signature=zzz
有効期限を指定して署名付きURLを発行する
--expires-in
オプションで署名付きURLの期限が切れるまでの秒数を指定できます。
以下の例では7日間(604,800秒)を指定しています。
$ aws s3 presign s3://example-mybucket/foo.txt --expires-in 604800
https://s3.us-west-2.amazonaws.com/example-mybucket/foo.txt?AWSAccessKeyId=xxx&Expires=1540214145&Signature=zzz
署名付きURLのよくあるトラブル
署名付きURLのよくあるトラブルについて記載します。
--expires-in
オプションで指定した期間よりも早く有効期限が切れる
有効な署名付きURLにも関わらず、指定した期限よりも早くに失効してしまうケースです。
これは、AWSナレッジセンターで紹介されている次のケースに該当する可能性があります。
S3 バケットの署名付き URL が、指定した有効期限より前に失効する
一時トークンを使用して署名付き URL を作成した場合、トークンが有効期限切れになると、URL は失効します。URL の有効期限がより長い場合でも失効します。 署名付き URL の作成に使用できる認証情報には以下が含まれます。
|
長期間有効な署名付きURLを発行したい場合はIAMユーザーを使う必要があります。プログラムで定期的に署名付きURLを発行するようなケースだとIAMユーザーのアクセスキーを利用せざるを得ないため、できれば他の認証方式の有効期限が伸ばせると良いのですが、AWSの今後の改善を期待したいと思います。
署名付きURLをクリックするとPermanentRedirect
と表示される
署名付きURLをクリックすると以下のエラーが出力されることがあります。
|
エラーの原因としてaws s3 presign
コマンド実行時にリージョンが指定されていない可能性があります。
署名付きURLのホスト部分に着目することで署名付きURLが有効かどうかを判断できます。
|
上記例のようにURLのホスト名にリージョンが含まれていない場合はaws s3 presign --region us-west-2
のようにリージョンを指定することで解決する可能性があります。
オブジェクトの読み込み操作のセクションは以上です。
以下はオブジェクトの書き込み操作のセクションになります。
オブジェクトの書き込み系コマンドに共通する2つのポイント
オブジェクトの書き込み系のコマンド(cp/mv/rm/sync
)について記載する前に、これらのコマンドに共通する2つのポイントを記載します。
--dryrun
オプション
オブジェクトの書き込み系のコマンド(cp/mv/rm/sync
)で利用できる最も重要なオプションです。
--dryrun
オプションを付けることで、コマンドのシミュレーション結果が出力されます。あくまでシミュレーションであり実際にはコマンドは実行されません。
コマンドの結果が100%予測できる場合を除いて、このオプションを付けて挙動を確認してから実行することを推奨します。
以降のコマンド例には--dryrun
オプションを付与しますので、コピー&ペーストの際にはご注意ください。
--exclude/--include
オプション
オブジェクトの書き込み系のコマンド(cp/mv/rm/sync
)では--exclude/--include
オプションを用いて処理対象を絞り込むことができます。
これらのオプションの中でAWS CLI S3独自のパターン文字が使えます。正規表現に似ていますが別物なのでご注意ください。
(日本語訳の意味が分かりにくく申し訳ないのですが、後に出てくる使用例を参照頂くと幾分イメージが湧くと思います)
パターン | 意味 |
---|---|
* |
全ての文字列にマッチするワイルドカード |
? |
任意の1文字にマッチするワイルドカード |
[sequence] |
括弧内のいずれかの文字にマッチする場合に真になる |
[!sequence] |
括弧内のいずれの文字にもマッチしない場合に真になる |
--exclude
オプションを用いると、指定したパターンにマッチするファイルを処理対象から除外し、それ以外の全てのファイルが処理対象となります。
一方、--include
は変わったオプションで、単独で使用しても効力がありません。--exclude
オプションと組み合わせることで初めて処理対象を絞り込むことができます。各オプションの使い分けのイメージは以下の通りです。
-
--exclude
- 処理対象外のファイルを指定、それ以外の全てのファイルを処理対象とする
- ブラックリスト的なイメージ
-
--exclude
+--include
- 処理対象のファイルを指定、それ以外の全てのファイルを処理対象外とする
- ホワイトリスト的なイメージ
--exluce "*"
で一旦全てのファイルを対象外として、--include "*.png"
のように処理対象を指定するのが頻出のイディオムです。
--exclude
オプションによる処理対象の絞り込みの例
aws s3 cp
コマンドの例を記載します。
$ tree ./src/
./src/
├── mydir-a
│ ├── mydir-b
│ │ ├── test-c.png
│ │ └── test-c.txt
│ ├── test-b.png
│ └── test-b.txt
├── test-a.png
└── test-a.txt
拡張子png
のファイルを除外
--exclude
オプションに"*.png"
を指定します。
これにより、拡張子png
のファイルが除外されます。
言い換えると、拡張子png
以外のファイルが処理対象となります。
```shell:拡張子png
のファイルを除外
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*.png" --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
### パスに`test-a`を含むファイルを除外
`--exclude`オプションに`"*test-a*"`を指定します。
これにより、パスに`test-a`を含むファイルが除外されます。
言い換えると、**パスに`test-a`を含まないファイルが処理対象**となります。
```shell:パスに`test-a`を含むファイルを除外
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*test-a*" --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
パスにtest-a
またはtest-b
を含むファイルを除外 (--exclude
複数指定)
--exclude
オプションは複数指定することが可能です。以下コマンド例では2つの--exclude
オプションに"*test-a*"
と"*test-b*"
を指定しています。
これにより、パスにtest-a
またはtest-b
を含むファイルが除外されます。
言い換えると、パスにtest-a
及びtest-b
を含まないファイルが処理対象となります。
```shell:パスにtest-a
または`test-b`を含むファイルを除外(`--exclude`複数指定)
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "test-a" --exclude "test-b" --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
### パスに`test-a`または`test-b`を含むファイルを除外 (`[sequence]`指定)
`--exclude`オプションに`"*test-[ab]*"`を指定します。
`[ab]`の部分はAWS CLI S3独自のパターン構文で、括弧内のいずれかの文字にマッチする場合に真になります。
これにより、パスに`test-a`または`test-b`を含むファイルが除外されます。
言い換えると、**パスに`test-a`及び`test-b`を含まないファイルが処理対象**となります。
```shell:パスに`test-a`または`test-b`を含むファイルを除外(角括弧指定)
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*test-[ab]*" --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
パスにtest-a
及びtest-b
を含まないファイルを除外 ([!sequence]
指定)
--exclude
オプションに"*test-[!ab]*"
を指定します。
[!ab]
の部分はAWS CLI S3独自のパターン構文で、括弧内のいずれの文字にもマッチしない場合に真になります。
これにより、パスにtest-a
及びtest-b
を含まないファイルが除外されます。
言い換えると、パスにtest-a
またはtest-b
を含むファイルが処理対象となります。
```shell:パスにtest-a
または`test-b`を含まないファイルを除外(角括弧指定)
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "test-[!ab]" --dryrun
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
## `--exclude/--include`オプションによる処理対象の絞り込みの例
`aws s3 cp`コマンドの例を記載します。
```shell:--exclude/--includeオプションによる処理対象の絞り込み/ファイル・ディレクトリ構成
$ tree ./src/
./src/
├── mydir-a
│ ├── mydir-b
│ │ ├── test-c.png
│ │ └── test-c.txt
│ ├── test-b.png
│ └── test-b.txt
├── test-a.png
└── test-a.txt
拡張子png
のファイルのみを処理対象とする
--exclude
オプションに"*"
を指定、--include
オプションに"*.png"
を指定します。
これにより、拡張子png
のファイルのみが処理対象となります。
```shell:拡張子png
のファイルのみを処理対象とする
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "" --include ".png" --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
### パスに`test-a`を含むファイルのみを処理対象とする
`--exclude`オプションに`"*"`を指定、`--include`オプションに`"*test-a*"`を指定します。
これにより、**パスに`test-a`を含むファイルのみが処理対象**となります。
```shell:パスに`test-a`を含むファイルのみを処理対象とする
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*" --include "*test-a*" --dryrun
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
パスにtest-a
またはtest-b
を含むファイルのみを処理対象とする (--include
複数指定)
--include
オプションは複数指定することが可能です。以下コマンド例では--exclude
オプションに"*"
を指定、2つの--include
オプションにそれぞれ"*test-a*"
と"*test-b*"
を指定しています。
これにより、パスにtest-a
またはtest-b
を含むファイルのみが処理対象となります。
```shell:パスにtest-a
または`test-b`を含むファイルを指定(`--include`複数指定)
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*" --include "test-a" --include "test-b" --dryrun
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
### パスに`test-a`または`test-b`を含むファイルのみを処理対象とする (`[sequence]`指定)
`--exclude`オプションに`"*"`を指定、`--include`オプションに`"*test-[ab]*"`を指定します。
これにより、**パスに`test-a`または`test-b`を含むファイルのみが処理対象**となります。
```shell:パスに`test-a`または`test-b`を含むファイルを指定(角括弧指定)
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*" --include "*test-[ab]*" --dryrun
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
パスにtest-a
及びtest-b
を含まないファイルのみを処理対象とする ([!sequence]
指定)
--exclude
オプションに"*"
を指定、--include
オプションに"*test-[!ab]*"
を指定します。
これにより、パスにtest-a
及びtest-b
を含まないファイルのみが処理対象となります。
```shell:パスにtest-a
及び`test-b`を含まないファイルのみを処理対象とする(角括弧指定)
$ aws s3 cp ./src s3://example-mybucket-dest --recursive --exclude "*" --include "test-[!ab]" --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
# cp - オブジェクトのコピー
`aws s3 cp`コマンドではローカルからS3、S3からローカル、S3からS3へのファイルのコピーが行えます。
S3のドキュメントではS3上のファイルのことを「オブジェクト」、S3外の場合は「ファイル」と呼称していますが、本セクションでは分かりやすさを優先して「ファイル」に呼称を統一します。
- コマンドリファレンスのURL
- https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html
## 単一ファイルのコピー
### ローカルからS3に単一ファイルをコピーする
以下のコマンド例の場合、コピー元のファイル名と同じ名前でS3に単一ファイルをコピーします。
コピー先のプレフィックスを指定する場合、`mydir-a/`のように末尾にスラッシュを付ける必要があります。
```shell:ローカルからS3への単一ファイルコピー#1
$ aws s3 cp test.txt s3://example-mybucket/mydir-a/ --dryrun
(dryrun) upload: ./test.txt to s3://example-mybucket/mydir-a/test.txt
コピー先のプレフィックスの末尾にスラッシュを付けない場合、ファイル名として認識されます。以下コマンド例では、example-mybucket
バケット直下にmydir-a
というファイル名でコピーされます。
$ aws s3 cp test.txt s3://example-mybucket/mydir-a --dryrun
(dryrun) upload: ./test.txt to s3://example-mybucket/mydir-a
以下のコマンド例のように、コピー元のファイル名と違う名前でS3にファイルをコピーすることもできます。
$ aws s3 cp test.txt s3://example-mybucket/mydir-a/test2.txt --dryrun
(dryrun) upload: ./test.txt to s3://example-mybucket/mydir-a/test2.txt
S3からローカルに単一ファイルをコピーする
以下のコマンドではコピー元のファイル名と同じ名前でローカルのカレントディレクトリに単一ファイルをコピーします。
$ aws s3 cp s3://example-mybucket/foo.txt . --dryrun
(dryrun) download: s3://example-mybucket/foo.txt to ./foo.txt
以下のコマンドではコピー元のファイル名と違う名前でローカルのカレントディレクトリに単一ファイルをコピーします。
$ aws s3 cp s3://example-mybucket/foo.txt ./bar.txt --dryrun
(dryrun) download: s3://example-mybucket/foo.txt to ./bar.txt
S3からS3に単一ファイルをコピーする
以下のコマンドではコピー元のファイル名と同じ名前でS3からS3に単一ファイルをコピーします。
$ aws s3 cp s3://example-mybucket-ap-northeast-1/foo.txt s3://example-mybucket-dest-ap-northeast-1 --dryrun
(dryrun) copy: s3://example-mybucket-ap-northeast-1/foo.txt to s3://example-mybucket-dest-ap-northeast-1/foo.txt
以下のコマンドでは違うリージョンのバケットに単一ファイルをコピーします。コピー元とコピー先のバケットが違うリージョンの場合は--source-region
オプションでコピー元バケットのリージョンを指定する必要があります。
$ aws s3 cp s3://example-mybucket-ap-northeast-1/foo.txt s3://example-mybucket-dest-us-west-2/bar.txt --source-region ap-northeast-1 --dryrun
(dryrun) copy: s3://example-mybucket-ap-northeast-1/foo.txt to s3://example-mybucket-dest-us-west-2/bar.txt
以下のコマンドではコピー元のファイル名と違う名前でS3からS3に単一ファイルをコピーします。
$ aws s3 cp s3://example-mybucket-ap-northeast-1/foo.txt s3://example-mybucket-dest-ap-northeast-1/bar.txt --dryrun
(dryrun) copy: s3://example-mybucket-ap-northeast-1/foo.txt to s3://example-mybucket-dest-ap-northeast-1/bar.txt
複数ファイルのコピー
ローカルからS3に複数ファイルをコピーする
--recursive
オプションを付けると指定したディレクトリ配下のファイル・ディレクトリを再帰的にコピーできます。
$ tree ./src/
./src/
├── mydir-a
│ ├── mydir-b
│ │ ├── test-c.png
│ │ └── test-c.txt
│ ├── test-b.png
│ └── test-b.txt
├── test-a.png
└── test-a.txt
$ aws s3 cp ./src/ s3://example-mybucket-dest --recursive --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
S3からローカルに複数ファイルをコピーする
S3からローカルのカレントディレクトリに複数ファイルをコピーするコマンド例です。
$ aws s3 cp s3://example-mybucket/mydir-a/ . --recursive --dryrun
(dryrun) download: s3://example-mybucket/mydir-a/fuga.txt to ./fuga.txt
(dryrun) download: s3://example-mybucket/mydir-a/hoge.txt to ./hoge.txt
(dryrun) download: s3://example-mybucket/mydir-a/mydir-b/baz.txt to mydir-b/baz.txt
S3からローカルの./test
ディレクトリに複数ファイルをコピーするコマンド例です。./test
ディレクトリが存在しない場合、自動的に作成されます。
$ aws s3 cp s3://example-mybucket/mydir-a/ ./test/ --recursive --dryrun
(dryrun) download: s3://example-mybucket/foo.txt to ./bar.txt
S3からS3に複数ファイルをコピーする
S3のあるバケットから別のバケットに複数ファイルをコピーするコマンド例です。
$ aws s3 cp s3://example-mybucket/mydir-a/ s3://example-mybucket-dest/mydir-a/ --recursive --dryrun
(dryrun) copy: s3://example-mybucket/mydir-a/fuga.txt to s3://example-mybucket-dest/mydir-a/fuga.txt
(dryrun) copy: s3://example-mybucket/mydir-a/hoge.txt to s3://example-mybucket-dest/mydir-a/hoge.txt
(dryrun) copy: s3://example-mybucket/mydir-a/mydir-b/baz.txt to s3://example-mybucket-dest/mydir-a/mydir-b/baz.txt
コピー元とコピー先のバケットが違うリージョンの場合は--source-region
オプションでコピー元バケットのリージョンを指定する必要があります。
$ aws s3 cp s3://example-mybucket-ap-northeast-1/mydir-a/ s3://example-mybucket-dest-us-west-2/mydir-a/ --recursive --source-region ap-northeast-1 --dryrun
(dryrun) copy: s3://example-mybucket-ap-northeast-1/mydir-a/fuga.txt to s3://example-mybucket-dest-us-west-2/mydir-a/fuga.txt
(dryrun) copy: s3://example-mybucket-ap-northeast-1/mydir-a/hoge.txt to s3://example-mybucket-dest-us-west-2/mydir-a/hoge.txt
(dryrun) copy: s3://example-mybucket-ap-northeast-1/mydir-a/mydir-b/baz.txt to s3://example-mybucket-dest-us-west-2/mydir-a/mydir-b/baz.txt
S3の同一バケットの別のパスに複数ファイルをコピーするコマンド例です。
$ aws s3 cp s3://example-mybucket/mydir-a/ s3://example-mybucket/mydir-z/ --recursive --dryrun
(dryrun) copy: s3://example-mybucket/mydir-a/fuga.txt to s3://example-mybucket/mydir-z/fuga.txt
(dryrun) copy: s3://example-mybucket/mydir-a/hoge.txt to s3://example-mybucket/mydir-z/hoge.txt
(dryrun) copy: s3://example-mybucket/mydir-a/mydir-b/baz.txt to s3://example-mybucket/mydir-z/mydir-b/baz.txt
--exclude/--include
オプションを用いて対象を絞り込む
--exclude/--includeオプションのセクションを参照ください。
mv - オブジェクトの移動
aws s3 mv
コマンドではローカルからS3、S3からローカル、S3からS3へのファイルの移動が行えます。
移動元のファイルが残らないという点がaws s3 cp
コマンドと異なります。
その他の構文はaws s3 cp
とほとんど変わりませんので cp - オブジェクトのコピー のコマンド例を読み替えてください。
- コマンドリファレンスのURL
rm - オブジェクトの削除
aws s3 rm
コマンドではS3のオブジェクトの削除が行えます。
- コマンドリファレンスのURL
オブジェクトを削除する
以下のコマンド例の場合、example-mybucket
配下のfoo.txt
を削除します。
$ aws s3 rm s3://example-mybucket/foo.txt --dryrun
(dryrun) delete: s3://example-mybucket/foo.txt
オブジェクトを再帰的に削除する
以下のコマンド例の場合、example-mybucket/mydir-a
配下の全てのプレフィックス及びオブジェクトを削除します。
$ aws s3 rm s3://example-mybucket/mydir-a/ --recursive --dryrun
(dryrun) delete: s3://example-mybucket/mydir-a/
(dryrun) delete: s3://example-mybucket/mydir-a/fuga.txt
(dryrun) delete: s3://example-mybucket/mydir-a/hoge.txt
(dryrun) delete: s3://example-mybucket/mydir-a/mydir-b/
(dryrun) delete: s3://example-mybucket/mydir-a/mydir-b/baz.txt
--exclude/--include
オプションを用いて対象を絞り込む
詳細は--exclude/--includeオプションのセクションを参照ください。
以下のコマンド例の場合、example-mybucket-dest/mydir-a/
配下で拡張子がpng
の全てのオブジェクトを削除します。
```shell:拡張子がpng
の全てのオブジェクトを削除する
$ aws s3 rm s3://example-mybucket-dest/mydir-a/ --recursive --exclude "" --include ".png" --dryrun
(dryrun) delete: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) delete: s3://example-mybucket-dest/mydir-a/test-b.png
# sync - ファイル・ディレクトリの同期
`aws s3 sync`コマンドではローカル/S3間、S3/ローカル間、S3/S3間のファイル・ディレクトリの同期が行えます。
- コマンドリファレンスのURL
- https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
### `sync`コマンドで同期されるファイルの条件
以下のいずれかの条件を満たす場合、そのファイルは同期されます。
条件 | ローカル -> S3 | S3 -> ローカル | S3 -> S3
--- | --- | --- | ---
同期元に存在するファイルが同期先に存在しない | 同期される | 同期される | 同期される
同期元のファイルと同期先のファイルのサイズが異なる | 同期される | 同期される | 同期される
同期元のファイルの最終更新日時が同期先のファイルよりも新しい | 同期される | **同期されない** | 同期される
同期元をS3、同期先をローカルにして`sync`コマンドを実行する場合、ファイルサイズが同一だと同期されないことに注意が必要です。`--exact-timestamps`オプションを指定すると、ファイルサイズが同一でも最終更新日時が異なれば同期されます。
### ローカルのファイル・ディレクトリをS3に同期する
以下のコマンドによりローカルの指定したディレクトリ配下のファイル・ディレクトリが再帰的にS3にコピーされます。
```shell:ローカルのファイル・ディレクトリをS3に同期する
$ tree ./src/
./src/
├── mydir-a
│ ├── mydir-b
│ │ ├── test-c.png
│ │ └── test-c.txt
│ ├── test-b.png
│ └── test-b.txt
├── test-a.png
└── test-a.txt
$ aws s3 sync ./src/ s3://example-mybucket-dest --dryrun
(dryrun) upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
(dryrun) upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
(dryrun) upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
(dryrun) upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
S3のファイル・ディレクトリをローカルに同期する
S3のファイル・ディレクトリをローカルのカレントディレクトリに同期するコマンド例です。
$ aws s3 sync s3://example-mybucket-dest . --dryrun
(dryrun) download: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png to mydir-a/mydir-b/test-c.png
(dryrun) download: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt to mydir-a/mydir-b/test-c.txt
(dryrun) download: s3://example-mybucket-dest/mydir-a/test-b.png to mydir-a/test-b.png
(dryrun) download: s3://example-mybucket-dest/mydir-a/test-b.txt to mydir-a/test-b.txt
(dryrun) download: s3://example-mybucket-dest/test-a.png to ./test-a.png
(dryrun) download: s3://example-mybucket-dest/test-a.txt to ./test-a.txt
S3のファイル・ディレクトリをローカルの./test
ディレクトリに同期するコマンド例です。./test
ディレクトリが存在しない場合、自動的に作成されます。
$ aws s3 sync s3://example-mybucket-dest ./test --dryrun
(dryrun) download: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png to test/mydir-a/mydir-b/test-c.png
(dryrun) download: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt to test/mydir-a/mydir-b/test-c.txt
(dryrun) download: s3://example-mybucket-dest/mydir-a/test-b.png to test/mydir-a/test-b.png
(dryrun) download: s3://example-mybucket-dest/mydir-a/test-b.txt to test/mydir-a/test-b.txt
(dryrun) download: s3://example-mybucket-dest/test-a.png to test/test-a.png
(dryrun) download: s3://example-mybucket-dest/test-a.txt to test/test-a.txt
S3のファイル・ディレクトリをS3に同期する
S3のあるバケットのファイル・ディレクトリを別のバケットに同期するコマンド例です。
$ aws s3 sync s3://example-mybucket/mydir-a/ s3://example-mybucket-dest/mydir-a/ --dryrun
(dryrun) copy: s3://example-mybucket/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) copy: s3://example-mybucket/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
(dryrun) copy: s3://example-mybucket/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) copy: s3://example-mybucket/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
同期元と同期先のバケットが違うリージョンの場合は--source-region
オプションで同期元バケットのリージョンを指定する必要があります。
$ aws s3 sync s3://example-mybucket-ap-northeast-1/mydir-a/ s3://example-mybucket-dest-us-west-2/mydir-a/ --source-region ap-northeast-1 --dryrun
(dryrun) copy: s3://example-mybucket-ap-northeast-1/mydir-a/fuga.txt to s3://example-mybucket-dest-us-west-2/mydir-a/fuga.txt
(dryrun) copy: s3://example-mybucket-ap-northeast-1/mydir-a/hoge.txt to s3://example-mybucket-dest-us-west-2/mydir-a/hoge.txt
(dryrun) copy: s3://example-mybucket-ap-northeast-1/mydir-a/mydir-b/baz.txt to s3://example-mybucket-dest-us-west-2/mydir-a/mydir-b/baz.txt
S3のあるバケットのファイル・ディレクトリを同じバケットの別のパスに同期するコマンド例です。
$ aws s3 sync s3://example-mybucket/mydir-a/ s3://example-mybucket/mydir-z/ --dryrun
(dryrun) copy: s3://example-mybucket/mydir-a/mydir-b/test-c.png to s3://example-mybucket/mydir-z/mydir-b/test-c.png
(dryrun) copy: s3://example-mybucket/mydir-a/mydir-b/test-c.txt to s3://example-mybucket/mydir-z/mydir-b/test-c.txt
(dryrun) copy: s3://example-mybucket/mydir-a/test-b.png to s3://example-mybucket/mydir-z/test-b.png
(dryrun) copy: s3://example-mybucket/mydir-a/test-b.txt to s3://example-mybucket/mydir-z/test-b.txt
--exclude/--include
オプションを用いて対象を絞り込む
--exclude/--includeオプションのセクションを参照ください。
--delete
オプションを用いて削除済みのファイル・ディレクトリを同期先からも削除する
ローカルからS3に同期した後、ローカルのファイルを削除したとします。
何もオプションを付けずにsync
コマンドを実行しても何も起きませんが、--delete
オプションを付けてsync
コマンドを実行するとローカルで削除されたファイルがS3から削除されます。
静的Webサイトホスティング用のS3バケットにGit管理下の資材をアップロードする際などに使えるテクニックだと思います。
実際の挙動は以下をご覧ください。
ローカルからS3に同期
$ aws s3 sync ./src/ s3://example-mybucket-dest
upload: src/mydir-a/mydir-b/test-c.txt to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
upload: src/test-a.png to s3://example-mybucket-dest/test-a.png
upload: src/mydir-a/test-b.png to s3://example-mybucket-dest/mydir-a/test-b.png
upload: src/mydir-a/test-b.txt to s3://example-mybucket-dest/mydir-a/test-b.txt
upload: src/mydir-a/mydir-b/test-c.png to s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
upload: src/test-a.txt to s3://example-mybucket-dest/test-a.txt
ローカルのディレクトリを削除
$ rm -rf ./src/mydir-a/
--delete
オプション無しだと何も起こらない
$ aws s3 sync ./src/ s3://example-mybucket-dest --dryrun
--delete
オプションありだとS3からファイルが削除される
$ aws s3 sync ./src/ s3://example-mybucket-dest --delete --dryrun
(dryrun) delete: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.png
(dryrun) delete: s3://example-mybucket-dest/mydir-a/mydir-b/test-c.txt
(dryrun) delete: s3://example-mybucket-dest/mydir-a/test-b.png
(dryrun) delete: s3://example-mybucket-dest/mydir-a/test-b.txt
オブジェクトの書き込み操作のセクションは以上です。
以下はバケットの管理のセクションになります。
ls - バケットのリスト
aws s3 ls
コマンドではS3のバケットやオブジェクトのリスト操作が行えます。
このセクションではバケットのリスト操作に絞って記載します。
- コマンドリファレンスのURL
全てのバケットをリストする
オプションを指定せずに実行すると、全てのバケットと作成日時がバケット名昇順で出力されます。
$ aws s3 ls
2018-01-01 00:00:00 example-mybucket-1
2017-01-01 00:00:00 example-mybucket-2
2016-01-01 00:00:00 example-mybucket-3
全てのバケットをリストしてソートする
sort
コマンドと組み合わせることで作成日時やバケット名でソートできます。
-k
オプションでソートに使用する列の組み合わせを指定します。
-r
オプションを付けると降順でソートされます。
$ aws s3 ls | sort -k 1,2
2016-01-01 00:00:00 example-mybucket-3
2017-01-01 00:00:00 example-mybucket-2
2018-01-01 00:00:00 example-mybucket-1
$ aws s3 ls | sort -r -k 1,2
2018-01-01 00:00:00 example-mybucket-1
2017-01-01 00:00:00 example-mybucket-2
2016-01-01 00:00:00 example-mybucket-3
$ aws s3 ls | sort -r -k 3
2016-01-01 00:00:00 example-mybucket-3
2017-01-01 00:00:00 example-mybucket-2
2018-01-01 00:00:00 example-mybucket-1
バケット名のみリストする
awk
コマンドと組み合わせることでバケット名のみリストできます。
$ aws s3 ls | awk '{print $3}'
example-mybucket-1
example-mybucket-2
example-mybucket-3
mb - バケットの作成
aws s3 mb
コマンドではS3バケットの作成が行えます。
- コマンドリファレンスのURL
バケットを作成する
--region
オプションを省略するとaws configure
コマンドで設定されたデフォルトリージョンにバケットが作成されます。
$ aws s3 mb s3://mybucket
make_bucket: s3://mybucket
リージョンを指定してバケットを作成する
--region
オプションで指定したリージョンにバケットを作成できます。
$ aws s3 mb s3://mybucket --region us-west-1
make_bucket: s3://mybucket
rb - バケットの削除
aws s3 rb
コマンドではS3バケットの削除が行えます。
- コマンドリファレンスのURL
バケットを削除する
以下のコマンドでバケットを削除できます。
ただしバケットが空でない場合は削除に失敗します。
$ aws s3 rb s3://mybucket
remove_bucket: mybucket
バケットを強制的に削除する
--force
オプションを付けるとバケットの全オブジェクトが削除された後、バケットが削除されます。
ただしバージョニングされたファイルがバケットに存在する場合、削除に失敗します。
$ aws s3 rb s3://mybucket --force
delete: s3://mybucket/test1.txt
delete: s3://mybucket/test2.txt
remove_bucket: mybucket
バージョニングされたファイルが存在するバケットを削除する
AWS CLI S3コマンドのみで行う方法が見つけられませんでした。
AWSマネジメントコンソールから通常のバケットと同じように削除できます。
website - 静的ウェブサイトホスティングの設定
aws s3 website
コマンドでは静的ウェブサイトホスティング用のバケット設定が行えます。
静的ウェブサイトホスティングを有効化する
以下のコマンドでバケットの静的ウェブサイトホスティングを有効化できます。
コマンドが成功した場合、レスポンスは返ってきませんが、AWSマネジメントコンソールでバケットの [プロパティ] を見ると、静的ウェブサイトホスティングが有効化されていることが確認できます。
$ aws s3 website s3://example-mybucket --index-document index.html --error-document error.html