格安のクラウドディスクのAWS Glacierにパソコンのファイルをバックアップした件 | そう備忘録

格安のクラウドディスクのAWS Glacierにパソコンのファイルをバックアップした件

ファイルのバックアップ方法

このブログ記事の元ネタの画像や動画をWindowsパソコンのDドライブに保存をしているのだが、200GByte近くになってきた。

全くバックアップを取得してないのでパソコンのハードディスクがクラッシュしたら全て失われてしまう。

ブログ自体はサーバーに保管されているのでパソコンの元データが失われても直ぐに困ることは無いのだが、記事の修正など見直したい時に元画像が失われているとちょっと困る時がある。

一方、Google Drive 等のクラウド上のディスクはファイルのバックアップ先としては割高に感じてしまう。

このような

  • 大容量
  • 必須では無いが可能ならばバックアップは取得しておきたい
  • バックアップファイルの使用頻度はそれほど多くない
  • なるべく費用はかけたくない

の条件を満たすバックアップ方法をいくつか検討したのだが今回はAWS Glacierにバックアップをすることにした。

他に検討した案

AWS Glacier以外では以下の方法を検討した。

クラウドのドライブ(Google DriveやS3など)

簡単にコピーが出来て同期をすればバックアップ操作も不要なので操作性・利便性は非常に高いのだがそれほど使用頻度が高いわけでも無いファイルのバックアップ先としては割高に感じた

※Google Driveで100GBで2ドル/月

自宅NASの構築

こちらは利便性も良く一度構築すれば月額料金が発生しないのはありがたいポイント

高速でアクセス出来る点は良いのだが、せっかく自宅NASを構築するのであればもう少しアクセス頻度の高いファイルを保存したい

バックアップはそれほど高速でアクセスする必要のあるファイル類では無いので検討対象からは外した

Blu-ray Disc

AWS Glacierと比較して最後まで迷ったのがBlu-ray Disc

結局バックアップしたディスクがどれだが分からなくなりそうという事と一度Glacierを試してみたかったとの理由により今回は対象から外した(なんだかんだでAWS Glacierを試してみたかった)

AWS Glacierの特徴

AWS(Amazon Web Services)のGlacier(氷河)の特徴は以下の通り。

低コスト

東京リージョンで一ヶ月、0.005 USD/GBで保存ができる。

今回保存したいファイルの容量は約200GBなので1ドル/月(約106円)でディスクを使用できる計算になる。

取り出しは1ヶ月に10GBまでは無料で取り出せる。

無料枠を超えた場合の料金(東京リージョン)は

  • 迅速 0.033USD/GB
  • 標準 0.011USD/GB
  • 大容量 0.00275USD/GB

と取り出すデータの速度により3種類のメニューがあった(2020年10月現在)

尚、最新の情報は料金表を参照して欲しい。

また注意点としてはオブジェクトの最低保存期間が90日となっているので例えば200GB(月に1ドル)のファイルを1日だけ保存して直ぐに削除しても、残り89日分の料金を日割りで請求されるので、約3ドルの費用が発生する。

Glacierは長期間保存する用途向けなので頻繁に整理、削除をするものには向かないと思う。

高耐久性

99.999999999%の高耐久性。

3つのアベイラビリティゾーンにまたがって自動的に分散されるとの事。

自宅NASやBlu-ray Discよりかは耐久性が高いと思う。

取り出し

操作方法は後述するが、取り出しに時間がかかる。

取得JOBを発行してJOBの終了を確認してからデータをコピーする操作手順となる。

尚、JOBの終了はAmazon SNS(Simple Notification Service)を使ってメールやSMSに通知をすることが出来る。

試しに10M程度のファイルをバックアップ後に取り出してみたがJOBが終了するまで標準モード(Standard Tier)で約4時間かかった。

※JOB終了後のファイルのコピーは数秒で終了した

バックアップ手順

Dドライブ直下のsouichirouフォルダー配下の全てのファイル(フォルダー構成も含む)をバックアップしようと考えている。

