219
196

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

私家版AWS CLI S3チートシート

Last updated at Posted at 2018-12-02

AWS CLI S3のコマンドをまとめた俺俺チートシートです。
初めて使う方がハマりがちなポイントを押さえつつ、普段AWS CLI S3をお使いの方にも逆引きレシピとして使えるような形にしてみました。
以下のAWS公式ドキュメントの内容をベースにしています。

目次

大きく3つのセクションに分けて記載しています。文量がかなり多くなってしまったので適宜ページ内検索などでジャンプ頂くのが良さそうです。

ls - オブジェクトのリスト

aws s3 lsコマンドではS3のバケットやオブジェクトのリスト操作が行えます。
このセクションではオブジェクトのリスト操作に絞って記載します。

オブジェクトとプレフィックスをリストする

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を出力できます。

オブジェクトとプレフィックスのS3URLを出力する
$ 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/

署名付きURLを発行する
$ 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秒)を指定しています。

有効期限を指定して署名付きURLを発行する
$ 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 の作成に使用できる認証情報には以下が含まれます。

  • AWS Identity and Access Management (IAM) インスタンスプロファイル: 最大 6 時間有効
  • AWS Security Token Service (STS): 最大 36 時間有効 (AWS アカウントユーザーや IAM ユーザーの認証情報など、永続的認証情報を使用して署名した場合)
  • IAM ユーザー: 最大 7 日間有効 (AWS 署名バージョン 4 を使用した場合)

長期間有効な署名付きURLを発行したい場合はIAMユーザーを使う必要があります。プログラムで定期的に署名付きURLを発行するようなケースだとIAMユーザーのアクセスキーを利用せざるを得ないため、できれば他の認証方式の有効期限が伸ばせると良いのですが、AWSの今後の改善を期待したいと思います。

署名付きURLをクリックするとPermanentRedirectと表示される

署名付きURLをクリックすると以下のエラーが出力されることがあります。

  • エラーコード: PermanentRedirect
  • エラーメッセージ: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

エラーの原因としてaws s3 presignコマンド実行時にリージョンが指定されていない可能性があります。
署名付きURLのホスト部分に着目することで署名付きURLが有効かどうかを判断できます。

  • 有効な署名付きURLの例 (URLのホスト名にリージョンが含まれている)
    • https://s3.us-west-2.amazonaws.com/example-mybucket/foo.txt?AWSAccessKeyId=xxx&Expires=1540214145&Signature=zzz
  • 無効な署名付きURLの例 (URLのホスト名にリージョンが含まれていない)
    • https://s3.amazonaws.com/example-mybucket/foo.txt?AWSAccessKeyId=xxx&Expires=1540214145&Signature=zzz

上記例のように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コマンドの例を記載します。

--excludeオプションによる処理対象の絞り込み/ファイル・ディレクトリ構成
$ 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というファイル名でコピーされます。

ローカルからS3への単一ファイルコピー#2
$ aws s3 cp test.txt s3://example-mybucket/mydir-a --dryrun
(dryrun) upload: ./test.txt to s3://example-mybucket/mydir-a

以下のコマンド例のように、コピー元のファイル名と違う名前でS3にファイルをコピーすることもできます。

ローカルからS3への単一ファイルコピー#3
$ 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からローカルに単一ファイルをコピーする

以下のコマンドではコピー元のファイル名と同じ名前でローカルのカレントディレクトリに単一ファイルをコピーします。

S3からローカルへの単一ファイルコピー#1
$ aws s3 cp s3://example-mybucket/foo.txt . --dryrun
(dryrun) download: s3://example-mybucket/foo.txt to ./foo.txt

以下のコマンドではコピー元のファイル名と違う名前でローカルのカレントディレクトリに単一ファイルをコピーします。

S3からローカルへの単一ファイルコピー#2
$ 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に単一ファイルをコピーします。

S3からS3への単一ファイルコピー#1
$ 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オプションでコピー元バケットのリージョンを指定する必要があります。

S3からS3への単一ファイルコピー#2
$ 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に単一ファイルをコピーします。

S3からS3への単一ファイルコピー#3
$ 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オプションを付けると指定したディレクトリ配下のファイル・ディレクトリを再帰的にコピーできます。

ローカルから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 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からローカルのカレントディレクトリに複数ファイルをコピーするコマンド例です。

S3からローカルへの複数ファイルコピー#1
$ 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ディレクトリが存在しない場合、自動的に作成されます。

S3からローカルへの複数ファイルコピー#2
$ aws s3 cp s3://example-mybucket/mydir-a/ ./test/ --recursive --dryrun
(dryrun) download: s3://example-mybucket/foo.txt to ./bar.txt

S3からS3に複数ファイルをコピーする

S3のあるバケットから別のバケットに複数ファイルをコピーするコマンド例です。

S3からS3への複数ファイルコピー#1
$ 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オプションでコピー元バケットのリージョンを指定する必要があります。

S3からS3への複数ファイルコピー#2
$ 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の同一バケットの別のパスに複数ファイルをコピーするコマンド例です。

S3からS3への複数ファイルコピー#3
$ 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 - オブジェクトのコピー のコマンド例を読み替えてください。

rm - オブジェクトの削除

aws s3 rmコマンドではS3のオブジェクトの削除が行えます。

オブジェクトを削除する

以下のコマンド例の場合、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のファイル・ディレクトリをローカルのカレントディレクトリに同期するコマンド例です。

S3のファイル・ディレクトリをローカルに同期する#1
$ 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ディレクトリが存在しない場合、自動的に作成されます。

S3のファイル・ディレクトリをローカルに同期する#2
$ 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のあるバケットのファイル・ディレクトリを別のバケットに同期するコマンド例です。

S3のファイル・ディレクトリをS3に同期する#1
$ 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オプションで同期元バケットのリージョンを指定する必要があります。

S3のファイル・ディレクトリをS3に同期する#2
$ 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のあるバケットのファイル・ディレクトリを同じバケットの別のパスに同期するコマンド例です。

S3のファイル・ディレクトリをS3に同期する#3
$ 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のバケットやオブジェクトのリスト操作が行えます。
このセクションではバケットのリスト操作に絞って記載します。

全てのバケットをリストする

オプションを指定せずに実行すると、全てのバケットと作成日時がバケット名昇順で出力されます。

全てのバケットをリストする
$ 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バケットの作成が行えます。

バケットを作成する

--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バケットの削除が行えます。

バケットを削除する

以下のコマンドでバケットを削除できます。
ただしバケットが空でない場合は削除に失敗します。

バケットを削除する
$ 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
219
196
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
219
196

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?