はじめに

こんにちは、広島からリモートワークしている廣田(@hiropon1839)です。
今回は個人データのバックアップ戦略を見直し、コストを削減してみました。

※当ブログ記事での「個人データ」とは、仕事・業務に関連するデータではなく、完全にプライベートで利用する私的データ(写真等)を指します。

※S3への保管に際して、当ブログを参考にされたことによるデータ損失等には一切責任を負えません。利用者様の責任の範囲で実行してください。

目次

個人データの保管・管理方法
コスト削減前の料金
データ内訳、アクセス頻度の低いデータ
S3 Glacier Deep Archiveとは
月額費用と削減コスト
初期費用
データ取り出し時の費用(PCにデータをダウンロードするまでにかかる費用)
S3 Glacier Deep Archiveへのファイル保管
バケットの作成
バケットへの保存(Webコンソール)
バケットへの保存(AWS CLI)
aws s3 syncコマンド高速化
料金の確認
さいごに

個人データの保管・管理方法

皆さんはスマートフォン・デジカメ・ビデオカメラ等で撮影した日々増えていく写真や動画をどうやって保管・管理していますか?

私は・・・、
スマートフォンで撮影した写真・動画は、Googleフォトに保管されるように設定しています。Google Oneのストレージ容量節約のため「保存容量の節約画質」オプションで保存しています。このオプションで保存すると、元データが圧縮されて保存されます。

しかし、もしかしたら元データが必要になる時(高画質での写真現像、Googleアカウントの停止等)があるかもしれないと考え、元データをPC経由で外付けHDDにも保管しています。

PCのSSD容量が少ないため、PCには全データは保管しておらず、スマートフォンからの元データを一時的に保管する領域としてのみ使用しています。

PCからGoogleドライブにアップロード、そして2-3ヵ月に1回、溜まったデータを外付けHDDに同期、同期が完了したデータはPCから削除、という使い方です。

Googleドライブにはスマートフォン、デジカメで撮影した写真・動画の他に、大学時代のサークルのデータ(映像系サークルだったため、動画ファイルが多い)、その他のデータがあり、Googleドライブの容量にして『872GB』になっていました。そして今後も増え続けます。

コスト削減前の料金

Google Oneの料金は、ブログ執筆時点(2024年2月)で下記の通りです。
15GBまで:無料
100GBまで:250円/月
200GBまで:380円/月
2TBまで:1,300円/月


