AWSDockerGitIaCLinuxPython

Dockerで構築したGitlabのバックアップをS3に保管する

AWS

以前の記事で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サーバーをコンテナで構築するハンズオンを通じて学習することができるため、特に初心者の方はは分かりやすい内容となっています。

以上

コメント