最初にzipコマンドでフォルダー配下の全てのファイルを圧縮してAWS Glacierにバックアップを取得する。

次回以降は前回バックアップを取得した日付以降に更新されたファイルのみを抽出して圧縮した後、同じ様にAWS Glacierにバックアップをする手順とした。

ボールトの作成

最初にAWS Glacierにボールト(アーカイブを格納するコンテナ)を作成する。

AWS CLI(Command line interface)から作成すること可能だが今回は初回なのでコンソールから作成した。

s3 Glacier

AWSコンソールにログイン後、メニューからS3 Glacierを選択する。

s3 Glacierを選択する

Amazon S3 Glacierのメニューに移動するので「ボールトの作成」ボタンをクリックする。

ボールトの作成

リージョンの選択

リージョンの選択にて”米国東部(バージニア北部)”を選択した。

これはストレージ料金が東京だとGB/月辺り0.005USDに対して米国東部だと0.004USDと20%程安かったからだ。

元々格安なので微々たる差なのだが長期間継続していると積み重ねで費用が変わってくるのとAWS Glacierはリージョンをまたがって利用できるサービスなので折角なので東京リージョン以外も試してみたいという気持ちもあって米国東部にしたのだがちょっと失敗だったかも知れない。

というのも後述するがファイルのバックアップにかなり時間がかかるのと大きなファイルだと接続エラーで途中で切れてしまう(海外のリージョンだから切れてしまうのか、因果関係は不明)

自分の場合は大きなサイズは初回だけで2回目以降は差分だけでそれ程大きなサイズにはならないのでそのまま米国東部リーションを使用する事にした。

しかし頻繁に大容量のファイルをバックアップするのであれば東京リージョンの方が良いように思う。

リージョンは米国東部を選択した

ボールト名

ボールト名に”skdiskbackup”を入力して「次のステップ」ボタンをクリックした。

ボールト名

通知の設定

データを取り出すJOBが終了した時にAmazon SNS(Simple Notification Service)を使って通知が来るように設定することができる。

自分は以前にSNSトピックを設定していたので”通知を有効にし、既存のSNSトピックを使用”を選択した。

Amazon SNS(Simple Notification Service)の設定の仕方は以前の記事を参照

イベント通知の設定

ARNの設定

Amazon SNSトピックのARNを設定する。

SNSトピックのARN(Amazon Resource Name)はAmazon SNSでトピックを作成すると自動的に設定される。

通知を取得するタイミングで、

  • アーカイブの取得ジョブの終了
  • ボールとイベントリの取得ジョブの完了

の両方にチェックして「次のステップ」ボタンをクリックした。

Amazon SNSトピックARNの設定

確認

確認ページが表示されるので「送信」ボタンをクリックした。

確認

ボールトが作成されるので名前(skdiskbackup)をクリックする。

ボールトが作成された

詳細タグ

詳細タグページが表示される。

続いて画面上部の「設定」ボタンをクリックした。

詳細、通知、アクセス許可、ボールトロック、タグが表示される

取り出しポリシー

データを取り出す時のポリシーを選択する。

“無料利用枠のみ”を選択したので無料枠を超えたデータ取得リクエストは拒否される。

無料利用枠の1か月につき10GBを日割りしたバイト数(約300MB)を超えたアーカイブ取得要求をした場合はエラーになるので注意。

その他には”最大取得率”をGB/時間で指定する方法(1GB/時間だと月に7.2USD)や”取得制限なし”が選択できる。

取得制限なしの場合は取得JOBで設定するTier(Expedited(迅速)、Standard(標準)、Bulk(大容量))に応じて料金が異なる。

データ取り出し設定

AWS CLI

続いてAWS CLI(Command line interface)のインストールや各種設定を行う。

インストール

AWS CLIはこちらのページからWindows64ビット版をインストールした。

AWS CLIのインストール

確認

