S3のデータをWindows 8にバックアップする

2013.09.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

(゚Д゚)え?
どうかんがえても、S3のほうが信頼性高いでしょ?なぜ信頼性の高い方から低い方にバックアップ?
と思われた方、私と同じです。話を聞いてみると、S3にメインのデータが存在するが、オペレーションミス等で削除する可能性があるので、バックアップしたいとのことでした。
S3にはバージョンの機能もありますが、複数アップロードするとそれだけ容量が増えてしまうので、会社の隅でひっそり暮らしているWindowsマシンに定期的にデータをバックアップするということになりました。

使うものは3つ、AWS CLI、バッチファイル、そしてタスクスケジューラです。全部無料です。最近のWindowsであればPowerShell!、ということで試してもみたのですが、

  • ファイルから実行するために設定が必要なこと
  • 単純にコマンドを起動するだけなので制御構造や、オブジェクト連携必要なし

ということなので昔ながらのバッチファイルにしました。AWS CLIが入るならばWindows 2000でも動くはずです。

ではさっそく始めましょう。

AWS CLIのインストール

AWS CLIですが、最近の弊社ブログですと こちらこちらで紹介していますので、参考にしてもらえればと思います。Windowsはmsi形式のインストーラが用意されています。本家のページに訪れ、右側のWindowsの下にある32bit/64bitのいずれかをクリックするとインストーラがダウンロードできます。1

32bit/64bitどちらかよくわからないという人はWindows 8ですと

コントロールパネル > システムとセキュリティ > システム

の中に「システムの種類」という項目があるので、そちらを見ればどちらかわかります。ダウンロードしたmsiをダブルクリックしてインストールを開始します。クリックだけです。スクリーンショットをのせます。

2

 

3

 

4

5

 

6

S3コマンドの実行

インストールが完了すると環境変数PATHに自動的にコマンドのパスが追加されます。このためコマンドプロンプトを起動すればすぐにAWSコマンドは実行できます。

アクセスキー、シークレットキーを設定してS3コマンドを実行してみましょう。

 C:\Users\takekawa\synctest>SET AWS_ACCESS_KEY_ID="XXXXX AWS key XXXXX" C:\Users\takekawa\synctest>SET AWS_SECRET_ACCESS_KEY="XXXXX AWS secret keyXXXXX" C:\Users\takekawa\synctest>aws s3 ls A region must be specified --region or specifying the region in a configuration file or as an environment variable

エラーになりました。リージョンを指定しないといけないとのことです。
環境変数AWS_DEFAULT_REGIONを追加して再度実行します。

 C:\Users\takekawa>set AWS_DEFAULT_REGION=ap-northeast-1 C:\Users\takekawa>aws s3 lsCreationTime Bucket ------------ ------ C:\Program Files\Amazon\AWSCLI\.\dateutil\parser.py:336: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting the m as being unequal 2013-09-09 15:49:50 testest2355

 バケットは見えるようですが、警告が出ています。「Unicodeの引数があった場合に比較が失敗するので、アンイコールとして処理される」と言っています。syncコマンド等でファイル名の比較を行なうのですが、その時に問題がでるのかもしれません。ただ、私の試した範囲では特に問題はなかったので無視します。もしわかる方がいれば教えてください。

コマンドの実行ができることがわかったので、バックアップ用に同期を試してみます。
同期用にtesttest2355というディレクトリを作りました

で、同期してみます。

 C:\Users\takekawa\synctest>aws s3 sync s3://testest2355 testtest2355 C:\Program Files\Amazon\AWSCLI\.\dateutil\parser.py:336: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal download: s3://testest2355/redshift_client.template to testtest2355\redshift_client.template download: s3://testest2355/参考資料_20130722.zip to testtest2355\参考資料_20130722.zip download: s3://testest2355/AWSサポート (Amazon版).ppt to testtest2355\AWSサポート (Amazon版).ppt download: s3://testest2355/CM_AWS.ppt.pptx to testtest2355\CM_AWS.ppt.pptx

同期できました。同じコマンドを再度実行します。

 C:\Users\takekawa\synctest>aws s3 sync s3://testest2355 testtest2355 C:\Program Files\Amazon\AWSCLI\.\dateutil\parser.py:336: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting the m as being unequal C:\Users\takekawa\synctest>

既にコピーされているファイルはコピーされないですね。というわけで動作確認ができました。

バッチファイルはこのように作成しました。

 @SET AWS_ACCESS_KEY_ID="XXXXX AWS key XXXXX" @SET AWS_SECRET_ACCESS_KEY="XXXXX AWS secret keyXXXXX" @SET AWS_DEFAULT_REGION=ap-northeast-1 aws s3 sync s3://testest2355 C:\Users\takekawa\synctest\testest2355

 @がついているとコマンドが出力されません。

このバッチファイルをタスクスケジューラに設定すれば完了です。

注意点(2013.09.17更新)

ただし、この方法でバックアップをとる場合、一つ問題点があります。S3側で変更されたファイルは、次回sync時に変更されてしまうため、バックアップが走る前に問題に気づけないといけないという点です。削除については --delete オプションをつけた場合のみコピー元が存在しない場合削除されるので、このオプションをつけなければ問題ありません。現状ではバックアップの間隔を1週間に一度という形で運用しています。バックアップソフト、S3のバージョン機能をつかえば、個々のファイルのバージョン毎のリカバリーは可能になるのですが、なにぶん予算に限りがあるもので、ここはあきらめるところにはいっております。CLIのpythonコードを書き換えるという方法もあるかもしれません。

まとめ

  • Windows版AWS CLIはインストーラの実行のみで、pythonを入れる必要がない。
  • AWSCLIの実行にはアクセスキー、シークレットキー、リージョンを指定する環境変数が必要
  • aws s3 syncで unicode変換に関する警告が出るが大きな問題ではなさそう。
  • シンプルな作業ならばバッチファイルで十分
  • シンプルすぎて注意点があります