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

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

- [s3 — AWS CLI 1.16.57 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/s3/)
- [AWS Command Line Interface での高レベルの S3 コマンドの使用 - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/using-s3-commands.html)

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

- **オブジェクトの読み込み操作**
    - [ls - オブジェクトのリスト](#ls---オブジェクトのリスト)
    - [presign - 署名付きURLの発行](#presign---署名付きurlの発行)
    - [署名付きURLのよくあるトラブル](#署名付きurlのよくあるトラブル)
- **オブジェクトの書き込み操作**
    - [オブジェクトの書き込み系コマンドに共通する2つのポイント](#オブジェクトの書き込み系コマンドに共通する2つのポイント)
        - [--dryrunオプション](#--dryrunオプション)
        - [--exclude/--includeオプション](#--exclude--includeオプション)
    - [cp - オブジェクトのコピー](#cp---オブジェクトのコピー)
    - [mv - オブジェクトの移動](#mv---オブジェクトの移動)
    - [rm - オブジェクトの削除](#rm---オブジェクトの削除)
    - [sync - ファイル・ディレクトリの同期](#sync---ファイルディレクトリの同期)
- **バケットの管理**
    - [ls - バケットのリスト](#ls---バケットのリスト)
    - [mb - バケットの作成](#mb---バケットの作成)
    - [rb - バケットの削除](#rb---バケットの削除)
    - [website - 静的ウェブサイトホスティングの設定](#website---静的ウェブサイトホスティングの設定)

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

- コマンドリファレンスのURL
    - https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html

### オブジェクトとプレフィックスをリストする
S3 URIを指定するとオブジェクトとプレフィックスをリストできます。
プレフィックスは`PRE`とマークされます。作成日時は出力されません。

```shell:指定したバケット直下のオブジェクトとプレフィックスをリストする
$ 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
```

```shell:指定したプレフィックス直下のオブジェクトとプレフィックスをリストする
$ 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`で出力されます。作成日時も出力されます。

```shell:オブジェクトとプレフィックスを再帰的にリストする
$ 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`コマンドで末尾がスラッシュのものを除外することでオブジェクトのみをリストできます。

```shell:リスト結果をオブジェクトのみに絞り込む
$ 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`コマンドで末尾がスラッシュのもののみに絞り込むことでプレフィックスのみをリストできます。

```shell:リスト結果をプレフィックスのみに絞り込む
$ 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`コマンドと組み合わせることで作成日時とデータサイズを出力せずに、オブジェクトとプレフィックスのみ出力できます。

```shell:オブジェクトとプレフィックスのみ出力する
$ 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`コマンドを用いたイディオムと組み合わせることで、オブジェクトのみ、またはプレフィックスのみ出力できます。

```shell:オブジェクトのみ出力する
$ 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
```

```shell:プレフィックスのみ出力する
$ 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を出力できます。

```shell:オブジェクトとプレフィックスの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`が付加されます。

```shell:データサイズに単位を付加してオブジェクトとプレフィックスを再帰的にリストする
$ 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`オプションを付けると降順でソートされます。

```shell:オブジェクトとプレフィックスを再帰的にリストし作成日時で昇順ソートする
$ 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
```

```shell:オブジェクトとプレフィックスを再帰的にリストし作成日時で降順ソートする
$ 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
```

```shell:オブジェクトとプレフィックスを再帰的にリストしデータサイズで昇順ソートする
$ 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
```

```shell:オブジェクトとプレフィックスを再帰的にリストしデータサイズで降順ソートする
$ 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`コマンドの結果のオブジェクト数と合計データサイズが結果の末尾に出力されます。

```shell:データサイズに単位を付加してオブジェクトとプレフィックスを再帰的にリストしサマリーを出力する
$ 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
    - https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html

### 署名付きURLを発行する
オプション無しで実行すると、有効期限1時間（3,600秒）の署名付きURLを発行できます。
レスポンスのURLの`Expires`の数字はエポック秒です。以下のサイトなどで実際の日時を確認するのがオススメです。
https://www.epochconverter.com/

```shell:署名付き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秒）を指定しています。

```shell:有効期限を指定して署名付き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 が、指定した有効期限より前に失効する](https://aws.amazon.com/jp/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/)

<table><tr><td>
<p>一時トークンを使用して署名付き URL を作成した場合、トークンが有効期限切れになると、URL は失効します。URL の有効期限がより長い場合でも失効します。
署名付き URL の作成に使用できる認証情報には以下が含まれます。
<ul>
<li>AWS Identity and Access Management (IAM) インスタンスプロファイル: 最大 6 時間有効
<li>AWS Security Token Service (STS): 最大 36 時間有効 (AWS アカウントユーザーや IAM ユーザーの認証情報など、永続的認証情報を使用して署名した場合)
<li>IAM ユーザー: 最大 7 日間有効 (AWS 署名バージョン 4 を使用した場合)
</ul>
</td></tr></table>

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

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

<table><tr><td>
<ul>
<li>エラーコード: PermanentRedirect
<li>エラーメッセージ: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
</ul>
</td></tr></table>

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

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

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

```shell:--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`というファイル名でコピーされます。

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

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

```shell:ローカルから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からローカルに単一ファイルをコピーする
以下のコマンドではコピー元のファイル名と同じ名前でローカルのカレントディレクトリに単一ファイルをコピーします。

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

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

```shell: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に単一ファイルをコピーします。

```shell: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`オプションでコピー元バケットのリージョンを指定する必要があります。

```shell: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に単一ファイルをコピーします。

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

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

```shell: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`ディレクトリが存在しない場合、自動的に作成されます。

```shell: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のあるバケットから別のバケットに複数ファイルをコピーするコマンド例です。

```shell: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`オプションでコピー元バケットのリージョンを指定する必要があります。

```shell: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の同一バケットの別のパスに複数ファイルをコピーするコマンド例です。

```shell: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オプション](#--exclude--includeオプション)のセクションを参照ください。

# mv - オブジェクトの移動
`aws s3 mv`コマンドではローカルからS3、S3からローカル、S3からS3へのファイルの移動が行えます。
**移動元のファイルが残らない**という点が`aws s3 cp`コマンドと異なります。
その他の構文は`aws s3 cp`とほとんど変わりませんので [cp - オブジェクトのコピー](#cp---オブジェクトのコピー) のコマンド例を読み替えてください。

- コマンドリファレンスのURL
    - https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html

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

- コマンドリファレンスのURL
    - https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html

### オブジェクトを削除する
以下のコマンド例の場合、`example-mybucket`配下の`foo.txt`を削除します。

```shell:オブジェクトを削除する
$ aws s3 rm s3://example-mybucket/foo.txt --dryrun
(dryrun) delete: s3://example-mybucket/foo.txt
```

### オブジェクトを再帰的に削除する
以下のコマンド例の場合、`example-mybucket/mydir-a`配下の全てのプレフィックス及びオブジェクトを削除します。

```shell:オブジェクトを再帰的に削除する
$ 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オプション](#--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のファイル・ディレクトリをローカルのカレントディレクトリに同期するコマンド例です。

```shell: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`ディレクトリが存在しない場合、自動的に作成されます。

```shell: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のあるバケットのファイル・ディレクトリを別のバケットに同期するコマンド例です。

```shell: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`オプションで同期元バケットのリージョンを指定する必要があります。

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

```shell: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オプション](#--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
    - https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html

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

```shell:全てのバケットをリストする
$ 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`オプションを付けると降順でソートされます。

```shell:全てのバケットをリストして作成日時で昇順ソートする
$ 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
```

```shell:全てのバケットをリストして作成日時で降順ソートする
$ 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
```

```shell:全てのバケットをリストしてバケット名で降順ソートする
$ 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`コマンドと組み合わせることでバケット名のみリストできます。

```shell:バケット名のみリストする
$ aws s3 ls | awk '{print $3}'
example-mybucket-1
example-mybucket-2
example-mybucket-3
```

# mb - バケットの作成
`aws s3 mb`コマンドではS3バケットの作成が行えます。

- コマンドリファレンスのURL
    - https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html

### バケットを作成する
`--region`オプションを省略すると`aws configure`コマンドで設定されたデフォルトリージョンにバケットが作成されます。

```shell:バケットを作成する
$ aws s3 mb s3://mybucket
make_bucket: s3://mybucket
```

### リージョンを指定してバケットを作成する
`--region`オプションで指定したリージョンにバケットを作成できます。

```shell:リージョンを指定してバケットを作成する
$ aws s3 mb s3://mybucket --region us-west-1
make_bucket: s3://mybucket
```

# rb - バケットの削除
`aws s3 rb`コマンドではS3バケットの削除が行えます。

- コマンドリファレンスのURL
    - https://docs.aws.amazon.com/cli/latest/reference/s3/rb.html

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

```shell:バケットを削除する
$ aws s3 rb s3://mybucket
remove_bucket: mybucket
```

### バケットを強制的に削除する
`--force`オプションを付けるとバケットの全オブジェクトが削除された後、バケットが削除されます。
ただしバージョニングされたファイルがバケットに存在する場合、削除に失敗します。

```shell:バケットを強制的に削除する
$ 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`コマンドでは静的ウェブサイトホスティング用のバケット設定が行えます。

- コマンドリファレンスのURL
    - https://docs.aws.amazon.com/cli/latest/reference/s3/website.html

### 静的ウェブサイトホスティングを有効化する
以下のコマンドでバケットの静的ウェブサイトホスティングを有効化できます。
コマンドが成功した場合、レスポンスは返ってきませんが、AWSマネジメントコンソールでバケットの [プロパティ] を見ると、静的ウェブサイトホスティングが有効化されていることが確認できます。

```shell:静的ウェブサイトホスティングを有効化する
$ aws s3 website s3://example-mybucket --index-document index.html --error-document error.html
```