resticを利用してさくらのクラウドのオブジェクトストレージにバックアップしてみた

バックアップ取得していますか?
さくらのオブジェクトストレージはAmazon S3互換APIを備えているので、resticのS3バックエンドがそのまま使えます。
restic を使い、保存先を さくらのクラウド オブジェクトストレージ に保存できるか検証してみました。


 さくら側の準備 

 コントロールパネルの「オブジェクトストレージ」から、サイトの利用開始 → バケット作成 → パーミッション作成でアクセスキー発行、という流れです。 

サイト エンドポイント リージョン
石狩第1 s3.isk01.sakurastorage.jp jp-north-1
東京第1 s3.tky01.sakurastorage.jp jp-east-1
アーカイブプラン s3.arc02.sakurastorage.jp jp-east-1

リポジトリの初期化

環境変数でまとめて設定します。
アクセスキーはパーミッション設定から発行したものを使います。resticは prune でオブジェクトの削除も行うので READ/WRITE を付与してください。シークレットアクセスキーは発行直後にしか表示されないので控え忘れに注意。

なお、さくらのS3互換APIには PUT Bucket が含まれていないため、バケットはコントロールパネル側で先に作っておく必要があります。

# /etc/restic/sakura.env
export RESTIC_REPOSITORY="s3:https://s3.isk01.sakurastorage.jp/your-bucket-name"
export RESTIC_PASSWORD_FILE="/etc/restic/password"
export AWS_ACCESS_KEY_ID="<アクセスキーID>"
export AWS_SECRET_ACCESS_KEY="<シークレットアクセスキー>"
export AWS_DEFAULT_REGION="jp-north-1"

以下でパスワードファイルの作成と権限設定 を行います。
このパスワードを失うと復元不能なので、別の場所にも必ず控えておきましょう。

# sudo mkdir -p /etc/restic
openssl rand -base64 32 | sudo tee /etc/restic/password > /dev/null
sudo chmod 600 /etc/restic/password /etc/restic/sakura.env

source /etc/restic/sakura.env
restic init
created restic repository 3f9c1a8b2e at s3:https://s3.isk01.sakurastorage.jp/your-bucket-name 

バックアップとリストア

restic backup /var/www /etc --exclude-caches --verbose 

Files:        12043 new,     0 changed,     0 unmodified
Added to the repository: 1.842 GiB (743.219 MiB stored)
snapshot 8a1f2c04 saved

2回目以降は差分だけになります。

restic backup /var/www /etc --exclude-caches --verbose 

Files:           18 new,    42 changed, 11983 unmodified
Added to the repository: 24.118 MiB (9.402 MiB stored)
snapshot c73b9e51 saved

12,000ファイル・1.8GiBに対して追加保存は9MiB。この差分効率がresticの一番おいしいところです。バックアップは戻せることを確認するまで完了ではないので、リストアも試します。

restic snapshots
restic restore latest --target /tmp/restore

restic mount /mnt/restic でスナップショットをマウントできるので、「あのファイルの3日前の状態だけ見たい」というときに便利です。

世代管理と定期実行

forget でスナップショットを削除、prune で参照されなくなった実データを削除できます。--prune で一括実行できます。

restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

cronやsystemd timerで回すこともできます。

#!/bin/bash
set -euo pipefail
source /etc/restic/sakura.env

restic backup /var/www /etc --exclude-caches --tag daily

# 世代管理と整合性チェックは週1回
if [ "$(date +%u)" -eq 7 ]; then
  restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
  restic check --read-data-subset=5%
fi

まとめ

resticのS3バックエンドで素直に動きました。押さえておくのは以下くらいです。

・バケットは先にコントロールパネルで作る(S3互換APIでは作れない)
・リージョンを明示する(未指定だと us-east-1)
・restic check --read-data-subset を定期実行して整合性は自分で担保する
・pack単位で保存するのでオブジェクト数課金に強く、アップロードは無課金。数十GiB規模なら月495円