こんにちは。インフラチームの倉橋です。
先日、S3間での大量オブジェクトコピーを AWS DataSync を用いて実施しました。
それはそれは素晴らしい体験でしたので共有したく記事にしました。
- なにがしたかったか
- S3バケット間コピー方法の決定
- AWS DataSync とは
- AWS DataSync 料金
- AWS DataSync を使用してバケット間コピーを実現
- AWS DataSyncを使ってみて
なにがしたかったか
S3に保存されている「約300GB」のオブジェクトを同一アカウント / 同一リージョン の別S3バケットにコピーしたい。
それだけです。
とはいえ「約300GB」です。舐めてかかっては痛い目に合うかもしれません。
ですので、まずはS3バケット間コピーの方法にはどのようなものがあるか確認していきました。
S3バケット間コピー方法の決定
さすがはAWS様、すでにナレッジが共有されています。
提案内容を簡単に表にしてまとめてみました。
工数は自身でざっくり見積もったものとなりますので参考程度でお願いします。
工数 | 概要 | 詳細 |
---|---|---|
極小 | AWS DataSync を使用する | DataSyncでコピー元コピー先を指定したタスクを作成しコピーする方法 |
小 | レプリケーションを使用する | S3の レプリケーション機能 を使用してコピーする方法ただし、レプリケーション機能設定後に新規追加されたオブジェクトのみがコピーされる事に注意が必要 既存オブジェクトはコピー対象外 |
中 | AWS コマンドラインインターフェイス (AWS CLI) を使用して並列アップロードを実行する | --exclude および --include を使用して多くのアップロードスレッドを作成しコピーする方法並列化して処理を高速化 |
中 | AWS SDK を使用する | 何かしらの言語でアプリケーションを作成しコピーする方法 |
中 | Amazon S3 バッチオペレーションを使用する | S3の バッチオペレーション機能 を使用してコピーする方法マニフェストファイルが必要でマニフェストに記載されているオブジェクトが処理対象となる |
大 | Amazon EMR で S3DistCp を使用する | EMRの S3DistCp を使用して並列コピーする方法EMR + EC2を起動するので目的に対してコストが高い上にEMRは他の方法に比べ格段に構築が難しい |
上記から「レプリケーションを使用する」以外で今回の目的を達成できそうです。
そして、その中で一番「工数」が小さくすむ方法が AWS DataSync
となりました。
AWS DataSync
を選択した具体的な 理由は以下となります。
- 完全フルマネージドでありAWSリソース構築が不要
- S3間コピーでは
スクリプト
またはアプリケーション
の作成が不要 マニフェストファイル
のような事前準備が不要新規オブジェクト
だけでなく既存オブジェクト
もコピー対象に含まれる- 料金が明瞭(
ギガバイト (GB) あたり 0.0125USD
)
AWS DataSync とは
コピー方法が決まったので、 AWS DataSync
について簡単に確認しておきます。
以下はAWSの「よくある質問」より抜粋です。
Q: AWS DataSync とは何ですか?
A: AWS DataSync は、オンプレミスストレージシステムと AWS ストレージサービス間で、および AWS ストレージサービス間での大規模なデータのコピーを簡素化、自動化、および高速化するオンラインデータ転送サービスです。
以下の図からS3以外にも複数のケースに対応していることがわかります。

AWS DataSync 料金
気になる料金についても見ていきます。
AWS DataSync 自体の料金は非常にシンプルで、コピーされたデータGBあたりに料金がかかります。
本記事執筆現在の東京リージョンであれば「ギガバイト (GB) あたりの 0.0125USD」となっており、
「300GB」のコピーであれば 300GB * 0.0125USD = 3.75USD となります。
上記料金に加えてS3の「リクエストとデータ取り出し」料金がかかります。
今回行った「300GB」のコピーであれば S3料金 は最終的に 100USD ほどかかっています。
S3料金の内訳は、
「PUT、COPY、POST、または LIST リクエストの数」に $85 程度
「GET および他のすべての non-Tier1 リクエストの数」に $15 程度
となります。
他には、リージョン間でのコピーとなった場合、データ転送料金もかかってきます。
このように非常に大きなデータをコピーする場合、それなりに料金がかかりますので事前に試算することをオススメします。
AWS DataSync を使用してバケット間コピーを実現
ではでは、早速 AWS DataSync
を使用してコピーを実現していきましょう。
必要なステップは以下 5ステップ になります。
- IAMロール作成
- コピー元バケットのLocation作成
- コピー先バケットのLocation作成
- タスク作成
- タスク実行
1. IAMロール作成
AWS DataSync にS3アクセス権限を与えるためのIAMロールを作成します。
今回は以下のような権限と信頼関係を付与して作成します。
権限付与で気をつけるべき点は「S3マルチアップロード」の権限を与えることです。
「S3マルチアップロード」が使用されることで、S3のパフォーマンスおよびコストに差が出ます。
今回は AmazonS3FullAccess
を付与しマルチアップロードにも対応します。
- 権限
AmazonS3FullAccess
- 信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "datasync.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
権限、マルチアップロードについて詳しくは以下公式ドキュメントを参照いただければと思います。
2. コピー元バケットのLocationを作成
まずはコピー元バケット用の Location を作成します。
AWS DataSync から Locations
を選択し作成します。
対象S3バケット、転送先ストレージクラス、必要に応じてパスを指定してます。
そしてIAMロールは上記手順で作成したロールを選択し、Locationを作成します。
3. コピー先バケットのLocationを作成
コピー元と同様に、コピー先バケット用の Location も作成します。
今回は、S3バケットの指定以外すべて同内容で作成しました。
4. タスクを作成
では次にタスクを作成します。
AWS DataSync で タスク作成を選択します。
次に、先程作成したコピー元の Location を選択します。
次に、こちらも先程作成したコピー先の Location を選択します。
次に、タスクの各種オプションを入力していきます。
今回 Task logging
以外の項目は全てデフォルト値で作成します。
Task logging
はログ出力設定になるのですが、 Log level
を Do not send logs to CloudWatch
に設定しログ出力無しにします。
各種オプションについては以下ドキュメントを参照ください。
5. タスク実行
ここまで設定できましたら残すはタスクの実行のみです。
上記で作成したタスクを開き「Start」から「Start with defaults」を選択します。
タスクの実行に成功すると、タスク実行履歴からタスク状況を確認することができます。
以上のように「S3バケット間」でのオブジェクトコピーを「ノーコード」で簡単に実現することができました。
AWS DataSyncを使ってみて
タイトルの通り本当に「あらやだ!簡単!」です。
今までせっせとスクリプトを書いていたのは何だったんだ?となっています。
費用対効果は抜群であったと実感しています。
AWSではサービスとして運用を助けてくれるものも多数ありますので、
引き続き色々なサービスを使用してみたいと思いました。