以前の記事でDockerでGitlabを構築しました。今回は定期的にバックアップを取ってAWSのS3へ保管するようにしたいと思います。
バックアップ方法の検討
通常のOS上にインストールしたGitlabの構成であればgitlabに付属している gitlab-rake コマンドを使ってバックアップを取ることができます。例えば以下の様なコマンドです。
gitlab-rake gitlab:backup:create
ただし、今回はDockerで構築しているのでコンテナを構成するdocker-compose.yamlとコンテナのデータを保存しているフォルダを丸ごとバックアップします。
場所を確認してみます。私の場合には「/root/docker/gitlab」フォルダが該当します。
[root@gitlab docker]# cd /root/docker/gitlab/
[root@gitlab gitlab]# ll
合計 4
-rw-r--r-- 1 root root 454 7月 21 2020 docker-compose.yml
drwxr-xr-x 5 root root 44 7月 21 2020 gitlab
念のためdocker-compose.ymlで設定しているデータ保存の場所を確認します。
volumeの部分を確認すると、バックアップに必要なGitlabの設定フォルダ(/etc/gitlab)とデータ(/var/opt/gitlab)を「/root/docker/gitlab/gitlab」へ保管していることが分かります。
[root@gitlab gitlab]# cat docker-compose.yml
version: '3'
services:
gitLab:
image: gitlab/gitlab-ce:latest
restart: always
hostname: 'gitlab'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.syachiku.local'
gitlab_rails['gitlab_shell_ssh_port'] = 4022
ports:
- "80:80"
- "443:443"
- "4022:22"
volumes:
- './gitlab/config:/etc/gitlab'
- './gitlab/logs:/var/log/gitlab'
- './gitlab/data:/var/opt/gitlab'
Dockerコンテナのバックアップ取得
では実際にバックアップとってみます。普通にtarコマンドで取得します。日付のところとかは適当に変更して下さい。
[root@gitlab docker]# cd /root/docker/gitlab/
[root@gitlab docker]# tar cvzf gitlab-bk20210306.tar.gz gitlab/
リストアのテスト
次に一番重要な実際にリストアできるか確認してみます。
現状は以下の様な感じでコンテナが動いてます。このままコンテナをリストアしようとするポートがぶつかってしまう、いったん現在稼働しているコンテナを停止します。
[root@gitlab gitlab]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1a57bbc8825 gitlab/gitlab-ce:latest "/assets/wrapper" 17 minutes ago Up 14 minutes (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4022->22/tcp gitlab_gitLab_1
[root@gitlab gitlab]# cd /root/docker/gitlab
[root@gitlab gitlab]# docker-compose down
ではリストアのテストに移ります。先ほどのバックアップファイルを適当なフォルダ(/tmpとか)にコピーしてから、展開します。
[root@gitlab docker]# cp gitlab-bk20210306.tar.gz /tmp/
[root@gitlab docker]# cd /tmp/
[root@gitlab tmp]# ls
gitlab-bk20210306.tar.gz
[root@gitlab tmp]# tar xvzf gitlab-bk20210306.tar.gz
そうしたら分かりやすいようにコンテナ名称だけgitlab-restoreとかに変更して起動します。
version: '3'
services:
gitLab-restore:
image: gitlab/gitlab-ce:latest
・・・
[root@gitlab docker]# cd /tmp/gitlab
[root@gitlab gitlab]# docker-compose up -d
[root@gitlab gitlab]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b2c3bd7ad5d gitlab/gitlab-ce:latest "/assets/wrapper" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:8022->22/tcp, 0.0.0.0:8081->80/tcp, 0.0.0.0:8443->443/tcp gitlab_gitLab-restore_1
しばらく待ってからアクセスするとGitlabにアクセスできました。これでリストアは大丈夫そうです。
AWS側の準備
リストアの確認もとれたので、バックアップをS3へ保管するように設定したいと思います。
AWSのアカウント取得などは省略させていただきます。
バックアップ用S3バケット + IAM Role+ Policyの作成
こちらは手動で行ってもよいですが、ちょうど試すのによさそうだったのでAWS CDKで試してみました。以下の記事を参考にしてください。
AWS CLIインストール
S3へバックアップするためにAWS CLIを使います。
Gitlabコンテナが稼働しているCentOSにAWS CLIをインストールします。
[root@gitlab gitlab]# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
[root@gitlab gitlab]# unzip awscliv2.zip
[root@gitlab gitlab]# sudo ./aws/install
// 確認
[root@gitlab gitlab]# /usr/local/bin/aws --version
aws-cli/2.1.29 Python/3.8.8 Linux/3.10.0-1127.13.1.el7.x86_64 exe/x86_64.centos.7 prompt/off
AWS Configureでユーザ設定
事前に「バックアップ用S3バケット + IAM Role+ Policyの作成」で作成したIAMユーザでAccessKeyとSecretKeyを取得しておいてください。
aws configureでそれらのKeyを設定します。DefaultRegionは[ap-northeast-1]で、Default output format [json]としてください。
[root@gitlab gitlab]# aws configure
AWS Access Key ID [****************XX3A]:
AWS Secret Access Key [****************aJWK]:
Default region name [ap-northeast-1]:
Default output format [json]:
手動でS3バケットへアップする
まずは手動でaws CLIをS3へアップできるか確認してます。アップすることが確認できたらバックアップスクリプトを作成します。
[root@gitlab docker]# aws s3 cp gitlab-bk20210306.tar.gz s3://syachiku-gitlab-bk
upload: ./gitlab-bk20210306.tar.gz to s3://syachiku-gitlab-bk/gitlab-bk20210306.tar.gz
バックアップスクリプトの準備
シェルでスクリプトを作成します。以下の様な感じで作成しました。
・バックアップ対象:/roor/docker/gitlab/*
・バックアップ取得フォルダ:/var/backup/gitlab-bk
・バックアップファイル名:gitlab-bk-YYYYMMDD.tar.gz
・バックアップ先S3:s3://syachiku-gitlab-bk
合わせて、7日前のファイルがあったら削除するようにします。スクリプトはこんな感じです。
[root@gitlab gitlab-bk]# vi /root/tools/gitlab-backup.sh
#!/bin/bash -x
DATE=`/bin/date +"%Y%m%d"`
DELETE_DATE=`/bin/date '+%Y%m%d' --date '7 days ago'`
BACKUP_DIR=/var/backup/gitlab-bk
BACKUP_FILENAME="${BACKUP_DIR}/gitlab-bk-${DATE}.tar.gz"
BACKUP_DELETE_FILENAME="${BACKUP_DIR}/gitlab-bk-${DELETE_DATE}.tar.gz"
BACKUP_S3BUCKET="s3://syachiku-gitlab-bk"
cd /root/docker/ ; tar -cvzf ${BACKUP_FILENAME} ./gitlab/* > /dev/null 2>&1
if [ -f ${BACKUP_DELETE_FILENAME} ]; then
rm -rf ${BACKUP_DELETE_FILENAME}
echo "ファイルが存在します"
fi
/usr/local/bin/aws s3 cp ${BACKUP_FILENAME} ${BACKUP_S3BUCKET} > /dev/null 2>&1
スクリプトが正常であればバックアップファイルがS3にバックアップされていると思います。
スクリプトを実行してS3にされていることが確認できたらCron設定します。
Cron設定
[root@gitlab tools]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 23 * * * root /usr/bin/sh /root/tools/gitlab-backup.sh > /dev/null 2>&1
これで23時にバックアップが取得される設定ができました。
まとめ
今回はAWS CDKも使ってリソースを作成しましたが、手動で設定しても問題ありません。
やはりバックアップ先としてはS3は非常に手軽に使うこともでき便利ですね。
皆様の参考になれば幸いです。
Pythonのオススメ勉強方法
私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全」です。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。
内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
Dockerのオススメ勉強方法
私がオススメするDocker初心者向けの最初に購入すべき書籍は「さわって学ぶクラウドインフラ docker基礎からのコンテナ構築」です。
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築
本書ではDockerの基本的な概念などの座学ももちろんありますが、実際に、Dockerのインストール方法やWebサーバーをコンテナで構築するハンズオンを通じて学習することができるため、特に初心者の方はは分かりやすい内容となっています。
以上
コメント