S3バッチオペレーション(コピー)とS3バッチレプリケーションを使い分ける

大量のS3オブジェクトをコピーするときに利用する方法として、S3バッチオペレーション(コピー)とS3バッチレプリケーションがある。
S3バケットの統廃合やAWSアカウント間のデータ移行などのユースケースにて利用する機能だが、あまり利用頻度が高くないこと、S3バッチレプリケーションはリリースされてまだ1年も経っていないので個人的にもあまり理解ができていなかった。
そこでS3バッチレプリケーションを中心に、S3バッチオペレーション(コピー)と比較しながらその機能について記載する。


## 機能概要
### S3バッチオペレーション(コピー)とは
[S3バッチオペレーション(コピー)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/batch-ops-copy-object.html)はS3バッチオペレーションの操作の1つで、オブジェクトのコピーを行う。
他のS3バッチオペレーションと同じく、コピー対象とするオブジェクト一覧をマニフェストとして指定することでコピーを実行する。

基本的には[インベントリ](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/configure-inventory.html)にて生成したマニフェストをそのまま利用することになるが、マニフェストファイルをどのようにカスタマイズするかによってコピー対象を柔軟に決定することができる。また、マニフェストファイルで記載したオブジェクト一覧に対する汎用的なコピー操作なので、利用するユースケースを問わず広く利用可能。


### S3バッチレプリケーションとは
[S3バッチレプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/s3-batch-replication-batch.html)はS3バッチオペレーションの操作の1つで、2022-02-08にリリースされた。

https://aws.amazon.com/jp/blogs/news/new-replicate-existing-objects-with-amazon-s3-batch-replication/

S3バッチレプリケーションはS3バッチオペレーション操作の1つだが、S3レプリケーションと合わせて利用する点が特徴の1つ。
他のバッチオペレーションとは異なり、対象オブジェクトの指定はレプリケーション設定に従い自動で判断されるのでユーザがマニフェストを指定しないという特徴もある。S3バッチオペレーションと性質が異なるためか、公式ドキュメントでも[S3バッチオペレーション操作一覧](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/batch-ops-operations.html)には掲載されているものの詳細は別の章で取り上げられていたり、S3バッチオペレーションの操作の1つでありながらS3バッチレプリケーションという特別な名称が与えられていたりと特別扱いされている。


### 機能比較
基本的には、オブジェクトをコピーするという点で同じ機能だが、主にメタデータの取り扱いとコピー先(レプリケート先)の決定方法が異なる。

メタデータについて、S3バッチレプリケーションは基本的にS3レプリケーションと同じくメタデータも含めてレプリケートされる。具体的にはタグや最終更新日など。特にユーザが値を操作できないシステムメタデータまで含めてレプリケートされる点が大きく異なる。これはS3レプリケーションと同じ挙動。タグのようにユーザが値を操作できるものはS3バッチオペレーション(コピー)でもコピー可能だが、最終更新日はS3バッチオペレーション(コピー)ではコピーを実行した時刻になる。これらの値まで含めてコピーしたいケースは多くないと思うが、すべてのメタデータをコピーしたい場合はS3バッチレプリケーションを選択する必要がある。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/UsingMetadata.html

オブジェクトのコピー先(レプリケート先)がS3レプリケーションに従い自動的に決定するので、ユーザが個別に指定できない点も制約事項としてある。コピー先の指定が複雑になることはないので、この設定が自動化されたからといって大きなメリットにはならないが、コピー先をS3レプリケーション設定にまかせることができるので重複管理不要になる。

対象オブジェクトを指定するマニフェストをユーザが作成しなくてよい点もS3バッチレプリケーションのポイント。オブジェクトの作成日時やレプリケーションステータスによる絞り込みは指定可能だが、基本的にはS3レプリケーションに従い自動的にマニフェストを作成してくれる。自動生成されたマニフェストを使えば十分だが、自分で作成したマニフェストに従いレプリケーションを実行することもできる。
AWSマネージメントコンソールにてS3バッチオペレーション画面からS3バッチレプリケーションを作成するとき、マニフェストを自動で生成するように選択できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14181/c1ef9caa-48fd-137d-2a55-2439738581cc.png)


