こんにちは、クラウドインテグレーション2部 技術1課 宮形 です。
先日、異なるAWSアカウント間でS3バケット既存オブジェクトをデータ移行することがありました。 移行方法として、AWSより今年リリースされた新機能「S3バッチレプリケーション」を利用しましたので、本BLOGでご紹介したいと思います。
S3バケットのデータ移行方法
S3バケットのデータ移行を行う場合、CLIのS3バケット間コピーで対応していたケースがありました。
別の AWS アカウントから Amazon S3 オブジェクトをコピーする
この方法のデメリットとして、CLIを実行するサーバーまたはEC2を用意して 移行元S3バケット、移行先S3バケットの両方アクセスできる権限付与が必要になる点です。 また、単純コピーではバージョンID、作成時間などのメタデータは移行できませんでした。
他の方法には、S3バケットのレプリケーション機能があります。こちらのデメリットは、レプリケーションを設定した後から 追加、更新されたオブジェクトのみが対象となるため、過去の既存オブジェクトの移行には利用できないことでした。
今回利用する「S3 バッチレプリケーション」であれば、この両方デメリットを解決することが出来ます。 2022 年 2 月 8 日(米国時間)から利用可能となった機能です。設定はすべてAWSマネージメントコンソールから行うことができます。
前提条件
移行元S3バケット、移行先S3バケットの両方で「バージョニング」を有効にする必要があります。 バージョニングによってデータ肥大しないよう、併せて「ライフサイクルポリシー」の設定も検討します。
移行元と移行先ではS3バケット名は同じにできません。 全リージョン、全アカウントでS3バケット名は一意である必要があります。
設定手順
先に移行先S3バケットから設定しました。
移行先S3バケット
S3バケットの作成
あらかじめ移行先S3バケットを作成しておきます。
移行先の AWSマネージメントコンソールより、Amazon S3 コンソールへ推移します。左メニューより「バケット」-「バケットを作成」をクリックします。
任意のバケット名(本例では miyagata-test-after)を設定します。他はデフォルトとして、画面下へスクロールして「バケットを作成」をクリックします。
バージョニングの有効化
作成したS3バケットの「プロパティ」タブより「バケットのバージョニング」「編集」をクリックします。
「バケットのバージョニングを編集」の画面が表示されます。「バケットのバージョニング:有効にする」を選択し、「変更の保存」をクリックします。
本BLOGでは記載しませんが、バージョニング有効にした場合は「ライフサイクルポリシー」の設定もご検討ください。
レプリケーション受入れ設定
作成したS3バケットの「管理」タブより「レプリケーションルール」セクションの「アクション」-「レプリケートされたオブジェクトの受信」をクリックします。
「レプリケートされたオブジェクトの受信」の画面が表示されます。「ソースバケットアカウント設定」に、移行元AWSアカウントIDを入力します。「ポリシーの生成」をクリックします。
「バケットポリシーの表示」をクリックして展開します。「オブジェクト所有者を送信先バケット所有者に変更するアクセス許可を含める:有効」とします。JSONに "s3:ObjectOwnerOverrideToBucketOwner" が追加されます。「設定の適用」をクリックします。
移行先S3バケットの設定作業は終了です。続けて移行元S3バケットの設定作業を行います。
移行元S3バケット
バージョニングの有効化
移行先の AWSマネージメントコンソールより、Amazon S3 コンソールへ推移します。 移行元S3バケットでバージョニングの有効化を行います。手順は移行先S3バケットの場合と同じですので割愛します。
レプリケーションの有効化
移行元S3バケットの「管理」タブより「レプリケーションルール」セクションの「レプリケーションルールを作成」をクリックします。
「レプリケーションルールを作成」の画面が表示されます。「レプリケーションルール名」に任意の名前を設定します。「ステータス:有効」とします。
「ソースバケット」-「ルールスコープを選択」は「バケット内のすべてのオブジェクトに適用」を選択します。「 送信先:別のアカウントのバケットを指定する」を選択、「アカウントID」に移行先S3バケットのAWSアカウントIDを指定、「バケット名」に先ほど作成した移行先S3バケットの名前(本例では miyagata-test-after)を設定、「オブジェクト所有者を送信先バケット所有者に変更:有効」とします。
「IAMロール」セクションでは「既存のIAMロールから選択」を選択し、「IAMロール:新しいロールの作成」を選択します。 画面下部へスクロールして「保存」をクリックします。
「既存のオブジェクトをレプリケートしますか?」が表示されます。「はい」を選択し、「送信」をクリックします。
「完了レポート」の画面が表示されます。設定は任意ですが、必要応じて「完了レポートの生成」を有効にします。その場合、「完了レポートの範囲:すべてのタスク」とし、「完了レポートの送信先へのパス」に別のS3バケットを指定します。 「アクセス許可」セクションでは「既存のIAMロールから選択」を選択し、「保存」をクリックします。
これ以降、S3バッチレプリケーションの動作が開始され、順次既存オブジェクトが移行されます。 「バッチオペレーション」の画面に推移します。設定直後は「ステータス:準備中」の表示となります。
レプリケーション処理が行われ、「もうすぐ完了します」となり「完了済み」となります。
データ移行の確認
移行先S3バケットを確認すると、オブジェクトが入っていることが確認できます。この時点でレプリケーションが維持されているので、移行元S3バケットでの追加・更新はレプリケーションされます。削除マーカーは「削除マーカーのレプリケーション:有効」にするとレプリケーションされます。
レプリケーションの無効化
データ移行を完了するため、レプリケーションを無効かする必要があります。移行元S3バケット側でレプリケーションルールを削除します。これ以降はレプリケーションされないので、この操作をもって最終データ移行となります。
今後、データ移行の予定がなければ、移行先S3バケットのバケットポリシーを「削除」または「編集」して、移行元AWSアカウントからのレプリケーションを受け付けしないようにします。
まとめ
Amazon S3 バッチレプリケーションを利用することで、異なるAWSアカウントでのS3バケットのデータ移行が簡単に行えることが確認できました。バージョニングを有効が前提である点、注意が必要です。
S3バケットのデータ量やオブジェクト数が多くなると、既存オブジェクトのレプリケートにどれほど時間要するか気になるところです。実績を増やして、お客様への提案が円滑に行えるようにしていきたいと思いました。