もともと私のブログに投稿されました:http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
S3バケットをEC2サーバーに定期的に同期する
これは、リモートS3バケットをローカルファイルシステムに同期できるようにする複数のコマンドラインユーティリティを利用することで簡単に実現できます。
s3cmd
最初は、s3cmd
非常に有望に見えました。しかし、私の巨大なS3バケットで試してみたところ、スケーリングに失敗し、エラーが発生しましたSegmentation fault
。ただし、小さなバケットでは問題なく機能しました。巨大なバケツではうまくいかなかったので、私は別の方法を探し始めました。
s4cmd
。の新しいマルチスレッド代替s3cmd
。さらに有望に見えましたが、ローカルファイルシステムにすでに存在するファイルを再ダウンロードし続けていることに気付きました。これは、syncコマンドに期待していたような動作ではありません。リモートファイルがすでにローカルに存在するかどうかをチェックし(ハッシュ/ファイルサイズのチェックは適切です)、同じターゲットディレクトリでの次の同期実行でスキップする必要があります。この奇妙な動作を報告するために、問題(bloomreach / s4cmd /#46)を開きました。その間に、私は別の選択肢を見つけることに着手しました。
awscli
そして私は見つけましたawscli
。これは、S3を含むさまざまなクラウドサービスとやり取りするためのAmazonの公式コマンドラインインターフェースです。
これは、リモートバケットファイルをローカルファイルシステムにすばやく簡単にダウンロードする便利な同期コマンドを提供します。
$ aws s3 sync s3:// your-bucket-name / home / ubuntu / s3 / your-bucket-name /
利点:
- スケーラブル-巨大なS3バケットをサポート
- マルチスレッド-複数のスレッドを利用してファイルをより高速に同期します
- スマート-新しいファイルまたは更新されたファイルのみを同期します
- 高速-マルチスレッドの性質とスマート同期アルゴリズムのおかげで
偶発的な削除
便利なことに、sync
ソース(S3バケット)にファイルがない場合、コマンドは宛先フォルダー(ローカルファイルシステム)内のファイルを削除しません。その逆も同様です。これはS3のバックアップに最適です。ファイルがバケットから削除された場合、ファイルを再同期してもローカルでは削除されません。また、ローカルファイルを削除しても、ソースバケットからは削除されません。
Ubuntu 14.04LTSでawscliを設定する
をインストールすることから始めましょうawscli
。これを行うにはいくつかの方法がありますが、を介してインストールするのが最も簡単であることがわかりましたapt-get
。
$ sudo apt-get install awscli
構成
次に、ユーザーを作成し、AmazonS3ReadOnlyAccessポリシーを添付して、IAMawscli
から取得する必要があるアクセスキーIDとシークレットキーを使用して構成する必要があります。これにより、あなたやこれらの認証情報にアクセスできる人がS3ファイルを削除することもできなくなります。必ず、などのS3リージョンを入力してください。us-east-1
$ aws configure
準備
ローカルのS3バックアップディレクトリを、できればで準備しましょう/home/ubuntu/s3/{BUCKET_NAME}
。必ず{BUCKET_NAME}
実際のバケット名に置き換えてください。
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
初期同期
次のコマンドを使用して、バケットを初めて同期してみましょう。
$ aws s3 sync s3:// {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
バケットが存在し、AWS認証情報とリージョンが正しく、宛先フォルダーが有効であるawscli
と仮定すると、バケット全体のローカルファイルシステムへのダウンロードが開始されます。
バケットのサイズとインターネット接続によっては、数秒から数時間かかる場合があります。それが完了したら、先に進み、バケットのローカルコピーを最新の状態に保つための自動cronジョブを設定します。
cronジョブの設定
先に進み、sync.sh
ファイルを作成します/home/ubuntu/s3
:
$ nano /home/ubuntu/s3/sync.sh
次のコードをコピーして貼り付けますsync.sh
。
#!/ bin / sh
#現在の日付と時刻をエコーする
エコー ' - - - - - - - - - - - - - - -'
日付
エコー ' - - - - - - - - - - - - - - -'
エコー ''
#エコースクリプトの初期化
echo 'リモートS3バケットを同期しています...'
#実際にsyncコマンドを実行します({BUCKET_NAME}をS3バケット名に置き換えます)
/ usr / bin / aws s3 sync s3:// {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
#エコースクリプトの完了
エコー「同期完了」
スクリプト全体で2回、{BUCKET_NAME}をS3バケット名に置き換えてください。
上級者向けのヒント:限られたシェル環境でコマンドを実行し、実行可能ファイルを単独で見つけることができない/usr/bin/aws
ため、aws
バイナリへのリンクに使用する必要crontab
があります。
次に、chmod
スクリプトを確認して、によって実行できるようにしcrontab
ます。
$ sudo chmod + x /home/ubuntu/s3/sync.sh
スクリプトを実行して、実際に機能することを確認してみましょう。
$ /home/ubuntu/s3/sync.sh
出力は次のようになります。
次に、crontab
次のコマンドを実行して、現在のユーザーを編集しましょう。
$ crontab -e
初めて実行するcrontab -e
場合は、優先するエディターを選択する必要があります。nano
初心者にとって最も扱いやすいので、選択することをお勧めします。
同期周波数
crontab
コマンドを作成して、スクリプトを実行する頻度と、スクリプトがローカルファイルシステムのどこにあるかを指定する必要があります。このコマンドの形式は次のとおりです。
mh dom mondowコマンド
次のコマンドcrontab
は、sync.sh
スクリプトを1時間ごとに実行し(minute:0およびhour:*パラメーターで指定)、スクリプトの出力をディレクトリsync.log
内のファイルにパイプするように構成しますs3
。
0 * * * * /home/ubuntu/s3/sync.sh> /home/ubuntu/s3/sync.log
crontab
編集しているファイルの最後にこの行を追加する必要があります。次に、Ctrl + Wを押してからEnterキーを押して、ファイルをディスクに保存します。その後、Ctrl + Xをnano
押して終了できます。これで、同期タスクが1時間ごとに実行されます。crontab
上級者向けのヒント:毎時cronジョブが正常に実行されていることを確認するには、/home/ubuntu/s3/sync.log
その内容を調べて実行日時を確認し、ログを調べて同期された新しいファイルを確認します。
準備完了!これで、S3バケットがEC2サーバーに1時間ごとに自動的に同期されるようになり、準備が整いました。時間の経過とともに、S3バケットが大きくなると、新しいファイルに対応するためにEC2サーバーのEBSボリュームサイズを増やす必要がある場合があることに注意してください。このガイドに従うことで、いつでもEBSボリュームサイズを増やすことができます。