片方向同期( lsyncd と rsync )

概要

AWSのスポットインスタンスで開発環境として一時的に使用したコンテンツを、他社VPSにコンテンツを片方向同期したいと思い、備忘録ガテラ調べた内容を記録します。

今回の要件を図で表すと以下の通りとなります。

one-way-synchronization.png

同期先

rsyncインストール

ネットワークを通じて他のコンピュータと通信をおこない、ファイルやディレクトリの転送をおこなうため、 rsync がインストールされていることを確認します。

※標準でインストールされているはず。

[同期先 ~]# rpm -q rsync

rsync-3.1.3-12.el8.x86_64

rsyncユーザ追加および公開鍵認証設定

同期"元"からパスワードなしで同期"先"にログインし、ファイルまたはディレクトリの同期をおこないため、専用ユーザを作成します。

[同期先 ~]# useradd rsync

[同期先 ~]# mkdir /home/rsync/.ssh

[同期先 ~]# ssh-keygen -t rsa -m PEM -f /home/rsync/.ssh/id_rsa

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/rsync/.ssh/id_rsa.
Your public key has been saved in /home/rsync/.ssh/id_rsa.pub.
The key fingerprint is:
・
・[中略]
・

[同期先 ~]# chown -R rsync. /home/rsync/.ssh

[同期先 ~]# chmod 700 /home/rsync/.ssh

[同期先 ~]# mv /home/rsync/.ssh/id_rsa.pub /home/rsync/.ssh/authorized_keys

[同期先 ~]# chmod 600 /home/rsync/.ssh/authorized_keys

[同期先 ~]# cat /home/rsync/.ssh/id_rsa
 ⇒後ほど使用するのでテキストエディタ等にメモしておきます。

sudoers設定

上記で作成した専用ユーザから管理者アカウントでないと権限上問題が発生する場合があるので専用ユーザに対して、管理者へ昇格できるように設定します。

[同期先 ~]# vim /etc/sudoers.d/rsync

Defaults:rsync !requiretty
rsync ALL= NOPASSWD:/usr/bin/rsync

※ requiretty が有効になっている場合、ttyにログインしているセッションからのみ sudo 可能であるので、 cron や cgi-bin などのユーザを介して実行できないようにするものであるから、 rsync ユーザは、 requiretty を無効化する。
https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html

同期元

秘密鍵設置

先ほど、同期"先"サーバで作成した専用ユーザの秘密鍵情報を、設定します。

[同期元 ~]# vim /root/rsync_id_rsa
 ⇒先ほどテキストエディタ等にメモした内容をコピー・アンド・ペーストします。

[同期元 ~]# chmod 600 /root/rsync_id_rsa

lsyncdのインストール

特定ディレクトリを監視し、ファイルやディレクトリの変更・削除・更新等のイベントを検知できるようにするため、 lsyncd のインストールをおこないます。

[同期元 ~]# amazon-linux-extras install epel

[同期元 ~]# yum install lsyncd --enablerepo=epel

・
・[中略]
・
Installed:
  lsyncd.x86_64 0:2.2.2-1.el7

Complete!

同期設定編集

source に同期させたいディレクトリ(同期"元")を指定し、 target には、同期"先"で、今回の場合、バックアップさせたいディレクトリを指定します。

※targetの ***.***.***.*** には同期"先"のIPアドレスを指定します。

[同期元 ~]# cp -p /etc/lsyncd.conf /etc/lsyncd.conf.org
[同期元 ~]# cp -p /etc/lsyncd.conf /etc/lsyncd.conf_$(date +"%Y%m%d")

[同期元 ~]# echo -n > /etc/lsyncd.conf
[同期元 ~]# vim /etc/lsyncd.conf

settings {
   logfile = "/var/log/lsyncd/lsyncd.log",
   statusFile = "/var/log/lsyncd/lsyncd-status.log",
   statusInterval = 20
}

sync {
    default.rsync,
    delay = 0,
    source="/home/dev_user/script",
    target="rsync@***.***.***.***:/root/contents_backup/",
    rsync = {
        archive = true,
        rsync_path = "sudo /usr/bin/rsync",
        rsh = "ssh -p {sshポート番号} -i /root/rsync_id_rsa -o StrictHostKeyChecking=no"
    }
}

lsyncdサービス開始

以下のようにサービスを開始すると同期"元"の /var/log/lsyncd/lsyncd.log/var/log/lsyncd/lsyncd-status.log にログがでますので、期待した通りの動作がおこなえているか確認をおこなうようにしてください。

[同期元 ~]# systemctl --now enable lsyncd

Created symlink from /etc/systemd/system/multi-user.target.wants/lsyncd.service to /usr/lib/systemd/system/lsyncd.service.

[同期元 ~]# systemctl status lsyncd.service

● lsyncd.service - Live Syncing (Mirror) Daemon
   Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-05-22 04:13:55 JST; 1s ago
 Main PID: 5593 (lsyncd)
    Tasks: 3
   Memory: 5.6M
   CGroup: /system.slice/lsyncd.service
           tq5593 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf
           tq5594 /usr/bin/rsync --delete --ignore-errors -gsolptD --rsh=ssh -p {sshポート番号} -i /root/rsync_id_rsa -o StrictHostKeyChecking=no --rsync-path=sudo...
           mq5595 ssh -p {sshポート番号} -i /root/rsync_id_rsa -o StrictHostKeyChecking=no -l rsync ***.***.***.*** sudo /usr/bin/rsync --server -slogDtpre.iLsfxC

May 22 04:13:55 *** systemd[1]: Started Live Syncing (Mirror) Daemon.

まとめ

片方向同期に挑戦してみました。

スポットインスタンスは、すぐに消えてしまう可能性があるので、コンテンツをバックアップ等ができれば安心ですよね。