AWS S3の大量削除方法

## AWS S3とは

S3とはデータを格納・管理できるオブジェクトストレージサービスです。 主にウェブサイトやアプリケーションなどのデータバックアップおよび復元、アーカイブなど、さまざまなことに利用します。
また、ファイルのバックアップ、ファイル処理の加工前、あるいは加工後のファイルの保存、動画・画像ファイルやCSSなどWebで使う静的なファイルをS3に置いて配信するなど、非常に広範囲な使い方ができます。

## 削除？

大きプロジェクトが終わると色々がいらなくになります、サーバーもそうですし、ELBなどもいらないです。S3も同じです！

料金を見ると：

最初の 50 TB/月	0.023USD/GB
次の 450 TB/月	0.022USD/GB
500 TB/月以上	0.021USD/GB

これを見ると安いってイメージですが、100TBあったら月で2000ドル超えてます！なので「いらないファイルとバケットを調査して、削除！」の気持ちになります。

## マネジメントコンソール
あるバケットが使われてない古いファイルを見つかって削除した！マネジメントコンソール入って、フォルダを選んで!
![Screen Shot 2022-03-15 at 14.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/d19e26f7-1aac-64fa-34b4-dbae2892b032.png)

そんなに簡単だと思ってたら色々問題が出てました。。大きファイルに対しては優秀！小さい大量のファイルだと。。

![Screen Shot 2022-03-15 at 19.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/786a8879-4088-d0c6-3843-fa227dcaa3bd.png)

なぜか画面が真っ白になってました、別にセッションが切れてたわけではないので完全にバグですね。。

## AWScliを使えましょう

高レベル aws s3 コマンドを使用すると、Amazon S3 オブジェクトの管理が容易になります。これらのコマンドにより、Amazon S3 のコンテンツの管理をそれ自体の内部およびローカルディレクトリ内で管理することができます。

#### ファイル確認

バケット、フォルダ、オブジェクトのいずれかを一覧表示するには、s3 ls コマンドを使用します。ターゲットまたはオプションを指定せずにコマンドを使用すると、すべてのバケットが一覧表示されます。

```console
$ aws s3 ls s3://bucket/
```

バケット丸ごと見たい場合は全部出てますので確認出来ますがフィルターを付けたい場合は `s3 ls`だけで足りないです！その場合は`s3 sync`を使う場合！

s3 sync コマンドはバケットとディレクトリの内容、または 2 つのバケットの内容を同期します。通常、s3 sync は欠落しているか古くなったファイルやオブジェクトを、ソースとターゲットの間でコピーします。ですが、`--dryrun`をオプション付けたら、ファイルの名前だけは出来ます！

他の便利オプションはlsと違ってフィルタリングが出来ます！`s3 cp`、`s3 mv`、`s3 sync`、`s3 rm` のいずれかのコマンドを使用する場合、`--exclude` オプションまたは `--include` オプションを使用して結果をフィルタリングできます。`--exclude` オプションは、コマンドからオブジェクトのみを除外するようにルールを設定します。各オプションは、指定した順に適用されます。これを次の例で示します。

```console:「d」から始まるファイル名を出す
$ aws s3 sync s3://bucket/logs/ . --exclude "*" --include "d*" --dryrun
```

フィルタリングするんだったらもっと早いでしょうね！ではなかった。。コスパとしてはあんまり変わりません、実は `s3 ls`と`grep`を使うと同じ効率でした。

```console:同じコスパ：
$ aws s3 ls s3://bucket/ | grep "d*"
$ aws s3 sync s3://bucket/logs/ . --exclude "*" --include "d*" --dryrun
```
削除対象のファイルを確認出来たら次のステップは削除！

#### ファイル削除

これも分かりやすいです、macとlinuxと一緒のrmコマンド。

```
$ aws s3 rm s3://bucket/file.txt
```
残念ながらrmのエンドポイントはワイルドカードは使えません！`s3 sync`と同じく、`--exclude`と`--include`を使うべきです！

```console:同じコスパ：
$ aws s3 rm s3://bucket/logs/ --exclude "*" --include "d*" --recursive
```
#### 注意

`s3 rm`は`s3 ls`の結果を見て削除しています。とは、削除対象のファイルをlsの結果出てから削除始まります！「d」を削除対象にしても、「a,b,c」のファイル名を読んでるんです、「d」のファイルを削除終わっただとしても、「z」までのファイルを読んでますのでプロセスがすごく長い場合もありま。

確認しやすいコマンド：

```bash
function s3google(){
  letter=$1 | tr "." "\."
  aws s3 ls s3://bucket/ 2>/dev/null | grep -m1 "PRE $letter.*"
}
```
それでいくつのファイル名を確認出来ます、grepの-m1は初めてのgrepヒットだけ出して、プロセスを切ってますのでlsの終わりを待てないきて大丈夫ですが、一気にs3 lsを切るとエラーが表示されてますので`2>/dev/null`を入れてます。
```console
$ s3google l;s3google c;
  leets.txt
  console.txt
```

それで削除出来ます！コスパはそんなに良くない、数億ファイルあれば数日かかってます。

それでやっと良いコスパを見つかりました！

## ストレージのライフサイクル


オブジェクトがライフサイクルを通じてコスト効率の高い方法で保存されるように管理するには、Amazon S3 ライフサイクルを設定します。S3 ライフサイクル設定は、Amazon S3 がオブジェクトのグループに適用するアクションを定義するルールのセットです。

ファイルがアップロードされてから数日後にアクションを入れてます！ストレージの設定なので別のストレージクラスに移動出来ます、削除も出来ます。

例えば、logsをキープしたいですがそんなに１週間前のログはあんまり見ないのでログがアップロードされてから１週間後にstandardからGlacierに移動します！それで半年前のログいる？いらないですね、じゃ180日になったら削除の設定もします。
結果：
![Screen Shot 2022-06-17 at 18.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/bda4a7d6-7c04-bce2-0eea-26ec23e47a14.png)
それで自動に古いログがそんなに料金は取らないし、確認しやすいし。

バケット毎に設定する物です、これは設定画面：
![screencapture-s3-console-aws-amazon-s3-management-data-analytics-metaps-com-lifecycle-edit-2022-06-17-18_25_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/e3afd684-b02f-aaeb-2a44-4d4ae18b5181.png)

気になってたのは「アップロードされてから」の言葉、設定した前のファイルに対象にならない？
古いファイルのバケットのライフサイクルを新規設定してました、古いファイルが無事に削除されてました！！結構コスパが良い！画面で設定して、全部を任せする！


以上。