インストール後にコマンドプロンプトかPower Shellからaws –versionでバージョン情報が表示されればインストールは成功。

AWS CLIインストールの確認

Glacier専用ユーザ

AWS CLIからAWS Glacierに対して各種操作をする為の専用ユーザを作成した。

従来のAdministrator権限を持っているアカウントを使っても良いのだがセキュリティ上好ましくないのでCLI用にアカウントを分けることにした。

AWSのメニューからIAM(Identity and Access Management)を呼び出して左のメニューから”グループ”を選択する。

グループの作成

グループの作成

「新しいグループの作成」ボタンをクリックする。

グループの作成

グループ名:CLIGroup

を入力して「次のステップ」ボタンをクリックする。

CLIGroup

ポリシーのアタッチ

作成したグループに対してポリシーをアタッチする。

  • AmazonS3FullAccess
  • AmazonGlacierFullAccess

の2つを選択して「次のステップ」ボタンをクリックする。

今回はCLI用にS3 Glacier関連の権限だけを付与したが、今後は必要に応じてこのグループに対して権限を追加する事にする。

ポリシーのアタッチ

チェックしたポリシーが選択されていることを確認して「グループの作成」ボタンをクリックする。

グループの作成

ユーザの作成

グループ名”CLIGroup”が作成されたので続いてCLI用のユーザを作成する。

左のメニューから”ユーザ”を選択する。

ユーザの作成

「ユーザを追加」ボタンをクリックする。

ユーザを追加

ユーザ名(任意の名前)を入力して、

  • プログラムによるアクセス:チェック
  • AWSマネジメントコンソールへのアクセス:未チェック

にして「次のステップ」ボタンをクリックする。

※CLI専用のユーザにするので”AWSマネジメントコンソールへのアクセス”にはチェックをしなかった

ユーザ名

アクセス許可

アクセス許可の設定にて”ユーザをグループに追加”を選んで先ほど作成したCLIGroupをチェックして「次のステップ」ボタンをクリックする。

ここで”既存のポリシーを直接アタッチ”を選んで先程CLIGroupを作成した時と同様の手順でポリシーを直接アタッチすることもできる。

アクセス許可の設定

タグの設定

タグは設定しなかった。

「次のステップ」ボタンをクリックする。

タグの設定

確認

確認ページが表示されるので「ユーザの追加」ボタンをクリックする。

確認ページが表示されるので「ユーザの作成」

アクセスキーID

“アクセスキーID”と”シークレットアクセスキー”が表示されるので保存しておく。

アクセスキーIDはこの後からでも確認することが出来るがシークレットアクセスキーはこのページで保存をしないと2度と表示されないので注意!

アクセスキーIDとシークレットアクセスキー

ユーザ作成

新規にAWS Glacierに対するアクセス権のあるCLI用のユーザが作成された。

ユーザが作成された

aws confugre

事前にaws confugreコマンドで接続先リージョンやアクセスキーID、シークレットアクセスキーの設定を行っておく。

Windowsのコマンドプロンプトからaws configureと入力する。

  • AWS Access Key ID:先程保存したアクセスキーIDを入力する
  • AWS Sercret Access Key:先程保存したシークレットアクセスキーを入力する
  • Default region name:Glacierのボールトを作成したus-east-1(米国東部・バージニア北部)を入力する
  • Default output format:jsonを入力した

尚、この設定はWindowsを再起動しても残るので設定変更をしたい場合は再度aws configureコマンドで変更する。

aws confugreでの設定

ボールトの確認

コマンドプロンプトから下記のコマンドでボールトを確認する。

aws glacier list-vaults --account-id -

–account-idオプションで – を指定すると先程のaws configureコマンドで指定されたアカウントが使用される。

ボールトの確認

初回バックアップファイルの作成

続いてd:¥souichirou¥配下のファイルを全て圧縮する。

接続エラーの件

圧縮ファイルの作成には圧縮解凍ソフトの7-zipを使った。