## S3バッチレプリケーションの構築方法
実際にS3バッチレプリケーションを実行する方法として、以下の方法でS3バッチレプリケーションジョブを構築することができる。

### S3バッチオペレーションから
AWSマネージメントコンソールのS3画面にてバッチオペレーション→レプリケートを選択することでバッチレプリケーションを構築できる。
S3バッチオペレーション(コピー)もS3バッチレプリケーションも、どちらもS3バッチオペレーションであるという点でこの方法でジョブを構築するときの操作手順はほぼ同一である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14181/23036eca-a565-2bca-9d2a-0dbc30450a3e.png)

ただし、この方法でS3バッチレプリケーションを作成するとき、S3レプリケーション設定を確認するステップが存在しない。このため、意図した通りレプリケーション設定を構築できているか事前にチェックしておく必要がある。


### S3レプリケーション設定から
AWSマネージメントコンソールからレプリケーションルールを作成すると、以下の画像のようなS3バッチレプリケーションを構築するか確認がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14181/e14231e3-aca7-496e-1ad6-687b6915d0be.png)

ここで既存のオブジェクトをレプリケートするを選択すると、S3バッチレプリケーションのセットアップ画面に遷移してS3バッチレプリケーションの構築・実行をサポートしてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14181/0d5687dc-c378-c333-f465-102f03439395.png)

ただし、S3バッチオペレーション画面に遷移するか確認画面が表示されるのは新規構築したときの1回のみで、作成済のレプリケーション設定画面からS3バッチレプリケーションを作成したり、S3レプリケーション設定を修正してS3バッチオペレーションを構築することはできない。
作成済のS3レプリケーション設定からS3バッチレプリケーションを構築するには、S3バッチオペレーション画面から選択する必要がある。


### APIから
S3バッチレプリケーションを構築するためにマネジメントコンソールを利用する必要はなく、APIから設定することもできる。
例えばaws cliであれば、s3controlを利用して以下のように構築することができる。

```
$ aws s3control create-job --account-id <awsアカウントID> --operation '{"S3ReplicateObject": {}}' --role-arn <利用IAMロールARN> --priority 10 --report Enabled=false --manifest-generator='{"S3JobManifestGenerator":{"SourceBucket":"<対象S3バケットARN>", "EnableManifestOutput":false, "Filter":{"EligibleForReplication":true}}}'
{
    "JobId": "XXXX"
}
```

APIを利用するときは、特に対象オブジェクトをどのように選択するかを指定するmanifest-generatorのオプションが重要となる。
詳細は[APIドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/API_control_S3ReplicateObjectOperation.html)にはあまり記載ないが、[aws cliのヘルプ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/create-job.html)にはmanifest-generatorのオプション一覧が記載されているのでこちらが参考になる。aws cliを用いたS3バッチレプリケーションの作成方法については[こちらの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/s3-batch-replication-existing-config.html)もあわせて参考になる。


### IaCから
IaCでS3バッチレプリケーションを構築する方法はサポートされていない。
例えばterraformであればS3バッチレプリケーションだけでなく、[S3バッチオペレーションが未実装](https://github.com/hashicorp/terraform-provider-aws/issues/18538)。CloudFormationは普段あまり利用していないので詳しくないが、[CloudFormationドキュメント](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_S3.html)にも[CloudFormationロードマップ](https://github.com/aws-cloudformation/cloudformation-coverage-roadmap)にもそれらしい情報はない。

このためIaCでS3バッチレプリケーションやバッチオペレーションを管理することはできない。基本的にはマネージメントコンソールから操作し、どのようにS3バッチオペレーション(S3バッチレプリケーション)を構築・実行したか記録したい場合はaws cliから操作してそのコマンドを記録しておくくらいしか対策はない。