Restic Backup Clientを使用してオブジェクトストレージサービスにデータをバックアップする方法

前書き

Resticは、Go言語で記述された安全で効率的なバックアップクライアントです。 ローカルディレクトリ、SFTPサーバー、S3互換オブジェクトストレージサービスなど、さまざまなバックエンドリポジトリにローカルファイルをバックアップできます。

このチュートリアルでは、Resticをインストールし、オブジェクトストレージサービスのリポジトリを初期化します。 次に、いくつかのファイルをリポジトリにバックアップします。 最後に、バックアップを自動化して、1時間ごとのスナップショットを作成し、必要に応じて古いスナップショットを自動的に削除します。

前提条件

このチュートリアルでは、バックアップするファイルがいくつかあるUNIXベースのコンピューターが必要です。 ResticはMac、Linux、Windowsで使用できますが、このチュートリアルで使用するコマンドとテクニックはMacOSとLinuxでのみ機能します。

Resticを実行するには十分な量のメモリが必要なので、エラーが発生しないように1 GB以上のRAMが必要です。

また、オブジェクトストレージサービスに関する次の詳細を知る必要があります。

  • アクセスキー

  • 秘密鍵

  • サーバーURL

  • バケット名

DigitalOcean Spacesオブジェクトストレージサービスを使用している場合は、チュートリアルHow to Create a DigitalOcean Space and API Keyに従って、スペースを設定し、上記のすべての情報を取得できます。

オブジェクトストレージ情報を入手したら、次のセクションに進んでResticソフトウェアをインストールします。

Restic Backup Clientのインストール

Resticは、多くのプラットフォームでプリコンパイルされた実行可能ファイルとして利用できます。 つまり、1つのファイルをダウンロードして実行できます。パッケージマネージャーや依存関係は必要ありません。

ダウンロードする適切なファイルを見つけるには、まずWebブラウザーを使用してRestic’s release page on GitHubに移動します。 Downloadsヘッダーの下にファイルのリストがあります。

64ビットLinuxシステム(最も一般的なサーバー環境)の場合、ファイルの末尾を_linux_amd64.bz2にする必要があります。

MacOSの場合、_darwin_amd64.bz2のファイルを探します。

システムに適したファイルを右クリックし、Copy Link Addressを選択します(ブラウザでは表現が少し異なる場合があります)。 これにより、ダウンロードURLがクリップボードにコピーされます。

次に、バックアップするコンピューターのターミナルセッションで(リモートマシンの場合は、最初にSSH経由でログインする必要がある場合があります)、ホームディレクトリにいることを確認してから、curlを使用してファイルをダウンロードします。 s:

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は、バックアップできるリポジトリを初期化するために、アクセスキー、秘密キー、オブジェクトストレージ接続の詳細、およびリポジトリパスワードを知っている必要があります。 environment variablesを使用して、この情報を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を出力します(上に強調表示)。

[.note]#Note:別のディレクトリをバックアップする場合は、上記の~をディレクトリのパスに置き換えてください。 ターゲットディレクトリがユーザーによって所有されていない場合は、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はリストに含まれています。 リポジトリのパスワードを各マシンにコピーする必要があります。 リポジトリに複数のパスワードを設定して、よりきめ細かいアクセス制御を行うこともできます。 リポジトリパスワードの管理の詳細については、the official Restic docsを参照してください。

スナップショットがアップロードされ、リポジトリのコンテンツを一覧表示する方法がわかったので、スナップショットIDを使用してバックアップの復元をテストします。

スナップショットの復元

スナップショット全体を一時ディレクトリに復元して、すべてが正常に機能していることを確認します。 前のステップのリストのスナップショットIDを使用します。 復元されたファイルを/tmp/restoreの新しいディレクトリに送信します。

restic restore 427696a3 --target /tmp/restore
Outputrestoring  to /tmp/restore

ディレクトリに移動して、その内容をリストします。

cd /tmp/restore
ls

バックアップしたディレクトリが表示されます。 この例では、ユーザーsammyのホームディレクトリになります。 復元されたディレクトリを入力し、内部のファイルをリストします。

cd sammy
ls
Outputfacts.txt  restic_0.7.3_linux_amd64

facts.txtファイルが、チュートリアルの最初に抽出したresticバイナリとともにそこにあります。 facts.txtを画面に出力して、期待どおりであることを確認します。

cat facts.txt

前にファイルに入れたサメの事実を見るはずです。 出来た!

[.note]#Note:スナップショット内のすべてのファイルを復元したくない場合は、--includeおよび--excludeオプションを使用して選択を微調整できます。 詳細については、the Restore section of the Restic documentationをお読みください。

バックアップと復元が機能していることがわかったので、新しいスナップショットの作成を自動化しましょう。

バックアップの自動化

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がタスクを実行するタイミングを定義します。 この場合、すべてのhourdaymonth、およびday of weekの42番目のminuteで実行されます。 この構文の詳細については、チュートリアルHow To Use Cron To Automate Tasksを参照してください。

次に、. /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の詳細については、official documentationまたはmain websiteを参照してください。

Related