と言うのも200GB近いファイルは圧縮しても160GB程のサイズになってしまいGlacierにバックアップする途中で接続エラーになってしまった。

メッセージは”Connection was closed before we received a valid response from endpoint URL ・・・”

その為、7-zipで圧縮しながら複数のファイルに分割をすることにした。

最初は1ファイル4GBで分割したのだがこのサイズでも接続エラーになってしまったので結局700MB×228ファイルに分割した。

それでも8ファイル程、接続エラーになってしまったので再送している。

また228ファイル(160GB)のAWS Glacierへのアップロードに5.5日間程費やしており海外リージョンを選択した事をちょっと後悔した。

東京リージョンであればバックアップ速度も接続エラーの頻度ももう少し状況が良かったのではないかと思っている。

分割圧縮

7-zipで700MB毎に分割をしながら圧縮をしてd:¥split¥のフォルダーにsouichirou.zipのファイル名で保存した。

7-zipで分割圧縮

700MB×228個のファイルに分割圧縮された。

700MB×228個のファイルに分割圧縮された

アップロード

AWS Glacierにアップロードを行う。

手動でいちいちコマンド入力をするのは大変なのでglacierbackup.batファイルを作成した。

aws glacier upload-archive --account-id - --vault-name skdiskbackup --body souichirou.zip.001 > result.txt
aws glacier upload-archive --account-id - --vault-name skdiskbackup --body souichirou.zip.002 >> result.txt
aws glacier upload-archive --account-id - --vault-name skdiskbackup --body souichirou.zip.003 >> result.txt
   ・
   ・
   ・
aws glacier upload-archive --account-id - --vault-name skdiskbackup --body souichirou.zip.228 >> result.txt

upload-archive

ボールトにアップロードしてアーカイブする

–account-id

– を指定すると事前にaws configureコマンドで指定したアカウントが使用される

–vault-name

先程作成したボールト名(skdiskbackup)を指定した

–body

アーカイブしたいファイル名(souichirou.zip.xxx)を指定した

>>

結果をテキストファイル(result.txt)にリダイレクトした

glacierbackup.batを実行すると順番にファイルがアップロードされる。

アップロードの実行

このままパソコンを立ち上げっぱなしにして置いた所、228ファイル(約160GB)のファイルをバックアップするのに5.5日かかってしまった。

それ程パソコンに負荷が掛かる処理では無いのでその間、インターネットやメールでのやり取りは普通にできたがオンラインゲームなどは控えた。

海外リージョン(米国東部・バージニア北部)を選択せずに国内リージョンであればもう少し早く終わったのではないかと思っている。

実行結果

実行結果(result.txt)は以下の通り。

この中でarchiveIdはデータを取り出す時に必要になるのでファイル名と関連付けて控えておく。

実行結果

差分バックアップ

2020年9月26日にフルバックアップを取得したので次回以降は差分のみをバックアップする。

指定した日付以降に更新したファイルのみを圧縮したいのだが7-zipに日付指定の機能が見当たらなかった。

linuxのzipコマンドは-tオプションでファイルの更新日を指定することが出来ることを知っていたので、結局Windows版のコマンドプロンプトから使用できるzipコマンドをインストールした。

zipコマンドの詳細についてはこちらの記事を参照して欲しい。

使用したコマンドは以下の通り。

zip -r -t 2020-09-26 souichirou_20201010.zip souichirou

-t オプションで2020-09-26日以降に更新されたファイルのみを抽出している。

本日は2020-10-10なのでファイル名に日付を入れており、次回は2020-10-10以降に更新されたファイルのみを抽出すれば良い。

作成されたファイルを前述と同様の手順でAWS Glacierにバックアップした。

ダウンロード

AWS Glacierからのファイルのダウンロードも試しておいた。

尚、今回バックアップしたファイルは容量が大きいので別のファイルで検証している。

取得JOBの発行

AWS Glacierはいきなりファイルをダウンロードする事ができない。

まずは一旦、取得JOBを発行する必要がある。

