S3 ライフサイクルルール作成

## はじめに
業務でS3のライフサイクルルールを作成する際、バージョニングとライフサイクルの挙動が分かりづらく、作成するのが大変でした。

バージョニング・ライフサイクルの概要・作成方法をまとめたので、記事に残したいと思います。

## バージョニング
### 概要
・ライフサイクルルールを作成するためには、S3バケットのバージョニングを有効にする必要がある。

・S3 バージョニングを使用すると、オブジェクトの複数のバージョンを１つのバケットに保持し、誤って削除・上書きされたオブジェクトを復元することができる。

・オブジェクトを削除した場合、オブジェクトを完全に削除する訳ではなく、オブジェクトに削除マーカーを挿入し、それが最新のオブジェクトバージョンになる。そのため、以前のバージョンを復元することができる。

・オブジェクトを上書きした場合、オブジェクトに新しいバージョンが追加される。以前のバージョンはバケットに残るが、最新のバージョンではなくなる。削除した場合と同様に、以前のバージョンは復元することができる。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/versioning-workflows.html#versioning-workflows-examples

・S3の料金は、保存または移行されるオブジェクトのバージョンごとに適用される。オブジェクトの各バージョンはオブジェクト全体であり、以前のバージョンの差分ではないことに注意。

例えば、オブジェクトで３つのバージョンを保存している場合は、３つのオブジェクト全てが課金対象となる。

・バージョニングが可能な世代数は数百万以上だが、数百万のバージョンが存在するとレスポンス低下の可能性がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/37d728b3-958a-5907-0749-34a878d9acf5.png)

## ライフサイクルルール
### 概要
ライフサイクルルールで設定可能な項目は以下の5つとなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/00ad5e7a-1747-7924-a0a9-88c54c645a5e.png)

#### ①オブジェクトの最新バージョンをストレージクラス間で移動
オブジェクトの最新バージョン（現行バージョン）を作成から**xx**日後にストレージクラス間の移動をおこなう。

#### ②オブジェクトの非現行バージョンをストレージクラス間で移動
オブジェクトの非現行バージョンを作成から**xx**日後にストレージクラス間の移動をおこなう。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html

#### ③オブジェクトの現行バージョンを有効期限切れにする
有効期限切れとは、削除マーカー（**論理削除**）状態にすること。

※オブジェクトの有効期限は、オブジェクトの最新のバージョンにのみ適用される。(最新以外のバージョンには影響無し)

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html

#### ④オブジェクトの非現行バージョンを完全に削除
非現行バージョンの削除ルールを設定する。

設定項目は以下の２つ。
・オブジェクトが現行バージョンでなくなってからの日数
⇒削除マーカーに変更されてからの経過日数

・保持する新しいバージョンの数 - オプション
⇒非現行バージョンの中で、何世代保持するかの数

#### ⑤有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除

・期限切れのオブジェクト削除マーカーを削除する
⇒オブジェクトが「削除マーカー」の状態となった場合に、「削除マーカー」を削除するかの設定。

・不完全なマルチパートアップロードを削除
⇒マルチパートアップロードが失敗した際に残ってしまう「部分ファイル」を削除するかの設定。部分ファイルはマネジメントコンソールから見ること・消すことができないため、特に理由が無ければ設定を入れることを推奨。

## 設定例
以下の手順でライフサイクルルールを設定しました。


#### １．バージョニングの有効化
:::note warn
ライフサイクルルール作成前に実施する。
:::

①設定対象バケットの「プロパティ」タブを開き、「バケットのバージョニング」の「編集」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/03428a42-6f85-3692-ef19-1349b470cb89.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/c23221be-dbed-92bf-ccfa-58459519c464.png)

②「バケットのバージョニング」画面が表示されたら、「有効にする」を選択し、「変更の保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/870996d0-dd7c-2d7c-9e0d-16cf80e1a056.png)

③バージョニングが有効化されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/fd9ae82f-8941-d1c5-ff0c-b412df0d33ac.png)

#### ２．ライフサイクルルール作成

