S3バケットをバックアップするためのアドバイスやベストプラクティスを探しています。
S3からデータをバックアップする目的は、次の理由によりデータの損失を防ぐことです。
いくつかの調査の後、次のオプションが表示されます。
どのオプションを選択する必要があり、S3にのみデータを保存することはどれくらい安全ですか?あなたの意見を聞きたいです。
便利なリンク:
もともと私のブログに投稿した: http://eladnava.com/backing-up-your-Amazon-s3-buckets-to-ec2/
これは、リモートS3バケットをローカルファイルシステムに同期できるようにする複数のコマンドラインユーティリティを使用することで簡単に実現できます。
s3cmd
最初、s3cmd
は非常に有望に見えました。しかし、巨大なS3バケットで試してみたところ、スケーリングに失敗し、Segmentation fault
でエラーが発生しました。ただし、小さなバケツでは問題なく動作しました。巨大なバケツでは機能しなかったため、別の方法を探し始めました。
s4cmds3cmd
の新しいマルチスレッドの代替。さらに有望に見えましたが、ローカルファイルシステムに既に存在するファイルを再ダウンロードし続けていることに気付きました。それは、syncコマンドに期待していた種類の動作ではありません。リモートファイルが既にローカルに存在するかどうかをチェックし(ハッシュ/ファイルサイズのチェックは適切です)、同じターゲットディレクトリでの次の同期実行でスキップする必要があります。この奇妙な動作を報告する問題( bloomreach/s4cmd /#46 )を開きました。それまでの間、私は別の選択肢を見つけようとしました。
awscli
そして、私はawscli
を見つけました。これは、異なるクラウドサービス(S3を含む)と対話するためのAmazonの公式コマンドラインインターフェイスです。
迅速かつ簡単にリモートバケットファイルをローカルファイルシステムにダウンロードする便利な同期コマンドを提供します。
$ aws s3 sync s3:// your-bucket-name/home/ubuntu/s3/your-bucket-name /
便利なことに、sync
コマンドは、ソース(S3バケット)から欠落している場合、宛先フォルダー(ローカルファイルシステム)のファイルを削除しません。逆も同様です。これはS3のバックアップに最適です。ファイルがバケットから削除された場合、再同期してもローカルで削除されません。また、ローカルファイルを削除した場合、ソースバケットからも削除されません。
awscli
をインストールすることから始めましょう。これを行うには いくつかの方法があります が、apt-get
経由でインストールするのが最も簡単であることがわかりました。
$ Sudo apt-get install awscli
次に、 [〜#〜] iam [〜#〜] から取得する必要があるアクセスキーIDと秘密キーでawscli
を構成する必要があります。ユーザーを作成し、AmazonS3ReadOnlyAccessポリシーをアタッチします。これにより、これらの資格情報にアクセスするユーザーまたはユーザーがS3ファイルを削除することもできなくなります。 us-east-1
などのS3リージョンを入力してください。
$ aws configure
できれば/home/ubuntu/s3/{BUCKET_NAME}
にローカルS3バックアップディレクトリを準備しましょう。 {BUCKET_NAME}
を実際のバケット名に置き換えてください。
$ mkdir -p/home/ubuntu/s3/{BUCKET_NAME}
次のコマンドを使用して、バケットを初めて同期してみましょう。
$ aws s3 sync s3:// {BUCKET_NAME}/home/ubuntu/s3/{BUCKET_NAME} /
バケットが存在し、AWSの認証情報とリージョンが正しく、宛先フォルダーが有効であると仮定すると、awscli
はバケット全体のローカルファイルシステムへのダウンロードを開始します。
バケットのサイズとインターネット接続に応じて、数秒から数時間かかることがあります。それが完了したら、自動cronジョブを設定して、バケットのローカルコピーを最新の状態に保ちます。
先に進み、sync.sh
に/home/ubuntu/s3
ファイルを作成します。
$ nano /home/ubuntu/s3/sync.sh
次のコードをコピーしてsync.sh
に貼り付けます。
#!/ bin/sh #現在の日付と時刻をエコーする echo '--------------- -------------- ' date echo' ---------------------- ------- ' echo' ' #Echoスクリプトの初期化 echo'リモートS3バケットの同期... ' #実際に同期コマンドを実行します({BUCKET_NAME}をS3バケット名に置き換えます) /usr/bin/aws s3 sync s3:// {BUCKET_NAME}/home/ubuntu/s3/{ BUCKET_NAME}/ #Echoスクリプトの完了 echo 'Sync complete'
スクリプト全体で2回、{BUCKET_NAME}をS3バケット名に置き換えてください。
プロのヒント:
aws
は限られたシェル環境でコマンドを実行し、crontab
バイナリにリンクするには/usr/bin/aws
を使用する必要があります実行可能ファイルを単独で見つけることができません。
次に、chmod
で実行できるように、スクリプトをcrontab
にしてください。
$ Sudo chmod + x /home/ubuntu/s3/sync.sh
スクリプトを実行して、実際に機能することを確認してみましょう。
$ /home/ubuntu/s3/sync.sh
出力は次のようになります。
次に、次のコマンドを実行して、現在のユーザーのcrontab
を編集しましょう。
$ crontab -e
crontab -e
を初めて実行する場合は、好みのエディターを選択する必要があります。 nano
を選択することをお勧めします。初心者にとって最も使いやすい方法です。
コマンドを記述することにより、スクリプトを実行する頻度とローカルファイルシステム上のスクリプトの場所をcrontab
に伝える必要があります。このコマンドの形式は次のとおりです。
m h dom mon dowコマンド
次のコマンドは、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
を終了できます。 crontab
は現在、同期タスクを1時間ごとに実行します。
プロのヒント:
/home/ubuntu/s3/sync.log
を検査し、その内容の実行日時を確認し、ログに記録して、同期された新しいファイルを確認します。
準備完了!これで、S3バケットがEC2サーバーに1時間ごとに自動的に同期され、すぐに使用できるようになります。 S3バケットが大きくなるにつれて、新しいファイルに対応するためにEC2サーバーのEBSボリュームサイズを増やす必要がある場合があることに注意してください。 このガイド に従って、EBSボリュームサイズをいつでも増やすことができます。
S3の耐久性が99.999999999%であることを説明する関連リンクを考慮すると、懸念事項#1は破棄します。真剣に。
ここで、#2が有効なユースケースであり、あなたにとって真の関心事である場合、私は間違いなくオプション#1または#3に固執します。それらのどれですか?それは本当にいくつかの質問に依存しています:
Amazon Glacier is optimized for data that is infrequently accessed and for which retrieval times of several hours are suitable.
これでよろしいですか?ストレージの使用量が非常に大きい場合を除き、バケットのバージョン管理に固執します。この方法では、Glacier、他のバケット、または他のサーバーにデータをバックアップするのに余分なコード/ワークフローは必要ありません(これは本当に悪い選択です、忘れてください)。
差分領域にある種の増分バックアップを保持するだけの簡単な方法があると思います。
上記のすべての提案は、実際には単純またはエレガントなソリューションではありません。バックアップソリューションよりもアーカイブソリューションの方が多いと思うので、氷河をオプションとは本当に考えていません。バックアップを考えるとき、ジュニア開発者からの災害復旧は、バケットを再帰的に削除するか、おそらくアプリのエクスプロイトまたはバグで、s3からデータを削除します。
私にとって最良の解決策は、あるバケットを別のリージョンにバックアップするスクリプトであり、毎日1週間と1週間に1回バックアップすることで、何かひどいことが起こった場合にリージョンを切り替えることができます。私はこのようなセットアップを持っていません、私はそれをやるのに少し手間がかかるので、私はそれをやろうとしていませんでした。
次の方法を使用してS3データをバックアップできます
AWS datapipelineを使用してバックアッププロセスをスケジュールします。以下の2つの方法で実行できます。
a。 1つのs3バケットから別のs3バケットにコピーできるdatapipelineのcopyActivityを使用します。
b。 datapipelineのShellActivityおよび「S3distcp」コマンドを使用して、バケットから別のバケットに再帰的なs3フォルダーの再帰的なコピーを実行します(並行して)。
S3バケット内でバージョン管理を使用して、異なるバージョンのデータを維持します
データのバックアップに氷河を使用する(バックアップを元のバケットに高速に復元する必要がない場合(データが圧縮形式で保存されているため、氷河からデータを取得するのに時間がかかる)または保存する場合に使用します)バックアップ用の別のs3バケットの使用を回避することでいくらかコストがかかります)、このオプションは、バックアップするs3バケットのライフサイクルルールを使用して簡単に設定できます。
オプション1を使用すると、元のs3バケットを誤って削除した場合のセキュリティを強化できます。別の利点は、別のs3バケットの日付ごとのフォルダーにバックアップを保存できることです。特定の日付のバックアップを復元します。それはすべてユースケースに依存します。
S3バケット自体ですぐに利用可能なクロスリージョンレプリケーション機能を使用してはどうですか?この機能に関する役立つ記事をいくつか紹介します
この質問は少し前に投稿されましたが、他のソリューションで MFA delete 保護について言及することが重要だと思いました。 OPは、データの偶発的削除を解決しようとしています。多要素認証(MFA)は、2つの異なるシナリオでここに現れます-
オブジェクトバージョンの完全な削除-バケットのバージョン管理でMFA削除を有効にします。
バケット自体を誤って削除する-MFA認証なしで削除を拒否するバケットポリシーを設定します。
クロスリージョンレプリケーション および バージョン管理 と組み合わせて、データ損失のリスクを減らし、リカバリシナリオを改善します。
詳細はこのトピックの ブログ投稿 です。