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の効果的な学習方法は「Udemy(ユーデミー)」によるビデオ学習です。

「Udemy」は、オンライン学習の提供サイトです。学びたい人は多くある講座の中から受講したいコースを選択することができ、動画で学べるのが特徴です。

多くあるPythonのコースの中でもオススメするPythonのコースは以下となります!!

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

このコースでは合計で28.5時間のビデオ講座があって、それらを受講するだけで、Pythonの基礎から応用まで学ぶことができます。

私も購入して受講していますが、内容としては初心者の方から上級者まで対応する幅広い内容になっています。

下手な書籍を何冊か購入するより、この動画コースを最初からじっくりと受けることで総合的なスキルを習得することができるできます。おそらくこれ以上の教材はないと思いますので、絶対おすすめです。

ちなみに、Udemyでは頻繁にセール(1か月に2,3回程度)が開催されているので、セールのタイミングで購入すれば90%OFFになる講座もあるため、セールが開催されてからの購入をオススメします!

Dockerのオススメ勉強方法

私がオススメするDockerの効果的な学習方法は「Udemy(ユーデミー)」によるビデオ学習です。

「Udemy」は、オンライン学習の提供サイトです。学びたい人は多くある講座の中から受講したいコースを選択することができ、動画で学べるのが特徴です。

私のDockerに関するオススメコースは以下となります。

Dockerの基本的な使い方から現場で役立つ応用的な使い方まで学習することができ、プログラミングの知識がない人でも,問題なく受講できます。

米国AI開発者がゼロから教えるDocker講座

Udemyでは頻繁にセールが開催されているので、セールのタイミングで購入すれば90%OFFになる講座もあるため、セールが開催されてからの購入をオススメします!

以上

コメント

タイトルとURLをコピーしました