今回は以下の条件で設定します。
・**５年後**にすべてのオブジェクトの現行バージョンを有効期限切れにする。
・**１日後**にすべてのオブジェクトの非現行バージョンを削除する。

***

・「現行バージョンを有効期限切れにする」ルールの作成

①設定対象バケットの「管理」タブを開き、「ライフサイクルルール」の「ライフサイクルルールを作成する」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/526bccff-192e-ff70-e677-824c227ed5a6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/e4c1596c-ef1b-a9a7-c327-ba189b6e7615.png)

②「ライフサイクルルールの設定」にて、「ライフサイクルルール名」「ルールスコープを選択」を入力・選択する。入力・選択後、「バケット内のすべてのオブジェクトに適用」にチェックを入れる。

| 設定項目 | 設定値 |
|:-:|:-:|
| ライフサイクルルール名 | ※任意（5y、1dなど設定期間を含めると良い） |
| ルールスコープを選択 | バケット内のすべてのオブジェクトに適用 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/5912b36b-e698-63e8-24fa-accd4f1e1c16.png)

③「ライフサイクルルールのアクション」にて、「オブジェクトの現行バージョンを有効期限切れにする」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/7eb11a01-4970-0ee3-bd17-79d10fcfe2a3.png)

④「オブジェクトの現行バージョンの有効期限が切れる」にて、「オブジェクト作成後の日数」を入力する。
※今回は５年保管なので**1830**を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/83406a5b-5709-639c-7d9f-4084b16828d5.png)

⑤設定情報が正しいことを確認し、「ルールの作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/81cca02b-db8f-f231-cb42-77ff9b52c8a6.png)

⑥ライフサイクルルールが作成されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/60f642c3-fb32-cca8-b668-c2a83c5cfe5c.png)

***

・「非現行バージョンを削除する」ルールの作成

:::note info
①と②の手順は同様です。
:::


①設定対象バケットの「管理」タブを開き、「ライフサイクルルール」の「ライフサイクルルールを作成する」をクリックする。

②「ライフサイクルルールの設定」にて、「ライフサイクルルール名」「ルールスコープを選択」を入力・選択する。入力・選択後、「バケット内のすべてのオブジェクトに適用」にチェックを入れる。

③「ライフサイクルルールのアクション」にて、「オブジェクトの非現行バージョンを完全に削除」「有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/ee0db707-09ae-412d-00b8-dfcddaceae58.png)

④「オブジェクトの非現行バージョンを完全に削除」にて、「オブジェクトが現行バージョンでなくなってからの日数」「保持する新しいバージョンの数 - オプション」を入力する。

| 設定項目 | 設定値 |
|:-:|:-:|
| オブジェクトが現行バージョンでなくなってからの日数 | 1 |
| 保持する新しいバージョンの数 - オプション | ※空白（設定しない） |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/b536c79e-3759-8f7a-a8f6-8ba3f369c550.png)

⑤「有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除」にて、「期限切れのオブジェクト削除マーカー」「未完了のマルチパートアップロード」「ルールスコープを選択」を入力・選択する。

| 設定項目 | 設定値 |
|:-:|:-:|
| 期限切れのオブジェクト削除マーカー | 期限切れのオブジェクト削除マーカーを削除する |
| 未完了のマルチパートアップロード | 不完全なマルチパートアップロードを削除 |
| ルールスコープを選択 | 1 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/7ade31e9-f48e-8d30-c63e-4fd5a58d679d.png)

⑤設定情報が正しいことを確認し、「ルールの作成」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/81cca02b-db8f-f231-cb42-77ff9b52c8a6.png)

⑥ライフサイクルルールが作成されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570295/b10a85fe-a5c4-1255-a229-613980113228.png)


## まとめ
今回はバージョニング・ライフサイクルの概要・作成方法をまとめました。

「非現行バージョン」というものがあること、オブジェクトを完全に削除するためには現行バージョンを有効期限切れにし、非現行バージョンを削除といった手順を踏む必要があることを理解できました。

本記事が少しでもお役に立てれば幸いです。