プログラマでありたい

おっさんになっても、プログラマでありつづけたい

AWSのS3のバージョニングとライフサイクルの組み合わせについて

 S3を使っていて、初見でイマイチ腑に落ちないのが、バージョニングです。このバージョニング機能は、その名の通りオブジェクトの履歴管理を行いオブジェクトが更新されるたびに新たな履歴として追加していきます。これが腑に落ちないとなるのは、何ででしょうか?順番に説明していきます。

f:id:dkfj:20201005080025p:plain

バージョニングとライフサイクルの機能解説

 まずはS3のバージョニングとライフサイクルの機能の概要を見ていきましょう。どちらも考え方としては、非常にシンプルです。

S3のバージョニングの機能

 S3のバージョニングを有効にすると、オブジェクトの更新履歴を保持します。保存期間・世代数はバージョニング機能で指定できないので、永遠に保持し続けます。まず、ここが最初の?となるポイントです。保存期間・世代数の指定方法を無しに、どうやって制限するのと思うのではないでしょうか?AWSは、そこをライフサイクルという別の機能でカバーしています。

S3のライフサイクル機能

 S3のライフサイクルを使うと、ルールに従ってストレージクラスの変更とオブジェクトの削除ができます。また、対象は「現行バージョン」と「以前のバージョン」をそれぞれ指定可能です。ここで、「以前のバージョン」を指定することによりバージョニングを有効にした場合のオブジェクトの管理ができます。バージョニング設定はオン・オフしかできなくて、過去バージョンを管理するのがライフサイクルという別の機能というのがAWSらしい設計思想です。
 では、実際にライフサイクルの画面をみて確認してみましょう。ファイルの削除は「有効期限」の設定画面で失効の設定を行うことによりできます。バージョニングによる過去の履歴ファイルを消したい場合は、「以前のバージョン」をチェックの上で、○○日以前のオブジェクトを消すか設定します。

f:id:dkfj:20201005090950p:plain

 この時点で、また疑問が出てくると思います。バージョニングとライフサイクルの組み合わせで、例えば何世代残すという設定はできないのでしょうか?答えとしては、S3の機能だけではできません。S3のバージョニング機能とライフサイクルのファイル削除機能でできるのは、過去の更新履歴を残し続けること、一定期間が過ぎたオブジェクトを消すことの、シンプルな2点のみです。

f:id:dkfj:20201007132938p:plain

ユースケース別にS3のバージョニング機能の適合性を考える

 S3のバージョニング機能とライフサイクル機能を抑えたうえで、じゃぁどういったパターンで使うのかという話になります。よく聞かれるケースを3つほど紹介してみます。

ケース1 Gitのようなタグやブランチで管理したい

 無理!!

素直にGit系のサービスを使ってください。AWSだったらCodeCommit

ケース2 バケット内の全てのファイルを、1世代前のオブジェクトに戻したい

 出来るけど、たぶんやりたい事と違う動きになる

スクリプトを組んで、全部のオブジェクトを1世代前に戻すことは可能です。でも、S3の世代の概念は、オブジェクトごとです。そのため1世代前のファイルが3日前に更新されたものもあれば、1年前ということもありえます。そんな状態で1世代前に戻しても意味がないです。

ケース3 バケット内の全てのファイルを、特定日付のオブジェクトに戻したい

 出来なくはないけど、自分で実装が必要

オブジェクトごとに履歴があって日付の情報もあるので、一つづつのオブジェクトに対して調べてバージョン指定で戻すということで実現ができます。ただし、対象ファイルが多いと手作業で出来るものではないので、何らかのプログラムが必要になります。何が事があってからでは厳しいので、そういったことが必要であれば事前に作って検証しておきましょう。

まとめ

 S3のバージョニングとライフサイクルの話でした。AWSらしくそれぞれの機能はシンプルです。その特性を使ってどうするかというは、料理人の腕次第です。個人的には、バックアップと特定日での戻しに関して言うと、S3と連携する専用のバックアップソフトを使うことをお勧めです。また、静的Webサイトに多いリリース前に戻したいという要件は、複数のバケットを使ったBlue/Greenデプロイを使うのがいいんじゃないかなと思っています。現場からは以上です。