さるへい備忘録

さるへいのやったことを綴っているブログです。基本的にテクノロジーの話題です。

S3で画像をバックアップしてみようの巻

前回

saruhei1989.hatenablog.com

の記事の最後に、レプリケーションはバックアップじゃないとお話しましたね。
そう、バックアップじゃないのです。でもS3サーバのバックアップほしいときってありますよね?
僕はほしいです。

ということで、なんとかしたかったので色々考えてみました。

最終目的

僕のほしいバックアップの最終形態の要件は、

  • バックアップしたいバケットに入っているファイルと同じものがバックアップ先にもはいっている
  • 間違えて変更、削除しちゃったりしてからしばらくたってもすぐ復旧することができる

になります。後者が現状のレプリケーション機能だと難しいわけですね。非同期プロセスで迅速に同期されてしまうので、うっかりに数時間気が付かなかった場合など大変なことになります。 例えば、一括変更して間違えて多数のファイルを書き換えてしまった場合などですね。

どんなバックアップができればよいか

前述の目的を叶えるには

一定期間頃に目的のファイルを格納した場所をつくる

でだいたい問題ありません。一定期間をだいたい1週間毎にしておけば、1箇所しかバックアップがなくてもだいたい7日間は割と事故前に近い状況に戻せるというわけですね。
お金に余裕があれば1日ごとのバックアップを7日分確保とかすればよいでしょう。

どうするか?

ここで本題です。バックアップの手法っていろいろありますよね。 よく聞くやり方だと

といったやり方がありますね。それぞれの手法は調べてみてください。
そして、今回は増分バックアップを採用しました。理由としては、フルバックアップだと通信費とかがバカみたいに毎回かかる。差分バックアップはバックアップからの復帰機能をつくるのがしんどそう。といった形です。

具体的な方法

最初に今回の手法の全容を箇条書きにしちゃいます。

  1. (初回のみ)初期状態として、バックアップ元をバックアップ先へバックアップとる回数分フルバックアップする。7個バックアップ作りたい場合は7個のバックアップ先をつくって7回フルバックアップするという感じですね。
  2. 設定した期間の増分、変更分を取得してその分だけ変更をバックアップ対象に適用する。

はい。簡単ですね。それぞれどうやったかを説明します。

初期状態として、バックアップ元をバックアップ先へバックアップとる回数分フルバックアップする

これは非常に簡単です。バックアップ対象をそのままコピーなりなんなりすればいいだけです。
だいたいはマネジメントコンソールのディレクトリまとめてコピーでなんとかなりますが、メタデータもコピーしたい場合は AWS CLIのオブジェクトコピー機能でがんばってメタデータまでコピーしましょう。
僕はいらなかったのでマネジメントコンソールで男気コピーです。

設定した期間の増分、変更分を取得してその分だけ変更をバックアップ対象に適用する。

これがやっかいでした。

変更分をどうやって取得するかって結構難しいんですね。 最初はAWS CLIでなんとかなるだろって高をくくっていたのですが。

docs.aws.amazon.com

こんな感じで、ファイル一覧を取得するにも、取得できるファイル数に上限があるんですね。正直数十万とかファイルがあると非現実な方法になってしまいます。

そこでAWSテクニカルサポート先生にお聞きしてみました。さすがテクニカルサポート先生ですね、さすがの答えを教えてくれました。

docs.aws.amazon.com

S3インベントリ機能です。これは単純に指定した期間ごとに対象に格納されているファイルの一覧をCSVで出してくれるって機能です。
つまり、AWS CLIで何回もファイル一覧をページングして頑張って取得する必要がないということです。
これで変更分の取得も解決しました。

最終的にはこんな感じです。

f:id:saruhei1989:20211210161405p:plain
構成図

バックアップ先を複数もっておけば、複数期間のバックアップもできちゃいますね。
これは、結構ニッチな要件かもしれませんが、S3を画像置きにしている際などはなかなかに活躍してくれると思っています。