こんにちは、櫻井です。
今回はlsyncdを使って、2台のEC2間のファイルを双方向で同期させる方法について紹介します。
lsyncdを使うことで、ウェブアプリケーションの添付ファイルなど、EC2間で差異が生まれてほしくないものをリアルタイムに同期させることができます。
よって、EFSなどのNFS(ネットワークファイルシステム)を使わずに、ロードバランサーを利用したウェブアプリケーションの実装を低コストで実装することが可能になります。
また、lsyncdを使った双方向同期を行う際は注意点があります。本番利用を検討する際は、後述の「lsyncdを使った双方向同期の注意点」を確認の上でお願いします。
lsyncdとは
lsyncdとは、同期したい対象のディレクトリに対して、ファイルの「新規作成」「編集」「削除」が加えられた事を検出し、別ディレクトリや他のサーバのディレクトリに対して同期を行うことができるツールです。
同期はファイル単位で行われるため、データベースなどの複製用途には向きません。
lsyncdを使った双方向同期の注意点
lsyncdで双方向の同期をさせる際は注意点があり、設定を間違えるとデータの損失を招く可能性があります。
本番環境で利用する場合は細心の注意を払う必要がありますので、詳しくは以下のリンクを参照してください。
lsyncdで双方向同期するなら、delete=’running’ がいい
双方向同期の手順
双方向同期では、EC22台での作業が必要になります。
1台目の作業をEC2(A)の作業、2台目の作業をEC2(B)とし、以下に記述しています。
双方向同期をするためには、まずEC2(A)からEC2(B)に対して片方向の同期を行い、その後EC2(B)からEC2(A)に対して片方向の同期を行うことで実現することが出来ます。
EC2(A)の作業
まずはEC2(A)にログインし、EC2(A)からEC2(B)に対しての片方向の同期の準備を行います。
OSはAmazon Linux2を利用しており、サーバに対してsshを使い、”ec2-user”でログインをしているという前提で進めます。
ログインユーザが”ec2-user”でない場合、”ec2-user”を任意のユーザに読み替えてください。
同期したいディレクトリをテスト用に作成し、権限ユーザを”ec2-user”に変更する
mkdir のオプション -p(—parents) は、必要に応じて親ディレクトリも作成するというオプションです。
1 2 |
$mkdir -p /var/www/html/test $chown ec2-user:ec2-user /var/www/html/test/ |
公開鍵を作成する
以下のコマンドを実行すると、対話形式で作成が行われます。こちらは、EC2(B)にファイルを同期させるために必要です。
1 2 3 4 5 6 7 8 9 10 11 |
$ssh-keygen Generating public/private rsa key pair. # keyの配置場所を問われています。/ec2-user/.ssh/id_rsaでいいので、何も入力せずにEnterキーを押下します。 Enter file in which to save the key (/ec2-user/.ssh/id_rsa): # パスワードを設定します。今回はパスワードを設定しないので、何も入力せずにEnterキーを押下します。 Enter passphrase (empty for no passphrase): # 再度同じパスワードを入力します。先程何も入力せずにEnterキーを押下したのでこちらも何も入力せずにEnterキーを押下します。 Enter same passphrase again: |
lsyncdをインストールする
epelをインストールしていない方は先に以下のコマンドを実行してインストールしてください。
1 |
$sudo amazon-linux-extras install epel |
以下のコマンドを実行してlsyncdのインストールを行います。
1 |
$sudo yum install -y lsyncd |
lsyncd.confの設定をする
lsyncdを使って双方向同期をする場合は、予期せぬデータの損失を防ぐため、前述の「lsyncdを使った双方向同期の注意点」に記載の記事を読んでから設定することをおすすめします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$vi /etc/lsyncd.conf # 以下を記載する settings{ # logfileの保存場所 logfile = "/var/log/lsyncd.log", # 最新の処理結果の保存場所 statusFile = "/tmp/lsyncd.stat", # ステータスの更新頻度 statusInterval = 1, # 同期先との接続に失敗しても再接続を試み続ける insist = 1, } sync{ default.rsync, # 同期させたいディレクトリのパス source = "/var/www/html/test/", # 同期先(EC2(B))のディレクトリのパス target = "ec2-user@{プライベードIP}:/var/www/html/test/", # スタートアップ時の削除を抑制 delete = "running", init = false, rsync = { archive = true, rsh = "/usr/bin/ssh -i {作成した秘密鍵(id_rsa)のパス} -o StrictHostKeyChecking=no" } } |
lsyncdの再起動・自動起動設定をする
lsyncd.confの編集を反映させるために再起動します。ついでに自動起動設定もしておきます。
1 2 |
$sudo systemctl restart lsyncd $sudo systemctl enable lsyncd |
EC2(A)で作成した公開鍵を控える
最初に作成した公開鍵をEC2(B)に配置する必要があるので、下記のコマンドを実行するとターミナルに出力される、”ssh-rsa”から始まる文字列を控えておいてください。
1 2 3 |
$cat /home/ec2-user/.ssh/id_rsa.pub #以下のように出力された文字列を控えておく ssh-rsa AAAAB******************************... |
これで、一旦EC2(A)の作業は終了です。
EC2(B)の作業
ここからはEC2(B)での作業になります。
同期先のディレクトリを作成する
EC2(A)の lsyncd.conf でtarget に設定したディレクトリがない場合は作成し、権限ユーザを”ec2-user”に変更します
1 2 |
$mkdir -p /var/www/html/test $chown ec2-user:ec2-user /var/www/html/test/ |
EC2(A)で控えた公開鍵の文字列を貼り付ける
先程控えたEC2(A)の公開鍵をEC2(B)の .ssh/authorized_keys に貼り付けてください。
1 2 3 4 |
$ vim .ssh/authorized_keys #開いたファイルに控えた文字列を貼り付ける ssh-rsa AAAAB*******************************... |
以上でEC2(A)からEC2(B)に対する、片方向の同期は完了しました。
実際に同期されるかのテストをしてみます。
片方向の同期を確認する
テスト用のファイルを作成する
EC2(A)にログインし、以下のコマンドを実行して、テストのためのファイルを作成します。
1 |
touch /var/www/html/test/sync.txt |
同期を確認する
再度EC2(B)にログインし、/var/www/html/test に sync.txt が作成されていれば成功です。
1 |
ll /var/www/html/test |
これで、片方向の同期が確認できました。
双方向同期させる
上記の手順が完了している場合、EC2(A)からEC2(B)に対しての片方向の同期はできているので、次はEC2(B)からEC2(A)に対しての片方向の同期を行うことで双方向同期ができるようになります。
上記手順を参考に以下のように進めることで、EC2(B)からEC2(A)に対して片方向の同期を行うことが出来ます。
- EC2(B)にログインする
- 公開鍵を作成する
- lsyncdをインストールする
- lsyncd.confを設定する
- lsyncdの再起動・自動起動設定をする
- EC2(B)で作成した公開鍵を控える
- EC2(B)からログアウトし、EC2(A)にログインする
- EC2(A)で控えた公開鍵の文字列を貼り付ける
これでEC2(A)からEC2(B)に対しての片方向の同期と、EC2(B)からEC2(A)に対しての片方向同期も完了しました。
EC2(A)・ EC2(B)のどちらでファイルの「作成」「変更」「削除」を行ったとしても、対になるEC2に同期されていることが確認できると思います。
まとめ
今回は、lsyncdを使ったファイルの双方向同期について紹介しました。
本文中にも書いていますが、設定を間違えるとデータの損失を伴う可能性があります。lsyncdを本番環境で利用する際には、「lsyncdを使った双方向同期の注意点」に記載の記事を読み、特性を理解した上でご利用ください。
一緒に働く仲間を募集中!
ギークフィードではAWSエンジニアを募集しています。
興味がある方はこちらからエントリーをしてぜひ一緒に働きましょう!
- 特定の時間あたりのlambda実行数をSlackに通知する - 2023-12-23
- 公衆電話からでも使える電話帳サービスをLEX + AmazonConnectで作ってみた - 2023-12-19
- SQSを使ってlambdaを10秒ごとに定期実行する - 2023-12-14
- Slack と AWS の電話番号登録アプリ – Bolt + CDK ソースコード解説 - 2023-03-26
- SlackとAWSを組み合わせた電話番号登録アプリの開発 – Boltフレームワーク+CDKで作ってみた - 2023-03-26