s_tajima:TechBlog

渋谷で働くインフラエンジニアのTechブログです。

resticによるカジュアルなバックアップ環境の構築

前置き

僕がインフラを管理している環境では、その規模の大小は様々ですが14個のJenkinsが稼働しています。
それぞれのJenkinsでは、thinBackupによるバックアップが動いているので、障害時にも復旧ができる...はずでした。

現状の設定を確認してみると、

  • thinBackupによるバックアップが正しく動いている: 4環境
  • thinBackupは動いているが、正しく設定されていない(保持世代数が設定されていない等): 2環境
  • thinBackupの設定がされていない: 8環境

という状態でした。

運用の整理されていない状態で利用するチームが増えたため、
適切に設定の自動化がされておらず、手作業によるバックアップの設定をするのが常態化してしまっていたのが原因です。
このような状態は、全く認識してなかったわけではなく、 いわゆる "Elephant in the room." となっていたのですが、
今回はこの問題に着手したお話です。

適切な手段の検討

Jenkinsの環境構築自体(RPMのインストール, データディレクトリの作成等)は、Puppetによるプロビジョニングができるようになっています。
バックアップの自動設定を実現する上でまず考えられるのは、
このPuppetによるプロビジョニングに プラグインのインストール プラグインの設定 を含めてしまうという方法です。
しかし、以下のような観点からこの方法をとるのはやめました。

  • 現在稼働しているJenkinsのバージョンが多岐に渡る
    • 全環境で(それは現時点だけでなく新しいバージョンのJenkinsが導入された時にも)問題なく動くthinBackupのバージョン/設定を選定するのはなかなか大変そうです。
    • JenkinsのバージョンごとにthinBackupの設定を作るのもよいですが、それはそれで管理が大変なのであまり好ましくありません。
  • 実はthinBackupだけではバックアップとして不完全である。
    • thinBackup導入時は、Jenkinsが稼働しているのはAWS環境のみでした。
    • AWS環境は、thinBackupの他に日次でEBSのスナップショットを自動取得する構成になってるため、これらを合わせて十分なバックアップとなっているという想定でした。
    • しかし現状、Jenkinsはオンプレミス環境でも稼働しています。オンプレミス環境では、thinBackupのバックアップを、別ホスト等に移しておく必要があります。

ということで、なにかよさそうな別の方法を検討することにしたのですが、一旦やりたいことを整理してみました。

  • Jenkinsにおいてデータ破損等のトラブルが発生した時、その設定/プラグイン/ビルドの履歴等が復元できる状態にしておく必要がある。
  • バックアップデータは、Jenkins稼働ホストに置いておくだけではなく、ある程度信用のできる外部ストレージに転送する必要がある。
  • それなりにデータサイズの大きいJenkinsにも対応できるように、毎回フルバックアップするのではなく、差分バックアップができるとよい。
  • Jenkinsの設定には機微な情報が含まれるケースもあるので、適切な方法で暗号化できる手段があるとよい。
  • 復元のタイミングは任意である必要はなく、「前日のXX時」程度のレベルでよい。
  • いわゆるバックアップの一貫性もそこまで強く求められるものではない。
  • バックアップの自動設定をしたいので、Puppetによるプロビジョニングがしやすい構成になるとよい。

イメージとしてはあるバイナリ1つと設定ファイル1つ程度で、

#バックアップ
$JENKINS_HOMEをtarで固めて -> (必要であれば)適切な方法で圧縮/暗号化して -> S3に転送

#リストア
S3からファイルを取得 -> (必要であれば)圧縮/暗号化を解除 -> $JENKINS_HOMEに展開

くらいのことができると良さそうだなという印象です。

resticによるバックアップ

前述したような要件を持つだけのプログラムであれば、自作しても大した手間ではないのですが、
おそらく世の中には同じような要件はいくらでもあるだろうということで探してみたところこんなものがありました。

https://github.com/restic/restic

  • Golang製のバックアップツール (≒ビルドしたバイナリをpuppetで配るだけでよい。)
  • バックアップをS3に転送することができる
  • 差分バックアップに対応
  • バックアップの暗号化に対応

あたりが選定の要因です。

使い方のイメージはドキュメントを読んでもらうと良いと思います。
https://restic.readthedocs.org/en/v0.1.0-doc/Manual/#buildinginstalling-restic

restic init, restic backupを実行するための、簡単なシェルスクリプトを作成し、
定期的に実行することで、Jenkinsのカジュアルなバックアップを実現しました。