- 公開日
- 最終更新日
バージョニングが無効になっているS3バケットのバッチレプリケーション
この記事を共有する
目次
みなさんこんにちは!
サポートGの山内です!
先日、業務にてバージョニングが無効になっているS3バケットのバッチレプリケーションを実施しました。
手順が意外と複雑だったため紹介します。
前提
以下の設定やリソースは、設定済み、構築済みとします。
ロールの設定は公式ガイドを参考に作成いただければと思います。
- レプリケーション先バケット
- レプリケーション設定
- レプリケーション用ロール
S3バッチレプリケーションについて
以下のようにバージョニング有効化前にアップロードしたオブジェクトと、
有効化後にアップロードしたオブジェクトがあるとします。
バージョニング有効化前のオブジェクトは、バージョンIDがnullとなっています。
バッチレプリケーションでは、バージョンIDがnullのオブジェクトはレプリケーションの対象にならないため、バージョンIDの指定が必要です。

大まかな手順
- S3インベントリ設定を有効化し、インベントリリストファイルを生成
- インベントリリストファイルを編集し、バージョンIDを記載
- バッチレプリケーションを実施
バケットのオブジェクトの一覧CSVファイルを作成し、それを基にバッチレプリケーションを実施しますが、
オブジェクトの一覧CSVファイルを取得するために、S3のインベントリを使用します。
CLIを使ったオブジェクトの一覧取得でもいいと思いますが、オブジェクト数が数千個以上ある場合は、
S3インベントリを使用した方が、適切なサイズでCSVファイルを分割してくれるのでおすすめです。
取得したインベントリリストファイルにバージョンIDを記載し、バッチレプリケーションが実行できるようにします。
実際にやってみる
S3 インベントリ設定
バッチレプリケーションの対象オブジェクトがあるバケットにて、インベントリ設定を行います。
管理タブから「インベントリ設定を作成」をクリックすることでインベントリの設定ができます。
インベントリスコープにてプレフィックスの指定ができ、
インベントリリストファイルにて出力するオブジェクトの細かな指定ができます。
今回は特に指定しません。

次にインベントリリストファイルの保存先バケットを指定します。
ここで指定したバケットに、バケットポリシーを自動で設定してくれます。

頻度は日別、出力形式はCSV、ステータスは有効にします。
頻度の項目にも記載があるように、インベントリリストファイルの生成は最大48時間かかります。

今回は暗号化の設定は行いません。

最後に「追加のメタデータ」の設定です。
バッチレプリケーションの実施の場合は特に有効化は不要です。

ここまで設定したら「作成」をクリックして、インベントリ設定を作成します。
うまくいくと、インベントリファイル保管先バケットにインベントリリストファイルが生成されています。

生成先フォルダーは以下の通りです。
インベントリリストファイルの場所
保管先バケット
- バケット名
- data
- ★ここです
- hive
- マニフェストファイル保管フォルダー
インベントリリストファイルの確認
生成されたインベントリリストファイルを確認します。
3列目がバージョンIDのため、バージョニング有効化前のオブジェクトは空となっているのが分かります。

ファイルではこのような形でオブジェクトの情報が記載されています。
| 列 | データ |
|---|---|
| 1列目 | バケット名 |
| 2列目 | オブジェクト名 |
| 3列目 | バージョンID |
| 4列目 | is_latest |
| 5列目 | is_delete_marker |
インベントリリストファイルの編集
空欄のバージョンIDに「null」を記載し、4列目、5列目の記載を削除します。
バージョンIDに記載する文字は「null」でなくともなんでも大丈夫です。

編集したCSVファイルをアップロードします。
アップロード先はどこでも大丈夫ですが、私はインベントリファイルが保管されているフォルダにしています。

バッチレプリケーションジョブを作成する際に必要のため、ARNとETagを控えておいてください。

バッチレプリケーションの実行
以下のコマンドを実行し、バッチレプリケーション用のジョブを作成します。
コマンド内にレポート送信先の設定があります。
レポートにはバッチレプリケーションジョブの実行結果が記載されます。
ここを押すと展開します
aws s3control create-job \
--account-id アカウントID \
--operation '{"S3ReplicateObject":{}}' \
--report '{
"Bucket":"レポート保管先バケットARN",
"Prefix":"batch-replication-report(レポート保管の際に設定するプレフィックス変更しなくてもいい)",
"Format":"Report_CSV_20180820",
"Enabled":true,
"ReportScope":"AllTasks"
}' \
--manifest '{
"Spec":{
"Format":"S3BatchOperations_CSV_20180820",
"Fields":["Bucket","Key","VersionId"]
},
"Location":{
"ObjectArn":"csvファイルのARN",
"ETag":"csvファイルのETag"
}
}' \
--priority 1 \
--role-arn 使用するRoleのARN \
--no-confirmation-required \
--region バッチレプリケーション元バケットのリージョン
コマンドを実行してみます。
コマンドが長いのでスクリプトとして実行しています。
成功するとジョブidがプロンプトに返ってきます。

マネジメントコンソールを確認すると、レプリケーションジョブが自動で実行されています。

少し待つと完了しました。
レプリケーション先バケットにもオブジェクトがあることが確認できました。

まとめ
バージョニングが無効だったバケットに対するバッチレプリケーションの手順を理解できたので、良かったと思います。
こういった事象に遭遇して困っている方のためになれたらうれしいです。
この記事は私が書きました
山内 宏紀
記事一覧CloudFormationが好きです。 使っているギターはSGです。