ResticBackupClientを使用してデータをオブジェクトストレージサービスにバックアップする方法
序章
Restic は、Go言語で記述された安全で効率的なバックアップクライアントです。 ローカルファイルを、ローカルディレクトリ、SFTPサーバー、S3互換のオブジェクトストレージサービスなど、さまざまなバックエンドリポジトリにバックアップできます。
このチュートリアルでは、Resticをインストールし、オブジェクトストレージサービスのリポジトリを初期化します。 次に、いくつかのファイルをリポジトリにバックアップします。 最後に、バックアップを自動化して1時間ごとのスナップショットを作成し、必要に応じて古いスナップショットを自動的に削除します。
前提条件
このチュートリアルでは、バックアップしたいファイルがいくつかあるUNIXベースのコンピューターが必要です。 ResticはMac、Linux、およびWindowsで使用できますが、このチュートリアルで使用されるコマンドとテクニックはMacOSとLinuxでのみ機能します。
Resticを実行するには大量のメモリが必要なため、エラーを受け取らないように1GB以上のRAMが必要です。
また、オブジェクトストレージサービスに関する次の詳細を知っておく必要があります。
- アクセスキー
- シークレットキー
- サーバーのURL
- バケット名
DigitalOcean Spaces オブジェクトストレージサービスを使用している場合は、チュートリアル DigitalOceanSpaceとAPIキーの作成方法に従って、Spaceを設定し、上記のすべての情報を取得できます。
オブジェクトストレージ情報を取得したら、次のセクションに進んでResticソフトウェアをインストールします。
Resticバックアップクライアントのインストール
Resticは、多くのプラットフォームでプリコンパイルされた実行可能ファイルとして利用できます。 これは、単一のファイルをダウンロードして実行できることを意味します。パッケージマネージャーや依存関係は必要ありません。
ダウンロードする適切なファイルを見つけるには、まずWebブラウザーを使用して、GitHubのResticのリリースページに移動します。 Downloadsヘッダーの下にファイルのリストがあります。
64ビットLinuxシステム(最も一般的なサーバー環境)の場合、ファイルの末尾を_linux_amd64.bz2
にする必要があります。
MacOSの場合は、_darwin_amd64.bz2
のファイルを探します。
ご使用のシステムに適したファイルを右クリックし、リンクアドレスのコピーを選択します(ブラウザによっては表現が若干異なる場合があります)。 これにより、ダウンロードURLがクリップボードにコピーされます。
次に、バックアップしているコンピューターのターミナルセッションで(リモートマシンの場合は、最初にSSH経由でログインする必要がある場合があります)、ホームディレクトリにいることを確認してから、[を使用してファイルをダウンロードします。 X200X]:
cd ~ curl -LO https://github.com/restic/restic/releases/download/v0.7.3/restic_0.7.3_linux_amd64.bz
ダウンロードしたファイルを解凍します。
bunzip2 restic*
次に、ファイルを/usr/local/bin
にコピーし、そのアクセス許可を更新して実行可能にします。 通常のユーザーには/usr/local/bin
への書き込み権限がないため、これら2つのアクションにはsudo
を使用する必要があります。
sudo cp restic* /usr/local/bin/restic sudo chmod a+x /usr/local/bin/restic
引数なしでrestic
コマンドを呼び出して、インストールが成功したことをテストします。
restic
一部のヘルプテキストが画面に印刷されます。 その場合、restic
バイナリは正しくインストールされています。 次に、Resticの構成ファイルを作成し、オブジェクトストレージリポジトリを初期化します。
構成ファイルの作成
Resticは、バックアップできるリポジトリを初期化するために、アクセスキー、秘密キー、オブジェクトストレージ接続の詳細、およびリポジトリパスワードを知っている必要があります。 環境変数を使用して、この情報をResticで利用できるようにします。
環境変数は、シェルで定義できる情報のビットであり、実行するプログラムに渡されます。 たとえば、コマンドラインで実行するすべてのプログラムは、現在のディレクトリのパスを含む$PWD
環境変数を見ることができます。
コマンドラインでそれらを指定することは安全ではないため、機密性の高いトークンとパスワードを環境変数に入れるのが一般的な方法です。 後でバックアップを自動化するので、この情報をスクリプトがアクセスできるファイルに保存します。
まず、ホームディレクトリでファイルを開きます。
nano ~/.restic-env
これにより、nano
テキストエディタで空のファイルが開きます。 完了すると、ファイルは4つのexport
コマンドで構成されます。 これらのexport
ステートメントは環境変数を定義し、将来実行するすべてのプログラムでそれらを利用できるようにします。
.restic-env
export AWS_ACCESS_KEY_ID="your-access-key" export AWS_SECRET_ACCESS_KEY="your-secret-key" export RESTIC_REPOSITORY="s3:server-url/bucket-name" export RESTIC_PASSWORD="a-strong-password"
アクセスキーと秘密キーは、オブジェクトストレージサービスによって提供されます。 キーが紛失したり侵害されたりした場合にアクセスを簡単に取り消すことができるように、Restic専用の一意のキーセットを生成することをお勧めします。
RESTIC_REPOSITORY
の値の例は、s3:nyc3.digitaloceanspaces.com/example-bucket
です。 非標準ポートまたはセキュリティで保護されていないHTTPのみを介してサーバーに接続する必要がある場合は、s3:http://example-server:3000/example-bucket
のようにその情報をURLに含めます。
RESTIC_PASSWORD
は、Resticがバックアップの暗号化に使用するパスワードを定義します。 この暗号化はローカルで行われるため、ファイルの内容が公開されることを心配することなく、信頼できないオフサイトサーバーにバックアップできます。
ここで強力なパスワードを選択し、バックアップのために安全な場所にコピーする必要があります。 強力なランダムパスワードを生成する1つの方法は、openssl
コマンドを使用することです。
openssl rand -base64 24
Outputj8CGOSdz8ibUYK137wtdiD0SJiNroGUp
これにより、24文字のランダムな文字列が出力され、これをコピーして構成ファイルに貼り付けることができます。
すべての変数が正しく入力されたら、ファイルを保存して閉じます。
リポジトリの初期化
構成をシェル環境にロードするために、作成したファイルをsource
します。
source ~/.restic-env
変数の1つを出力することにより、これが機能することを確認できます。
echo $RESTIC_REPOSITORY
リポジトリのURLが出力されます。 これで、Resticコマンドを使用してリポジトリを初期化できます。
restic init
Outputcreated restic backend 57f73c1afc at s3:nyc3.digitaloceanspaces.com/example-bucket Please note that knowledge of your password is required to access the repository. Losing your password means that your data is irrecoverably lost.
これで、リポジトリはバックアップデータを受信する準備が整いました。 次にそのデータを送信します。
ディレクトリのバックアップ
リモートオブジェクトストレージリポジトリが初期化されたので、バックアップデータをそこにプッシュできます。 暗号化に加えて、Resticはバックアップ中に差分と重複排除を行います。 つまり、最初のバックアップはすべてのファイルの完全バックアップであり、後続のバックアップは新しいファイルと変更を送信するだけで済みます。 さらに、重複データが検出され、バックエンドに書き込まれないため、スペースが節約されます。
バックアップする前に、ベアシステムでテストを行っていて、バックアップするサンプルファイルが必要な場合は、ホームディレクトリに簡単なテキストファイルを作成します。
echo "sharks have no organs for producing sound" >> ~/facts.txt
これにより、facts.txt
ファイルが作成されます。 次に、ホームディレクトリの残りの部分と一緒にバックアップします。
restic backup ~
Outputscan [/home/sammy] scanned 4 directories, 14 files in 0:00 [0:04] 100.00% 2.558 MiB/s 10.230 MiB / 10.230 MiB 18 / 18 items 0 errors ETA 0:00 duration: 0:04, 2.16MiB/s snapshot 427696a3 saved
Resticは少しの間機能し、途中でライブステータスの更新を表示してから、新しいスナップショットのIDを出力します(上で強調表示されています)。
注:別のディレクトリをバックアップする場合は、上記の~
をディレクトリのパスに置き換えてください。 ターゲットディレクトリがユーザーによって所有されていない場合は、restic backup
の前にsudo
を使用する必要がある場合があります。 バックアップにsudo
が必要な場合は、スナップショットを復元するときにもう一度使用することを忘れないでください。そうしないと、権限を適切に設定できないというエラーが発生する可能性があります。
次に、リポジトリに保存されているスナップショットに関する詳細情報を見つける方法を学習します。
スナップショットの一覧表示
リポジトリに保存されているバックアップを一覧表示するには、snapshots
サブコマンドを使用します。
restic snapshots
OutputID Date Host Tags Directory ---------------------------------------------------------------------- 427696a3 2017-10-23 16:37:17 restic-test /home/sammy
最初のバックアップ中に受信したスナップショットID、スナップショットが作成されたときのタイムスタンプ、ホスト名、タグ、およびバックアップされたディレクトリを確認できます。
この例では何も使用しなかったため、Tags列は空白です。 --tag
フラグの後にタグ名を含めることで、スナップショットにタグを追加できます。 --tag
オプションを繰り返すことで、複数のタグを指定できます。
タグは、後で保持ポリシーを設定するとき、または復元する特定のスナップショットを手動で検索するときに、スナップショットをフィルタリングするのに役立ちます。
Host は、複数のホストから単一のリポジトリにスナップショットを送信できるため、リストに含まれています。 リポジトリのパスワードを各マシンにコピーする必要があります。 リポジトリに複数のパスワードを設定して、よりきめ細かいアクセス制御を行うこともできます。 リポジトリパスワードの管理の詳細については、公式のResticドキュメントを参照してください。
スナップショットがアップロードされ、リポジトリの内容を一覧表示する方法がわかったので、スナップショットIDを使用してバックアップの復元をテストします。
スナップショットの復元
スナップショット全体を一時ディレクトリに復元して、すべてが正しく機能していることを確認します。 前の手順のリストのスナップショットIDを使用します。 復元したファイルを/tmp/restore
の新しいディレクトリに送信します。
restic restore 427696a3 --target /tmp/restore
Outputrestoring <Snapshot 427696a3 of [/home/sammy] at 2017-10-23 16:37:17.573706791 +0000 UTC by sammy@restic-test> to /tmp/restore
ディレクトリに移動し、その内容を一覧表示します。
cd /tmp/restore ls
バックアップしたディレクトリが表示されます。 この例では、ユーザーsammyのホームディレクトリになります。 復元されたディレクトリに入り、内部のファイルを一覧表示します。
cd sammy ls
Outputfacts.txt restic_0.7.3_linux_amd64
facts.txt
ファイルと、チュートリアルの最初に抽出したレスティックバイナリがあります。 facts.txt
を画面に印刷して、期待どおりであることを確認します。
cat facts.txt
以前にファイルに入れたサメの事実を確認する必要があります。 機能した!
注:スナップショット内のすべてのファイルを復元したくない場合は、--include
および--exclude
オプションを使用して選択を微調整できます。 詳細については、Resticドキュメントの[復元]セクションをお読みください。
バックアップと復元が機能していることがわかったので、新しいスナップショットの作成を自動化しましょう。
バックアップの自動化
Resticには、スナップショットの実行中のアーカイブを維持するのに役立つforget
コマンドが含まれています。 restic forget --prune
を使用して、毎日、毎時、毎週などに保持するバックアップの数に関するポリシーを設定できます。 ポリシーに適合しないバックアップは、リポジトリから削除されます。
cron
システムサービスを使用して、1時間ごとにバックアップタスクを実行します。 まず、ユーザーのcrontabを開きます。
crontab -e
テキストエディタを選択するように求められる場合があります。 お気に入りを選択するか、意見がない場合はnano
を選択し、ENTER
を押します。 ユーザーのデフォルトのcrontabがテキストエディタで開きます。 crontabの構文を説明するコメントが含まれている場合があります。 ファイルの最後で、次を新しい行に追加します。
crontab
. . . 42 * * * * . /home/sammy/.restic-env; /usr/local/bin/restic backup -q /home/sammy; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7
このコマンドをステップスルーしてみましょう。 42 * * * *
は、cron
がタスクを実行するタイミングを定義します。 この場合、時間、日、月、および曜日ごとの42番目の分で実行されます。 。 この構文の詳細については、チュートリアルCronを使用してタスクを自動化する方法をお読みください。
次に、. /home/sammy/.restic-env;
は、キーとパスワードをシェル環境にロードするために以前に実行したsource ~/.restic-env
と同等です。 これは、crontabでも同じ効果があります。この行の後続のコマンドは、この情報にアクセスできます。
/usr/local/bin/restic backup -q /home/sammy;
はResticバックアップコマンドです。 cron
サービスは/usr/local/bin
でコマンドを自動的に検索しないため、restic
バイナリへのフルパスを使用します。 同様に、~
ショートカットを使用する代わりに、/home/sammy
を使用してホームフォルダーのパスを明示的に記述します。 cron
のコマンドを作成するときは、できるだけ明示的にするのが最善です。 -q
フラグを使用して、Resticからのステータス出力を抑制します。これは、それを読み取ることができないためです。
最後に、/usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7
は、指定された保持フラグに基づいて、不要になった古いスナップショットを削除します。 この例では、24時間ごとのスナップショットと7日ごとのスナップショットを保持しています。 週次、月次、年次、およびタグベースのポリシーのオプションもあります。
必要に応じてコマンドを更新したら、ファイルを保存してテキストエディタを終了します。 crontabがインストールされ、アクティブ化されます。 数時間後、restic snapshots
を再度実行して、新しいスナップショットがアップロードされていることを確認します。
結論
このチュートリアルでは、オブジェクトストレージ認証の詳細を使用してResticの構成ファイルを作成し、Resticを使用してリポジトリを初期化し、いくつかのファイルをバックアップし、バックアップをテストしました。 最後に、cronを使用してプロセスを自動化しました。
Resticには、ここで説明したよりも柔軟性と機能があります。 Resticの詳細については、公式ドキュメントまたはメインWebサイトを参照してください。