私のブログに最初に投稿されたもの: 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
た。これは、Amazon のさまざまなクラウド サービス (S3 を含む) と対話するための、Amazon の公式コマンド ライン インターフェイスです。
リモートバケットファイルをローカルファイルシステムにすばやく簡単にダウンロードする便利な同期コマンドを提供します。
$ aws s3 sync s3://your-bucket-name /home/ubuntu/s3/your-bucket-name/
利点:
- スケーラブル - 巨大な S3 バケットをサポート
- マルチスレッド - 複数のスレッドを利用してファイルをより高速に同期します
- スマート - 新しいファイルまたは更新されたファイルのみを同期します
- 高速 - マルチスレッドの性質とスマートな同期アルゴリズムのおかげ
誤って削除
便利なことにsync
、ソース (S3 バケット) にファイルがない場合、コマンドは宛先フォルダー (ローカル ファイルシステム) のファイルを削除しません。これは、S3 のバックアップに最適です。ファイルがバケットから削除された場合、ファイルを再同期してもローカルでは削除されません。また、ローカル ファイルを削除しても、ソース バケットからは削除されません。
Ubuntu 14.04 LTS での awscli のセットアップ
をインストールすることから始めましょうawscli
。これを行うにはいくつかの方法がありますが、apt-get
.
$ sudo apt-get install awscli
構成
次に、ユーザーを作成してAmazonS3ReadOnlyAccessポリシーをアタッチすることにより、 IAMawscli
から取得する必要があるアクセス キー ID とシークレット キーを使用して構成する必要があります。これにより、これらの認証情報にアクセスできるユーザーが S3 ファイルを削除することも防止できます。などの S3 リージョンを入力してください。us-east-1
$ aws構成
準備
できればローカルの 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
。
#!/ビン/sh
# 現在の日付と時刻をエコーする
エコー ' - - - - - - - - - - - - - - -'
日にち
エコー ' - - - - - - - - - - - - - - -'
エコー ''
# エコー スクリプトの初期化
echo 'リモート S3 バケットを同期しています...'
# 実際に同期コマンドを実行します ({BUCKET_NAME} を S3 バケット名に置き換えます)
/usr/bin/aws s3 sync s3://{BUCKET_NAME} /home/ubuntu/s3/{BUCKET_NAME}/
# エコースクリプトの補完
echo '同期完了'
スクリプト全体で{BUCKET_NAME}を S3 バケット名に 2 回置き換えてください。
プロのヒント:を使用してバイナリ/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 mon dow コマンド
次のコマンドは、1 時間ごとにスクリプトcrontab
を実行しsync.sh
(minute:0 および hour:* パラメーターで指定)、スクリプトの出力をディレクトリ内のsync.log
ファイルにパイプするように構成します。s3
0 * * * * /home/ubuntu/s3/sync.sh > /home/ubuntu/s3/sync.log
crontab
編集中のファイルの最後にこの行を追加する必要があります。次に、 Ctrl + Wを押してからEnterを押して、ファイルをディスクに保存します。その後、 Ctrl + Xnano
を押して終了できます。1 時間ごとに同期タスクが実行されるようになりました。crontab
プロのヒント: 1 時間ごとの cron ジョブが正常に実行されていることを確認するには、/home/ubuntu/s3/sync.log
.
準備完了!S3 バケットが EC2 サーバーに 1 時間ごとに自動的に同期されるようになりました。S3 バケットが大きくなるにつれて、新しいファイルを収容するために EC2 サーバーの EBS ボリューム サイズを増やす必要がある場合があることに注意してください。このガイドに従って、いつでも EBS ボリューム サイズを増やすことができます。