秋も深まってきて少しずつ肌寒い日が増えてきました、皆様いかがお過ごしでしょうか。西です。
さて早速本題です。 Amazon S3 (S3) バケット間でオブジェクトをコピーする仕組みを作りたい時、皆さんはどういった方法を採るでしょうか。 以前の記事でお伝えした通り、S3 バケット間のオブジェクトコピーには AWS DataSync (DataSync) が利用可能です。
一方、S3 にはバケット間でオブジェクトを非同期でコピーしてくれる S3 Replication 機能が存在します。 S3 バケット間でのオブジェクトコピーを考える場合、導入事例や紹介記事の情報が最も多いのはこの方法ではないでしょうか。 また、費用 / 実装コストを考慮すると「なんでわざわざ DataSync? S3 Replication でいいじゃん」となりがちです。 多くの場合、僕もそう思います。
しかし、オブジェクトコピー機構の要件や運用ニーズ次第では S3 Replication より DataSync の活用をおすすめしたい場合があります。 今日はそういったケースについてご紹介していきます。
S3 Replication
まずは例によって、登場するサービスについておさらいしていきます。
S3 Replication は S3 バケット間でオブジェクトを非同期的にコピーできるレプリケーション機能です。
公式ドキュメントより
レプリケーションを使用すると、Amazon S3 バケット間でオブジェクトを自動で非同期的にコピーできます。オブジェクトのレプリケーション用に設定されたバケットは、同じ AWS アカウント が所有することも、異なるアカウントが所有することもできます。オブジェクトは、単一または複数の送信先バケットにレプリケートできます。送信先バケットは、異なる AWS リージョン でも、ソースバケットと同じリージョン内でも配置することができます。
とあるように、クロスリージョン / アカウントであってもコピーが可能な機能です、とても便利ですね。
AWS DataSync
言わずと知れたストレージサービス間でのファイルコピーに活用可能なマネージドサービスです。 S3 や Amazon EFS をはじめとするサービスを対象に活用可能です。
ドキュメントにもあるように AWS が提供するサービス同士だけでなく、AWS とオンプレミスに構築した ストレージ用サーバ間や、AWS と他クラウドプロバイダが提供するストレージサービス間のコピーでも活用可能です。 こちらもとても便利です。
DataSync をおすすめしたいケース
では、いよいよ本題です。 DataSync の利点にはどういったものがあって、それらが活きるのはどういったケースでしょうか。 順に見ていきます。
コピーを同期的にワークフロー内で実行したい時
1 つ目はコピーを同期的にワークフロー内で実行したいケースです。
DataSync は予め作成した Task に対して、Task Execution を起動する StartTaskExecution という API を実行することで、明示的にコピー処理を開始することができます。 そのため API を起動することで DataSync のファイルコピーを一連のワークフロー中の処理として組み込むことができます。 S3 Replication の場合は S3 バケットへの PutObject 等で Replication が開始されますが、即座に処理が開始されるわけではなく最初は待機状態から始まり、順次非同期的にコピー処理が開始される仕様となっています。
こういった特性から、明確にコピーされ始めた時間や形跡を追跡したい場合は難しくなるかと思います。 ですので求められる追跡性や厳密性にも寄りますが、ワークフローでのファイルのコピー処理を同期的に実行したい場合は DataSync の性質が活きるのではないでしょうか。
コピー状況や詳細をウォッチしたいとき
2 つ目はコピー速度や進捗、ログを含めた詳細な状況をウォッチしたいケースです。
一部繰り返しになりますが、DataSync においてコピー処理は Task という単位で管理されており、Task 単位の状態は管理画面から把握することができます。 例えば DataSync 管理画面では以下のようにそれぞれの Task が一覧で表示されており、利用可能 (AVAILABLE) か実行中 (RUNNING) かを即座に確認できます。
今回はサンプル用の画面のため、雑な名前をつけていますが、Task 名にコピーに関連する情報を載せておく等で、より確認や把握をしやすくなるかと思います。 S3 Replication でのコピーの場合、進捗はオブジェクト単位の画面での確認となるため、対象オブジェクトの画面まで潜る必要があります。 階層が深くなると確認が大変になってくることや、コピー対象の数が多くなると手間が増えてくるのではないでしょうか。
加えて、DataSync では各 Task ごとにコピーの実行 (Task Execution) の履歴を確認することができる点や、CloudWatch にログを出力することができるのも嬉しい点です。 これによって、どの程度の速度で転送ができてどの程度の時間がかかったのか、失敗した際にどのファイルのコピーができていないのか、等の詳細情報を追跡可能です。
コピー処理でファイル検証などの厳格性が要求されるとき
3 つ目はコピー処理でファイル検証などの厳格性が要求されるケースです。
DataSync ではファイルコピー処理の前後で対象ファイルに差が生じていないかの検証までを担ってくれます。 取り扱いに厳格性が求められるファイルを操作するケースであっても採用を検討できるのではないかと思います。 また、こうした検証処理をマネージドサービス側で実行してくれるのもとても嬉しいポイントではないでしょうか。 検証結果は転送と同じく以下のような形式のログで確認可能です。
例えば「ワークフローの中で直接 S3 API を呼び出せばいいのではないか」というケースでも、こういった検証までをケアせねばならない要件があれば実装コストもかかってくるかと思います。 DataSync であればそういった懸念をマネージドサービス側にお任せすることが可能です。
おわりに
今回は S3 バケット間でのオブジェクトコピーする仕組みに DataSync の採用が検討できるケースについてご紹介しました。 個人的に DataSync の嬉しい点は取り扱っているコピー情報の見えやすさと明確に処理を開始できる明示性で、これらの点はシステムの開発や運用においてとても重要なポイントかと思います。 なかなか情報の少ないサービスですが、皆様の DataSync 活用とサービス選定の一助となれば嬉しいです。