エムオーテックス株式会社が運営するテックブログです。

AWS DataSyncでのS3大量オブジェクトバケット間コピーが「あらやだ!簡単!」だったので共有したい

こんにちは。インフラチームの倉橋です。

先日、S3間での大量オブジェクトコピーを AWS DataSync を用いて実施しました。

それはそれは素晴らしい体験でしたので共有したく記事にしました。

なにがしたかったか

S3に保存されている「約300GB」のオブジェクトを同一アカウント / 同一リージョン の別S3バケットにコピーしたい。

それだけです。

とはいえ「約300GB」です。舐めてかかっては痛い目に合うかもしれません。

ですので、まずはS3バケット間コピーの方法にはどのようなものがあるか確認していきました。

S3バケット間コピー方法の決定

さすがはAWS様、すでにナレッジが共有されています。

aws.amazon.com

提案内容を簡単に表にしてまとめてみました。

工数は自身でざっくり見積もったものとなりますので参考程度でお願いします。

工数 概要 詳細
極小 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 ストレージサービス間での大規模なデータのコピーを簡素化、自動化、および高速化するオンラインデータ転送サービスです。

aws.amazon.com

以下の図からS3以外にも複数のケースに対応していることがわかります。

aws.amazon.com

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.amazon.com

aws.amazon.com

AWS DataSync を使用してバケット間コピーを実現

ではでは、早速 AWS DataSync を使用してコピーを実現していきましょう。

必要なステップは以下 5ステップ になります。

  1. IAMロール作成
  2. コピー元バケットのLocation作成
  3. コピー先バケットのLocation作成
  4. タスク作成
  5. タスク実行

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"
        }
    ]
}

権限、マルチアップロードについて詳しくは以下公式ドキュメントを参照いただければと思います。

docs.aws.amazon.com

aws.amazon.com

2. コピー元バケットのLocationを作成

まずはコピー元バケット用の Location を作成します。

AWS DataSync から Locations を選択し作成します。

対象S3バケット、転送先ストレージクラス、必要に応じてパスを指定してます。

そしてIAMロールは上記手順で作成したロールを選択し、Locationを作成します。

3. コピー先バケットのLocationを作成

コピー元と同様に、コピー先バケット用の Location も作成します。

今回は、S3バケットの指定以外すべて同内容で作成しました。

4. タスクを作成

では次にタスクを作成します。

AWS DataSync で タスク作成を選択します。

次に、先程作成したコピー元の Location を選択します。

次に、こちらも先程作成したコピー先の Location を選択します。

次に、タスクの各種オプションを入力していきます。

今回 Task logging 以外の項目は全てデフォルト値で作成します。

Task logging はログ出力設定になるのですが、 Log levelDo not send logs to CloudWatch に設定しログ出力無しにします。

各種オプションについては以下ドキュメントを参照ください。

AWS DataSync転送する内容の設定 - AWS DataSync

5. タスク実行

ここまで設定できましたら残すはタスクの実行のみです。

上記で作成したタスクを開き「Start」から「Start with defaults」を選択します。

タスクの実行に成功すると、タスク実行履歴からタスク状況を確認することができます。

以上のように「S3バケット間」でのオブジェクトコピーを「ノーコード」で簡単に実現することができました。

AWS DataSyncを使ってみて

タイトルの通り本当に「あらやだ!簡単!」です。

今までせっせとスクリプトを書いていたのは何だったんだ?となっています。

費用対効果は抜群であったと実感しています。

AWSではサービスとして運用を助けてくれるものも多数ありますので、

引き続き色々なサービスを使用してみたいと思いました。