JSONファイルの作成

最初に取得JOB用のJSONファイル(glacierjob.json)を作成する。

{
  "Type": "archive-retrieval",
  "ArchiveId": "控えておいたArchiveID",
  "Description": "jpeg file download JOB",
  "SNSTopic": "arn:aws:XXXXXXXX",
  "Tier" : "Standard"
}

Type

“archive-retrieval”(アーカイブの検索)を指定した

上記以外では、select、inventory-retrievalが指定可能

ArchiveId

バックアップ時に控えておいたArchiveIdを指定する

Description

説明文

SNSTopic

JOBが終了した事を知らせるSNS TopicのARNを指定する

SNS Topicの設定については以前の記事を参照して欲しい

下記はSNS Topicの指定に基づいて届いたメールだがjobidが表示されているので控えておく

Glacier JOBの終了通知

尚、未指定の場合は連絡が来ないので自分でJOBの終了を確認する必要がある

Tier

  • Expedited(迅速)
  • Standard(標準)
  • Bulk(大容量)

の3パターンを指定する事ができる

指定したパターンによって料金が異なるので詳細はこちらのページを参照して欲しい

尚、自分はボールトの設定時の取り出しポリシーで”無料枠のみ”指定しているので日割りで300MBを超えるファイルを取り出そうとした場合にはエラーになる(未検証)

大容量のファイルの取り出しが必要な際には料金表を見ながら取り出しポリシーを変更してTierを指定することになる

JOBの発行

先程のJSONファイルを指定して以下のコマンドでJOBを発行する。

aws glacier initiate-job --account-id - --vault-name skdiskbackup --job-parameters file://glacierjob.json

initiate-job

JOBの開始の指定

–account-id

– を指定すると事前にaws configureコマンドで指定したアカウントが使用される

–vault-name

先程作成したボールト名(skdiskbackup)を指定した

–job-parameters

先程作成したJSONファイルを指定する

file://glacierjob.json

JOBの状態の確認

SNS TOPICを指定していない時はJOBの終了を手動で確認する必要がある。

以下のコマンドでJOBの状態を確認する。

aws glacier list-jobs --account-id - --vault-name skdiskbackup

尚、この際にjobidが表示されるので控えておく。

ちなみに今回のJOBは4時間程掛かって終了した。

JOBの状態表示

Completedがfalseなので実行中である事が分かる。

データの取得

JOBの終了を確認した後、jobidを指定してデータを取得する。

aws glacier get-job-output --account-id - --vault-name skdiskbackup --job-id XXXXXX ファイル名

get-job-output

JOBの出力をダウンロードする

–account-id

– を指定すると事前にaws configureコマンドで指定したアカウントが使用される

–vault-name

先程作成したボールト名(skdiskbackup)を指定した

–job-id

先程控えておいたjobidを指定した

ファイル名

ダウンロードするファイル名

この名前でパソコン上にファイルが作成されるのだが実際にバックアップした元ファイルと違う名前でも作成できてしまう

その為、ArchiveIdとファイル名の関連はどこかに控えておく必要がある

データの取得の実行結果。

  • DSC0827.JPGファイルを取り出した
  • status:200は正常終了
取得JOBの実行結果

アーカイブの削除

不要になったアーカイブを削除する。

尚、削除JOBを実行して直ぐに削除される訳では無く実際には翌日辺りに削除されている模様。

また前述したがオブジェクトの最低保存期間が90日となっているので、90日以前に削除してもその分の料金は請求される。

aws glacier delete-archive --account-id - --vault-name skdiskbackup --archive-id XXXXX

delete-archive

アーカイブの削除を指定する

–account-id

– を指定すると事前にaws configureコマンドで指定したアカウントが使用される

–vault-name 

先程作成したボールト名(skdiskbackup)を指定した

–archive-id

削除したいArchiveIdを指定する

アーカイブの削除

以上でAWS Glcierにパソコンのファイルを圧縮してバックアップする記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。