Amazon Web Services ブログ
snow-transfer-tool により様々なサイズのファイルを AWS Snowball Edge へ移行する
このブログは 2023 年 4 月 26 日に David Byte (Principal Storage Solution Architect) と Zichong Li (Software Engineer) によって執筆された内容を日本語化したものです。原文はこちらを参照してください。
アプリケーションや IT インフラストラクチャを AWS に移行する際は、既存のデータも移行する必要があります。移行するデータは移行元の環境に応じて変化し、ファイルサイズも多岐に渡ります。移行するデータの内、1 MB 未満のファイルが全体の 1 桁のパーセンテージ以上含まれていた場合、移行のパフォーマンスは低下する可能性があります。
小さなファイルの移行が課題になる理由として、ファイルデータとメタデータの両方をシークし、読み取り、書き込みする必要があります。その結果、特に HDD などのディスクが回転するデバイスでは、メタデータ操作に起因するレイテンシにより、大きなファイルと比較して小さなファイルを移行する場合にはスループットが低下します。AWS Snowball Edge デバイスもこの影響を受けます。
この課題を解決するために AWS はドキュメントで、AWS Snowball Edge デバイスで Amazon S3 API を使用する場合、小さなファイルは tar または zip ファイルにまとめることを推奨しています。この方法を実装する際、コンプライアンスへの対応、ロギング、転送の最適化ができるスクリプトやツールを開発するためにかなりの時間を費やす必要があります。
転送プロセスの負荷を軽減し簡単に実行するために、私たちは snow-transfer-tool を開発しました。snow-transfer-tool を AWS Snowball Edge と使用することで、コンプライアンスへの対応、ロギング、転送の最適化を実現し、データ転送の効率を高めることができます。
このブログでは、具体的なユースケースを紹介しつつ、snow-transfer-tool と AWS Snowball Edge を使用してデータを移行する方法を説明します。
ソリューションの概要
snow-transfer-tool は、移行するデータのサイズ、使用するシステムの利用可能なコンピューティングリソース、利用する AWS Snowball Edge デバイスの数に応じて、移行プロセスを最適化する複数のオプションを提供しています。また、利用可能なコンピューティングリソースと特定の移行シナリオにおけるベストプラクティスに基づき、移行プロセスを調整できるようにロギングとオプションを提供します。ツールが大きなファイルを検出した場合、そのファイルは AWS Snowball Edge デバイスへ直接アップロードされます。
このツールは、データ移行に Amazon S3 API を使用する AWS Snowball Edge デバイスが 1 台または複数台使われるケースで利用できます。両方のケースにおけるツールの利用方法とその違いは、以下で説明します。スクリプトは、コマンドラインオプションまたは設定ファイルのいずれかを使用して実行できます。詳細な使用方法は、GitHub リポジトリの README.md ファイルに記載されています。また、両方のシナリオにおける概要に関するビデオも用意しています。
前提条件
以下の前提条件が必要です:
- snow-transfer-tool を実行するシステムの要件:
- 6 コア以上の物理コア
- 16 GB RAM
- 10 Gb イーサネット
- Windows 2016 以降、カーネル 3.12 以降の Linux、または MacOS 12 以降
- Python 3.6 以上
- システムにインストールされた AWS CLI (各 AWS Snowball Edge デバイスのプロファイルを設定する際に利用します)
- AWS アカウント
- AWS Snowball Edge デバイス。注文時に Amazon S3 API を利用してデータの取り込みを行うデバイスを選択します。この設定は、デバイスの出荷後に変更することはできません。
- ロック解除された AWS Snowball Edge デバイス
- AWS Snowball Edge デバイスから取得した Amazon S3 に関する認証情報
- AWS Snowball Edge へのデータ転送に HTTPS を使用する場合、ドキュメントに従って SSL 証明書を取得し、証明書を指定するように AWS_CA_Bundle 環境変数を設定します。
ウォークスルー: あらゆるサイズのデータを転送
このセクションでは、あらゆるデータ転送シナリオに必要な準備を説明します。一般的な手順は以下の通りです:
- 上記の前提条件を満たすことを確認します。
- snow-transfer-tool のダウンロードとインストールを行います。
- AWS Snowball Edge デバイスへとデータを転送できるように AWS CLI のプロファイルを設定します。
- コピーを実行します。
- オプションでパーティションファイルを作成します。
GitHub リポジトリへのリンク: https://github.com/aws-samples/snow-transfer-tool
インストールと設定
データ移行で使用するシステムに対して、以下の手順を実行する必要があります。
snow-transfer-tool のダウンロードとインストール
1. ブラウザを使用して、https://github.com/aws-samples/snow-transfer-tool に移動します。
2. Code と書かれた緑色のボタンを選択します。
3. ドロップダウンメニューで、Download Zip を選択します。
4. このファイルを、データ移行に利用するシステムで解凍します。
5. Windows の場合は、install.bat を実行します。Linux または Mac OS の場合は、install.sh を実行します。
Amazon S3 の認証情報を設定
次のステップでは、Amazon S3 API による操作を行う際に認証に必要なキーを保存することで、同一の AWS Snowball Edge デバイスへの複数のコピージョブを簡略化します。コピージョブの数が少ない場合、またはセキュリティポリシーでシステムに認証情報をテキストファイルとして保存することが禁止されている場合、aws_access_key_id および aws_secret_access_key に関するオプションフラグを使用して、これらの手順を省略することができます。
- AWS CLI のインストールが完了したら、データの移行に利用する各システムにプロファイルを作成します:
aws configure --profile {profile name}
例:
aws configure --profile snowballedge-1
- その後、この AWS Snowball Edge デバイスのアクセスキー、シークレットアクセスキー、リージョン、デフォルトの出力形式を入力します。各 AWS Snowball Edge デバイスのアクセスキーとシークレットアクセスキーは、Snowball Edge クライアントまたは AWS OpsHub 経由で取得することができます。
- データコピージョブに使用する各システムに対して、プロファイルの作成を繰り返します。
AWS Snowball Edge にデータをコピー
スクリプトを使用してデータをコピーする方法は、パーティションファイルを利用する場合と利用しない場合の 2 種類があります。パーティションファイルは、AWS Snowball Edge デバイスにアップロードする時に 1 つのアーカイブファイルとしてまとめるファイル群をリストアップしたテキストファイルです。コピーするファイル数が少ない場合 (数千件以下) の場合には、パーティションファイルなしでスクリプトを使用する方法が最も簡単です。
ファイル数が数千、数百万、あるいは数十億となる場合や、コピーするファイルの総容量が 1 台の AWS Snowball Edge デバイスの容量を超える場合には、パーティションファイルを使用します。1 台のデバイスに対して複数のコピージョブを並列化したり、複数のデバイスに同時にデータをアップロードできます。さらに、AWS Snowball Edge デバイスを注文する前から移行準備を開始できます。
注意: コマンドは、システムのコンソールから Linux の screen セッションのように再開可能なセッションで実行してください。実行しなかった場合、セッションが切断されることでコピージョブが失敗する可能性があります。
パーティションファイルを使用しない場合
次のサンプルコマンドは、/dir/with/smallfiles にあるデータを、192.168.50.51 の IP アドレスを割り当てた AWS Snowball Edge デバイスの my-snowballedge-bucket バケットに対して HTTPS プロトコルを使用して直接アップロードします。アーカイブファイルは mysmallfiles というプレフィックスで書き込まれ、Amazon S3 へのインポート時に自動展開されるように設定されています。転送ログは /my/logs/ に記録され、デバイスにアップロードされます。
snowTransfer upload --src /dir/with/smallfiles/ --bucket_name my- snowballedge-bucket --log_dir /my/logs/ --profile_name snowballedge-1 -- endpoint https://192.168.50.51:8443 --prefix_root mysmallfiles -- extract_flag true --upload_logs=true --max_files 100000 --partition_size 10GB
1 つのディレクトリ中に 4 KB のファイルが 1 億 3100 万個存在するケースに対してこのコマンドを実行したところ、すべてのファイルが AWS Snowball Edge デバイスへとアップロードするまで 32 時間弱かかりました。snow-transfer-tool を利用せずに同じ条件下でテストしたところ、アップロードが完了するまで 22 日以上かかりました。このツールを使うことで、移行に必要な時間が 94% 減少しました。様々な要因に依存する可能性があるものの、多くの小さなファイルを 1 つのアーカイブファイルにまとめてから書き込むことは一般的にスループットを向上させるはずです。
パーティションファイルを使用する場合
パーティションファイルには、AWS Snowball Edge デバイス上でアーカイブファイルとしてまとめて格納されるファイル群を記載します。パーティションファイルはアーカイブファイルを、AWS Snowball Edge が Amazon S3 へインポートする時に自動展開されるように、小さく管理しやすいチャンクに分割します。Amazon S3 へインポートされる時に自動展開するためには、アーカイブファイルのサイズと 1 つのアーカイブファイルに含まれるファイル数について特定の条件を満たす必要があります。パーティションファイルを作成することで、これらの条件を満たすとともに並列アップロードにより、AWS Snowball Edge デバイスへのデータのアップロードを最適化できます。データのアップロードに複数のシステムを用いる場合、パーティションファイルはすべてのシステムが利用可能なネットワークファイル共有システムに保存します。
パーティションファイルは、各 AWS Snowball Edge デバイスにコピーされるファイルのマニフェストとしても機能するという利点があります。デバイスが運搬時に破損したりコピージョブが失敗した場合、Amazon S3 内のすべてのオブジェクトをインベントリ化して比較する必要はなく、同じファイルを代替デバイスにコピーすることが可能です。
パーティションファイルを使用したデータのコピーには、2 つのステップがあります:
1. パーティションファイルの作成
まず最初に、パーティションファイルを作成します。これは、AWS Snowball Edge デバイスを注文する前に実施できます。この例では、210 TB のデータを移動し、3 台のデバイスに均等に分散させます:
snowTransfer gen_list --filelist_dir /my/partition-files -- partition_size 1GB --device_capacity 70TB --src /mysrcdir/smallfiles --log_dir /my/logs
このコマンドは、fileslist_dir で指定した場所に、パーティションファイルと各デバイスに対するサブディレクトリを作成します。device_capacity オプションで各デバイスに書き込まれるデータ容量の上限を 70 TB に設定します。partition_size オプションで、アップロードされる各 tar ファイルの最大サイズを 1 GB に設定します。
2. AWS Snowball Edge デバイスへとデータをコピー
次のコマンドを利用することで、fl_RKPYSJ_1.ready というパーティションファイルに記載されたファイル群を、192.168.50.51 という IP アドレスを持つ AWS Snowball Edge デバイスの my-snowballedge-bucket バケットに HTTPS プロトコルを使用してアップロードします。prefix_root オプションでプレフィックスを設定します。tar ファイルとしてアーカイブされる時、mysmallfiles というプレフィックスで書き込まれます。Amazon S3 へのインポート時には、mysmallfiles というプレフィックスの配下で元のディレクトリ構造を保持した状態で自動展開されます。転送ログは /my/logs/ に記録され、デバイスにアップロードされます。
snowTransfer upload --src /my/partition_files/device_70.00TiB_1/fl_RKPYSJ_1.ready -- bucket_name my-snowballedge-bucket --log_dir /my/logs/ --endpoint https://192.168.50.51:8443 --profile_name snowballedge1 --prefix_root mysmallfiles --extract_flag true --upload_logs true
前述の例では、最大 1 GB のアーカイブファイルに保存するファイル群をパーティションファイルへ記述しました。一方で、今回のシナリオでは 210 TB のデータを AWS Snowball Edge デバイスごと均等に 70TB に分割するため、各デバイスに対するサブディレクトリには 70,000 のパーティションファイルが存在します。workstation-1、workstation-2、workstation-3 はそれぞれ snowballedge-1、snowballedge-2、snowballedge-3 というデバイスに対するワーカーとします。各ワーカーで、各ファイルを順次アップロードするためのコマンドは次のようになります:
workstation-1
for i in {1..70000}; do snowTransfer upload --src /my/partition_files/device_70.00TiB_1/fl_RKPYSJ_$i.ready --profile_name snowballedge-1 --bucket_name my-snowballedge-bucket --log_dir /my/logs/ --endpoint https://192.168.50.51:8443 --prefix_root mysmallfiles --extract_flag true --upload_logs true;done
workstation-2
for i in {1..70000}; do snowTransfer upload --src /my/partition_files/device_70.00TiB_2/fl_RKPYSJ_$i.ready --profile_name snowballedge-2 --bucket_name my-snowballedge-bucket --log_dir /my/logs/ --endpoint https://192.168.50.52:8443 --prefix_root mysmallfiles --extract_flag true --upload_logs true;done
workstation-3
for i in {1..70000}; do snowTransfer upload --src /my/partition_files/device_70.00TiB_3/fl_RKPYSJ_$i.ready --profile_name snowballedge-3 --bucket_name my-snowballedge-bucket --log_dir /my/logs/ --endpoint https://192.168.50.53:8443 --prefix_root mysmallfiles --extract_flag true --upload_logs true;done
アップロードプロセスのさらなる最適化
環境に応じて次のオプションフラグを追加し最適化を実行することで、アップロードプロセスを高速化できる可能性があります。
--max_process
オプションフラグは、システムで十分な CPU コアと空きメモリが利用可能な場合、アップロードプロセスの数をより多く設定できます。
--partition_size
と --max_files
パラメータは、生成された tar ファイルが AWS Snowball Edge のドキュメントで定義されているインポートプロセスのベストプラクティスに従うように使用されます。さらに、--partition_size
で指定したサイズよりも大きなファイルは、マルチパートアップロードを使用して直接アップロードされるため、アップロードプロセスは最適化されます。
--compression
を true に設定すると、データが圧縮可能な場合には、デバイスに保存されるアーカイブファイルのサイズが小さくなり、アップロードに要する時間も短縮されます。
パーティションファイルを使用してデータをアップロードする場合、--ignored_path_prefix
オプションフラグを使用して、ファイルのプレフィックスから特定の文字を取り除くことができます。例えば、パーティションファイルのパスが /user/johndoe/appdata/
である場合に、このフラグを /user/johndoe
に設定すると、Amazon S3 に保存されるデータは /appdata/
に配置されます。
Linux と MacOS では、アップロード時間をさらに改善するために使用できる追加パッケージがあります。GNU Parallelツールは、1 つのプラットフォーム上でプロセスの並列実行を可能にします。これを snow-transfer-tool の upload コマンドで使用すると、次のようになります:
parallel -j 8 snowTransfer upload --src /my/testscript/partition/device_70.00TiB_3fl_RKPYSJ_{}.txt --profile_name snowballedge-1 --bucket_name my-snowballedge-bucket --log_dir /my/logs/ -- --endpoint https://192.168.50.51:8443 --prefix_root testscript1 -- --extract_flag true ::: {1..70000}
このコマンドを実行すると、8 つの並列アップロードプロセスが実行され、1 から 70,000 のパーティションファイルが 8 つのプロセスに分散されます。各アップロードプロセスは、デフォルトで最大 5 プロセスまで作成されます。1 台の AWS Snowball Edge デバイスで推奨される最大同時接続数は 30 から 40 の範囲であることに注意してください。4 KB のファイルが 1 億 3100 万個存在するテストデータセットに対してこのコマンドを使用すると、AWS Snowball Edge デバイスへのコピー時間が 32 時間弱から 12 時間弱に短縮されました。
注意: 並列性を高めると、ソースストレージデバイスを使用する他のワークロードのパフォーマンスが低下することがあります。
まとめ
snow-transfer-tool は、いくつかの方法でデータ移行を容易にします。小さなファイルをバッチ処理することでパフォーマンスを向上させます。パーティションファイルを使用することで、データコピーの並列化を可能にします。その結果、AWS Snowball Edge デバイスでデータ移行をするために必要な時間を短縮することができます。また、本ツールはパーティションファイルによりジョブの再現性を高め、ログファイルの作成により可視性とレポーティングを向上させます。ぜひビデオをご覧いただき、snow-transfer-tool をお使いいただき、適宜 GitHub を通じてフィードバックをお寄せください。さらに、コードベースを拡張する際に共有を希望される場合には、リポジトリ内の CONTRIBUTING.md ファイルの指示に従って、自由に共有してください。
翻訳はソリューションアーキテクトの佐藤真也が担当しました。