参考:Google One プランと料金設定(https://one.google.com/about/plans?hl=ja)より画面キャプチャし、編集。

Googleドライブで『872GB』の利用のため、月額1,300円支払っている状況です。
※Googleフォト分の容量は軽微なため割愛

データ内訳、アクセス頻度の低いデータ

872GBの内訳は下記でした。
(Googleフォトにも圧縮保管済の)写真・動画データ:420.8GB
大学時代の映像系サークルの動画データ:428.8GB
その他のデータ:24GB

写真・動画データを見返したいときはGoogleフォトで閲覧しているため、Googleドライブに閲覧目的でアクセスすることはほぼないことに気が付きました。大学時代の映像系サークルの動画データについては、3年以上アクセスしていませんでした。

これらのデータ合計が420.8GB+428.8GB=849GBで、Googleドライブから削除すると利用容量が24GBになるため、250円/月のプラン(100GB以下)におさめることができます。

Googleドライブから削除すると元データが保管される場所は、
・外付けHDD
の1箇所だけになります。

もう1箇所、できれば遠隔地にも保管しておきたいところです。(アクセス頻度は少ないけれど、損失すると困るデータです。)

前置きが長くなりましたが、ここでS3 Glacier Deep Archiveの登場です。

S3 Glacier Deep Archiveとは

S3 Glacier Deep Archive は、1 年に 1 回未満しかアクセスせず、非同期で取り出される長寿命のアーカイブデータに対して、低いコストのストレージを提供します。GB あたり月額わずか 0.00099 USD (TB あたり月額 1 USD) で、S3 Glacier Deep Archive は最もコストが低いストレージをクラウドで提供します。この料金は、オンプレミスのテープにデータを保持する場合やオフサイトにデータをアーカイブする場合よりも大幅に低額です。S3 Glacier Deep Archive は、物理的に分離された複数の AWS アベイラビリティーゾーンにデータを冗長的に保存することにより、 99.999999999% (11 9s) のデータの耐久性と 99.99% の可用性を実現できるように設計されています。
Amazon S3 Glacier ストレージクラス(https://aws.amazon.com/jp/s3/storage-classes/glacier/)より引用し抜粋

S3 Glacier Deep Archiveの注意点として、
・データ保管リクエスト(オブジェクトのPUT/POST/COPY)にS3標準ストレージよりも高い料金が発生する(約10倍)
・データ取り出しリクエストに料金が発生する
・データ取り出しに料金が発生する
・データ取り出しリクエストからデータの取り出しが可能になるまで最大48時間必要
・データのダウンロード時に、S3標準ストレージ同様、データの転送料金(S3からインターネットへのアウトバウンド通信)が発生する
・データ保管の最小期間が180日
 →180日以内に保管したデータの削除や上書きを行った場合、180日分のデータ保管料が発生する
が挙げられます。
参考:Amazon S3の料金(https://aws.amazon.com/jp/s3/pricing/)

月額費用と削減コスト

東京リージョンや大阪リージョンではなく、1番安いリージョンを選択するのがポイントです。

ブログ執筆時点(2024年2月)では、下記の5リージョンが最安(0.00099USD/GB)でした。
参考:Amazon S3の料金(https://aws.amazon.com/jp/s3/pricing/)
米国東部(バージニア北部/us-east-1)
米国東部(オハイオ/us-east-2)
米国西部(オレゴン/us-west-2)
欧州(アイルランド/eu-west-1)
欧州(ストックホルム/eu-north-1)

東京リージョン(0.002USD/GB)と比べ、2倍以上コストが異なります。
ネットワークレイテンシーは求めていないため、自宅からの距離を気にする必要はありません。
今回は米国東部(バージニア北部/us-east-1)を利用します。

保管対象は総容量849GB総ファイル数90,646個です。

毎月のランニング費用だけを計算すると、
・データ保管:0.00099USD/GB
のみが発生するため、849GB×0.00099USD=0.84USD→約130円(@1ドル150円)となります。

Google Oneの2TBプラン(1,300円/月)→100GBプラン(250円/月):-1,050円
S3 Glacier Deep Archive:+130円/月
削減コストは、
1,050円-130円=920円/月
となります。

初期費用

S3 Glacier Deep Archiveに保管するための初期費用として、下記が必要です。

・データ保管リクエスト(オブジェクトのPUT/POST/COPY):0.05USD/1,000リクエスト

単純に計算すると、
総ファイル数90,646個÷1,000リクエスト×0.05USD→約4.5USD→約680円(@1ドル150円)

初期費用
680円
となります。

※マルチパートアップロード中、一時的にS3標準ストレージの容量で計算される等については考慮しておりません。各種費用は概算となります。正確な料金計算が必要な場合は、AWS料金見積りツール(https://calculator.aws/)をご利用ください。
参考:マルチパートアップロードと料金(https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/mpuoverview.html#mpuploadpricing)

データ取り出し時の費用(PCにデータをダウンロードするまでにかかる費用)

データ取り出しには下記3種類の費用が発生します。

・データ取り出しリクエスト(標準):0.10USD/1,000リクエスト
・データ取り出しリクエスト(大容量):0.025USD/1,000リクエスト
・データ取り出し(標準):0.02USD/GB
・データ取り出し(大容量):0.0025USD/GB
・データ転送(S3からインターネットへのアウトバウンド通信):0.09USD/GB

データ取り出しリクエスト、データ取り出しの「(標準)」「(大容量)」は、取り出し可能になるまでに必要な時間が異なります。
標準取り出し:12時間以内
大容量取り出し:48時間以内
参考:アーカイブの取り出しオプション(https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/restoring-objects-retrieval-options.html)

個人の要件としては48時間以内の取り出しで問題ないため、安価な「大容量取り出し」で計算します。

データ取り出しリクエスト(大容量):0.025USD/1,000リクエスト
単純に計算すると、
総ファイル数90,646個÷1,000リクエスト×0.025USD→約2.3USD→約350円(@1ドル150円)

データ取り出し(大容量):0.0025USD/GB
単純に計算すると、
総容量849GB×0.0025USD→約2.2USD→約330円(@1ドル150円)

データ転送(S3からインターネットへのアウトバウンド通信):0.09USD/GB
単純に計算すると、
総容量849GB×0.09USD→約76.4USD→約11,460円(@1ドル150円)

外付けHDDを損失した場合、全データ(総容量849GB、総ファイル数90,646個)をPCにダウンロードするまでに必要な費用は、
12,140円
となります。

データ転送に関しては、Glacier Deep Archive以外のS3でも同じ料金が発生しますが、
個人利用としてはかなり大きな金額になりました。

※各種費用は概算となります。正確な料金計算が必要な場合は、AWS料金見積りツール(https://calculator.aws/)をご利用ください。

S3 Glacier Deep Archiveへのファイル保管

実際にファイルを保管してみましょう。

バケットの作成


「バケットを作成」をクリックします。


AWS リージョンは「米国東部(バージニア北部) us-east-1」を選択します。

今回作成するバケットに発生する費用をAWS Cost Explorerで確認したいため、バケット名と同名のタグを設定しました。
その他はデフォルト値で問題ありません。「バケットを作成」をクリックします。

バケットへの保存(Webコンソール)

Webコンソール(ブラウザ)からファイルをアップロードしていきます。


「アップロード」をクリックします。


「フォルダの追加」をクリックします。


アップロードしたいフォルダを選択して、「アップロード」をクリックします。


内容を確認して、「アップロード」をクリックします。


アップロード対象のファイルが表示されます。


続けて、もう1つのフォルダも選択して、「アップロード」をクリックします。


内容を確認して「アップロード」をクリックします。


アップロード対象のファイル一覧が表示されます。
事前に外付けHDD内のプロパティで確認していた容量・ファイル数「総容量849GB、総ファイル数90,646個」と一致しました。


ストレージクラス「Glacier Deep Archive」を選択します。


その他はデフォルト値で問題ありません。
「アップロード」をクリックします。


アップロードが始まりました。

・・・、

推定残り時間:7 days!?
150個ほどアップロードが完了した時点の転送速度は「1.4MB/s」でした。これだと完了まで7日間かかります、とても使い物にはなりません。
「キャンセル」をクリックします。

アップロード画面にも、160GBを超えるファイルをアップロードするにはAWS CLI等を使いましょう、という記載がありました。
AWS CLIで再度アップロードしてみます。

バケットへの保存(AWS CLI)

当ブログでは省略しますが、AWS CLIインストールと認証情報設定を行い、aws s3コマンドでバケットへ接続できる状態にしました。

aws s3 syncコマンドを使ってS3バケットへファイルをアップロードしてみます。
Windowsの場合、PowerShellで下記コマンドを実行します。

aws s3 sync (アップロード元ディレクトリ) s3://(バケット名)/(アップロード先ディレクトリ)/ --storage-class DEEP_ARCHIVE

転送速度は「3.1MiB/s」、Webコンソールからのアップロードに比べ、多少速くなりましたが、完了まで3日以上かかる計算です。まだまだこのままでは使えません。

3.1MiB/秒=186MiB/分=11160MiB/時=11.72GB/時
849GB(総容量)÷11.72GB=72.44→72.44時間→丸3日以上

aws s3 syncコマンド高速化

AWS re:Postの「Amazon S3 の sync コマンドの転送パフォーマンスを向上させるにはどうすればよいですか?」(https://repost.aws/ja/knowledge-center/s3-improve-transfer-sync-command)
を参考に「max_concurrent_requests」をチューニングしてみました。

max_concurrent_requests:10(デフォルト)

転送速度:3.1MiB/s

max_concurrent_requests:50

下記コマンドで設定、確認が可能です。

aws configure set default.s3.max_concurrent_requests 50
aws configure get default.s3.max_concurrent_requests

転送速度:15.1MiB/s
→5倍近く速くなりました。

max_concurrent_requests:100

転送速度:27.4MiB/s

max_concurrent_requests:150

転送速度:37.0Mib/s
→かなり速くなりました。37.0MiB/s≒310Mbpsであり、自宅ネットワーク環境のアップロード速度とほぼ同じ速度(329Mbps程度)のため、AWS CLIがボトルネックになっていない状態となりました。PC側のリソースにも余裕がある状態のため、「max_concurrent_requests:150」でアップロードすることに決めました。

下記コマンドで「max_concurrent_requests」を設定、設定値確認、S3へのアップロードを実行します。

aws configure set default.s3.max_concurrent_requests 150
aws configure get default.s3.max_concurrent_requests
aws s3 sync (アップロード元ディレクトリ) s3://(バケット名)/(アップロード先ディレクトリ)/ --storage-class DEEP_ARCHIVE

実際のアップロード時には、概ね30MiB/s~36.5MiB/sの範囲でアップロードされており、7~8時間で総容量849GB、総ファイル数90,646個のアップロードが完了しました。

料金の確認

Cost Explorerで、「総容量849GB、総ファイル数90,646個」を保管したバケットのタグで抽出した料金は上記です。
初期費用は5.04USDでした。

S3全体のコスト内訳は上記の通りでした。
Webブラウザからのアップロード検証、aws s3 syncコマンド高速化のための「max_concurrent_requests」検証時に作成したバケットも上記料金明細には含まれるため、「総容量849GB、総ファイル数90,646個」のみに限った正確な値ではありませんが、誤算の範囲です。

さいごに

個人利用のデータの保管先を見直すことで、月額920円のコスト削減に成功しました。
ただし、データの取り出しには12,000円程度必要であることもわかり、継続検討が必要だと思いました。

また、aws s3 syncコマンドの設定値を変更するだけでアップロードに必要な時間が大きく変わりました。
実際の業務でもボトルネックを特定し、システムを高速化していきたいと思っています。