Posted at

Docker で Amazon S3 に定期的に差分バックアップをとる

Docker Volume やディレクトリを Amazon S3 に定期的に差分バックアップをとるための hoto17296/backup-s3 という Docker Image を作ったので、その紹介。


やりたいこと

Docker で運用しているサーバに関するデータを Docker Volume に保存しているとして、その中身を定期的にバックアップをとりたい。1

バックアップを保存する場所としては Amazon S3 が無難で、Amazon S3 にバックアップをとるときによく使われるツールとして AWS CLI の S3 Sync がある。

sync — AWS CLI Command Reference

S3 Sync には様々なオプションがあってバックアップの方法を柔軟に指定できるのだけど、それは他の記事を見てもらえればいいとして、問題は「定期的に」バックアップする部分にある。

AWS CLI とそれを動かすための Python を入れて、バックアップ対象の Volume を Amazon S3 に Sync するシェルスクリプトを書いて、あとはそれを cron で定期実行するように設定して・・・で出来るかと思いきや OS ごとに cron の癖があってハマるのでググりながら修正して・・・と、思ったよりも面倒だったりする。

ていうか Docker が入ってるなら Docker で解決すれば良さそう。


作ったもの

hoto17296/backup-s3

Docker コンテナの中で crond と AWS CLI が動くので、ホスト OS に Python を入れる必要がないし OS ごとの cron の挙動の違いを意識する必要もない。いくつか必要な設定をしてコンテナを起動するだけでいい。

使い方は簡単で、


  • いくつか環境変数を指定する



    • SCHEDULE バックアップをとるスケジュールを crontab フォーマットで指定する


    • S3_URL バックアップ先の S3 バケットを指定する


    • AWS_* コンテナ内から S3 バケットにアクセスするための認証情報を指定する




  • /src にバックアップ対象のディレクトリもしくは Docker Volume をマウントする

これだけ設定して、コンテナを起動する。

その他にも、タイムゾーンを指定できたり、S3 Sync のオプション (--delete とか) を追加できたり、除外設定 --exclude をまとめて設定できたり、いくつかのオプションがある。詳しくは README を参照。


Docker Compose の例

Jupyter Notebook を Docker で動かしており、その Notebook を notebooks という Docker Volume に保存している場合の例。


docker-compose.yml

version: '3'

services:

backup-s3:
image: hoto17296/backup-s3
environment:
TZ: Asia/Tokyo
SCHEDULE: '0 21 * * *'
AWS_ACCESS_KEY_ID: XXXXXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
S3_URL: s3://backup/notebooks
SYNC_OPTIONS: --delete
EXCLUDE_FILES: '*.git/*, *.ipynb_checkpoints/*'
volumes:
- notebooks:/src


上記の指定をすると、 notebooks Volume の中身を日本時間 21 時に s3://backup/notebooks にバックアップをとってくれる。

追加で --delete オプションも指定しているので、削除されたファイルは自動的に S3 バケットからも削除される。


参考





  1. ちゃんとした Web サービスなどを運用するなら、そもそも「状態」は外部 DB に切り出せという話はある