今さらだけどS3のバージョニングを試してみた。

# はじめに
常々知ってはいたS3のバージョニング機能。なんだかんだで利用したことがなかったので、今さらですが試してみました。

今回は**hogehoge2017**というバケットを作成したので、これを使って試してみたいと思います。


# 1.バージョニングの有効化
バケットのプロパティにある**バージョニング**をクリックします。
![s3versionning01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ad0118cb-d473-118c-70cf-5aa59ed84783.png)


すると **バージョニングの有効化** ボタンが現れるのでそれをクリックして**有効化**します。

![s3versionning02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/62f966f0-b6d1-7a41-0633-068ba5e45220.png)

![s3versionning03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/0883becc-41d4-fc0b-10b7-3fe763c2aea3.png)

![s3versionning04.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ce6c873d-97c3-f73b-7b2d-5bb8c9418c8c.png)

以上で設定は完了です。


# 2.確認
では実際にバージョニングが有効化されているか確認してみます。
![s3versionning05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/180f331f-6d3c-de2b-8355-bab08a7b79a7.png)

バケットが空なので、とりあえず適当に何かアップロードしてみます。
ぱっと見はアップロードされただけで変化がないように見えます。でもよく見ると**アップロード**とかのボタンが並んでる横にバージョン**非表示/表示**のボタンがありました。
これを表示にしてみます。
![s3versionning06.png](https://qiita-image-store.s3.amazonaws.com/0/82090/76391e46-5aa3-dbd4-f542-2ba234a264cd.png)

すると画像の下に何やら表示されました。
![s3versionning07.png](https://qiita-image-store.s3.amazonaws.com/0/82090/f50d166b-271c-fe6d-7119-fa8831fe9ec6.png)

もう一度同じ画像をアップしてみまると。。。
![s3versionning08.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6f7f1932-2fef-ffec-988e-f4e7902df6fb.png)

また一段情報が追加されました。こうやってバージョン管理がされているようですね。

実際にバージョニングの変化を視覚的にも確認したいと思います。

先ほどアップロードした画像に修正を加えて再度アップロードします。
そして二つのバージョンのURLにそれぞれアクセスしてみます。
![s3versionning14.png](https://qiita-image-store.s3.amazonaws.com/0/82090/ce70de8a-c12e-5518-d723-0d15b812d3d2.png)
※今回は確認のため、事前にバケットの静的ウェブサイトホスティングを有効にしています。

まずは修正を加えてアップロードした最新の画像です。
![s3versionning10.png](https://qiita-image-store.s3.amazonaws.com/0/82090/3ab8f932-4a9b-71a5-ec40-9d12229605a8.png)

次に一つ前(修正を加える前)の画像にもアクセスしてみます。
![s3versionning09.png](https://qiita-image-store.s3.amazonaws.com/0/82090/71867607-1be9-3589-5cc3-403ef14a91d6.png)

修正前の画像が表示されるのを確認できました。


# 3.削除してみる
それではオブジェクトを削除するとどのように扱われるのでしょうか？ということで試してみます。
![s3versionning11.png](https://qiita-image-store.s3.amazonaws.com/0/82090/c25c645b-2c19-4e1d-bd60-9def1f0319fb.png)

削除すると画像ファイルは消えてしましました。
![s3versionning05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/38811139-3458-68f3-5d67-4bef6e0c1b15.png)

ですがまたバージョンを表示に切り替えてみると、、、
![s3versionning12.png](https://qiita-image-store.s3.amazonaws.com/0/82090/066d1cef-477b-c447-2732-fd41917ddc9a.png)

削除されたものには**(Delete Marker)**となり削除されたオブジェクトに対してもちゃんと管理されています。これならもし間違って削除してしまっても安心ですね。


# 4.料金課金について
バージョニングを有効にしたら課金料金とかってどういう感じになるのでしょうか？
S3の[よくある質問](https://aws.amazon.com/jp/s3/faqs/)に記載がありました。

>Q: バージョニングの使用に関してどのように課金されますか?

>通常の Amazon S3 料金は、格納またはリクエストされるオブジェクトの各バージョンについて適用されます。例えば、バージョニングを活用する際のストレージ費用を説明する以下のシナリオを見てみましょう（現在の月は31日まであると想定してください）。

>1) 月の1日目: お客様のバケット上で、4 GB（または4,294,967,296バイト）の PUT を実行します。
2) 月の 16 日目: 1 日目の最初の PUT と同じキーを使用して、同一のバケット内で、5 GB (5,368,709,120 バイト) の PUT を実行します。

>上記のオペレーションのストレージ費用を分析する際、5 GB のオブジェクトが15日目に書き込まれた時、初日の 4 GB のオブジェクトが、バケットから削除されるわけではないことにご注意ください。　そうではなく、4 GB のオブジェクトは古いバージョンとして保存され、5 GB のオブジェクトがお客様のバケット内で最も新しく書き込まれたオブジェクトのバージョンとなります。月末において:

>総バイト – 時間使用量
[4,294,967,296 バイト x 31 日間 x（24 時間/日）] + [5,368,709,120 バイト x 16 日間 x（24 時間/日）] = 5,257,039,970,304 バイト-時間。


>総 GB-月への変換
5,257,039,970,304 バイト-時間 x（1 GB/1,073,741,824 バイト）x（1 か月/744 時間）= 6.581 GB-月

>データが米国東部 (バージニア北部) リージョンに保存されると仮定した場合、ストレージ料金は以下のように計算されます。
0～1 TB 利用枠: 6.581 GB x 0.0300 USD = 0.20 USD

つまり差分とかの扱いがないため、それぞれ別オブジェクトという認識で扱われるみたいです。


# おわりに
S3のバージョニング機能を利用すると、誤ってファイルを削除しても復元できるのでとても便利だなと感じました。
ただ、バージョニング機能を有効にしているだけだとひたすらオブジェクトが増えて言ってしまうので気がついたらとんでもないことに。。。
なのでバージョニングを有効にしたら忘れずにライフサイクルポリシーも設定するようにしましょう。