LFTPでサーバ間でファイル転送をする

# ごあいさつ
ひょんなきっかけで6日目を担当することになりましたAkkykgといいます
安請け合いしたものの開発や技術バリバリな<font color="Green">世界</font>でやってきていないので
あまり目を見張るような内容では無いかもしれませんが書いていきたいとおもいます

---
# 今回のお題
ずばり、「**サーバー間でデータコピーをやってみる** 」です

最近の仕事でしばしばあるのが、『あるサーバーにあるコンテンツを別のサーバーに移行（＝コピー）してほしい』というものです。

## どんなときにデータコピーなんてするの？
- ミラーサイトとして同期した状態を保つとき
- サーバーを引っ越すとき
- 同じコンテンツのサーバを複数作成したいとき(ホットスタンバイサーバーなど）  
etc・・・データコピーの場面はたまにあるものです、あるということにさせてください

手法やソフトなど様々考えられるテーマですがこれを今回、サーバー間でやってみます

## 一般的なパターン
1. パソコンにダウンロード用<font color="Green">の</font>スペースを確保
2. 移行前サーバーからパソコンへデータをダウンロード
3. パソコンから新サーバーへデータをアップロード

ここでいくつか問題があります。

- 右から左へ渡すだけなのにパソコンにスペース確保しないといけないとか
- 下りと上りで通信が2回発生して時間とかいろいろ
- パーミッションが継承されないとかされるように気をつけないといけないとか

無駄が多いように感じますよね

ということで、今回はサーバー間でデータの転送をしたいと思います
(とはいえパソコン不要、というわけではありませんけど）

## 今回の方法

今回はデータ転送時にパソコンを通さずサーバー間で転送したいと思います
また、環境によっては**rsyncで転送しちゃうぜ**、というのもありますが今回は、sshもroot権限も使わずあくまでもFTPによる転送をしたいと思います

## 前提
現行サーバでのプログラム利用可否

| プログラム | 利用可否 |
|:-:|:-:|
| ssh  | 利用不可  |
| rsync  | 当然不可  |
| sftp  | 当然不可  |
| lftp  | 利用可  |

つまり[Zenlogic](https://zenlogic.jp/ "zenlogic")のご利用者が実行可能な範囲を想定しています

---
# LFTPを採用する
今回はFTPの中で<font color="Green">も、も</font>っと利用が増えてほしいLFTPを採用してみます

## LFTPとは
LFTPは、UNIXおよびUnix系システム向けのコマンド行ファイル転送プログラム（FTPクライアント）の1つ。Alexander V. Lukyanov が開発し、・・・[続きはWikipediaで](https://ja.wikipedia.org/wiki/Lftp "LFTP")

## なんでLFTP？
- ミラー転送ができるので途中で何らかの問題で中断しても再実施時に無駄が少ない
- ミラーサイトのようにコンテンツを定期的に同じ状態に保つ用途にも利用可

---
# データの移行をやってみよう
注意）今回は説明の簡略化の為、同じレンサバ、同じリージョンであると想定し、
サーバ間のデータ転送は外部からは<font color="Green">クロ</font>ーズドな状態で行えるものとさせてください
そのため、セキュアな通信についてを排除して説明します

| サーバー | 対象となるディレクトリ |
|:-:|:-:|
| サーバーA(移行元)  | /virtual/htdocs/source_dir  |
| サーバーB(移行先)  | /virtual/htdocs/target_dir  |

## 実施の流れ
### サーバーAにFTPユーザー作成
この後の手順で作成するいくつかのファイルをサーバーAに設置するのに利用します
こちらは特に手順に影響ありませんので<font color="Green">何</font>でも構いません

### サーバーBにFTPユーザー作成
こんな感じで作成します（以降の説明時のサンプルで使用するので表で記載しておきます）

|  | 設定値 |
|:-:|:-:|
| FTPユーザー  | FTP_USER  |
| FTPユーザーのホームディレクトリ  | /virtual/  |
| FTPパスワード  | FTP_PASSWORD  |

### FTP接続用datファイルの作成
今回はsshを使用した対話式での実行ではありませんので、FTP接続に利用する情報を
datファイルとして作成し、外部から参照できない場所へ設置し読み込ませて転送を行います
ファイル名は「lftp.dat」としました

このファイルをパソコンからサーバーAにFTPでアップロードしてください
今回は、/virtual/cgi-data/というパスに設置したことを想定しています

```lftp.dat
open -u FTP_USER,FTP_PASSWORD {サーバーBのIPかホスト名}
mirror -R --delete --verbose=3 --log=/virtual/cgi-data/lftp.log /virtual/htdocs/source_dir htdocs/target_dir
echo end
close
quit
```
簡単な説明

- サーバーBにFTP接続をかけてます
- LFTPではmirrorというコマンドが利用できますのでこれを使います
- 今回は--deleteオプションを付けて同期転送するように記載しています
- ログファイルの出力先を移行元サーバの所定のパスで指定しています

そして注意すべきは転送元、転送先のディレクトリ指定です
サーバーBへはあくまでもFTPユーザで接続しているので、FTPユーザーのホームディレクトリの設定が影響します
ホームディレクトリが「/virtual」なので、ターゲットとなるdirの指定としては「/htdocs/targt_dir」となるわけです

今回は使ってませんが、「--only-newer」を指定することで、移行元のファイルが移行先より新しいもの（＝更新あったもの）のみコピーなんてことができます

### LFTP実行用phpスクリプト
サー<font color="Green">バー</font>AのドキュメントルートにFTPでアップロードします

```php:kick_transfer.php
<?
    $str = shell_exec('/usr/bin/lftp -f /virtual/cgi-data/lftp.dat');
    echo "<pre>$str</pre>";
?>
```
簡単な説明
- 先ほど作成したlftp.datの情報を-fオプションで食わせて実行しています
- 実行した結果をブラウザに出すようにしていますがあまりに膨大な場合は必須の内容ではありません

### LFTP実行用phpスクリプトの実行
パソコンから、ブラウザで先ほどのスクリプトを実行します
実行が終わればFTPでサーバーAから削除することをおすすめします

### cronから実行させたい場合
「**パソコンからやっぱり人間が実行させるのか、つきっきりかよ**」という方は
cronに登録するという方法もあります
特に定期的に実行したい場合等はcron一択でしょう

```bash:lftp.sh
/usr/bin/lftp -f /virtual/cgi-data/lftp.dat
```

注意点(Zenlogicの場合)

- 改行コードはLFに設定すること
- パーミッションを0755にすること
- ドキュメントルート以下に設置する必要はありません
- ログファイルを日単位に残したいなどの場合はdatファイルに少し細工が必要です

あとは設定画面(Zenlogicではコントロールパネル）のcron設定にて、上記のファイルを
実行する設定をしてください（例:<font color="Green">1</font>回限り、定時実行、などなど）

## 実行結果の確認
実行結果は/virtual/cgi-data/lftp.logに出力されますので確認します
※ 定時実行の場合はログファイルを日単位で取得するような記述が必要です

## サーバーAのファイル構造
上で記載したサンプルファイルは、以下のように設置を想定しています

~~~
/virtual
│
├ cgi-data/
│ │
│ ├ lftp.dat(LFTPスクリプト)
│ ├ lftp.log(実行後のログ)
│ └ (lftp.sh(cron実行する場合のみ))
│
└ htdocs/
   │
   └ default/(ドキュメントルート想定）
       │
       └ kick_transfer.php
~~~

---
# さいごに
ということで今回は移行元、移行先ともにZenlogicであることを想定して、LFTPによるサーバー間のデータ転送を取り上げました

異なるレンサバのサーバへ転送する場合等ではセキュアな通信方式を考慮すべきで、
LFTPでもSFTPやFTPS等が可能ですが今回は説明簡略化の為にばっさり省きました

最近ではセキュアが叫ばれている状況につき、要不要に関係なくセキュアを意識した記事にしようかとも思いましたが、今回は「LFTPによるサーバー間のファイル転送」にポイントを絞って書かせていただきました