まず、Amazon S3 あるいは互換サービスで、オブジェクトストレージの現在の状態を rsync 的にダウンロードするのは、aws-cli の aws s3 sync
サブコマンドで実現できます。
ここで「rsync 的にダウンロードする」というのは rsync --delete
の動作を指しています。つまり以下の通り。
- コピー元(S3)にあってコピー先(ローカルディレクトリ)にないものは、ダウンロードする。
- コピー元にあってコピー先に同じものがある時は、スキップする。
- コピー元にあってコピー先に異なるものがある時は、ダウンロードして上書きする。
- コピー元になくてコピー先にあるものは、削除する。
さて、S3 には object versioning という機能があって、有効にすると保存するオブジェクトの履歴を保持することができます。これを使うと過去の任意の時刻の状態を計算することができて、つまりスナップショットと同等の機能を得られます。しかし、特定の時刻の状態を rsync 的にダウンロードすることは、aws-cli ではどうやらできません。
何かツールはないものかと探したところ、rclone の現在の master ブランチだと実現できることが分かりました。rclone は “Rclone syncs your files to cloud storage” を謳っている通り rsync 的な動作ができて、多種多様なクラウドストレージをサポートしています。時刻を指定するのは --s3-version-at
という backend 固有オプションとして実装されています。他のいくつかのクラウドストレージ向けにも同様のオプションがあるようです。
わざわざ「master ブランチだと」と書いた通り、現在の最新リリースである v1.59.2 ではサポートされていません。次のリリースの v1.60.0 ではサポートされることが期待されます。過去のリリース間隔を鑑みると11月になるでしょう。
ちなみに他に調べた範囲だと、MinIO の cli である mc は惜しいところまで行っていて、
mc cp
サブコマンドは時刻を指定できる (--rewind
) が rsync 的な動作はできない。mc mirror
サブコマンドは rsync 的な動作はできるが時刻を指定できない。
という残念なことになります。どうしてこうなった!
no comment untill now