はじめに
前回、「ValkeyスナップショットをS3クロスアカウントレプリケーションして使用する。」でS3のバッチオペレーション機能を使用して別のアカウントのS3にクロスアカウントレプリケーションを行いましたが、レプリケーション以外にコピー機能もあるようなので、改めてファイル転送系機能のクロスアカウント転送を試してみようと思います。
バッチオペレーションについて
S3には「バッチオペレーション」という機能があり、S3のファイルコピーやタグ置換、レプリケーション等を1回限りのワンショットで実行してくれる機能となります。
現状以下のようなオペレーションが可能なようです。
| オペレーション | 内容 |
|---|---|
| コピー | 指定した送信先にコピー |
| 復元 | アーカイブされた復元リクエストを開始 |
| レプリケート | レプリケーションルールの送信先に指定ファイルをレプリケーション |
| データ処理・Lambda呼び出し | Lambda呼び出し |
| タグ・オブジェクトタグ置き換え | オブジェクトタグ置き換え |
| タグ・オブジェクトタグ削除 | オブジェクトタグ削除 |
| データ保護・チェックサム計算 | オブジェクトのチェックサム計算し、レポートに出力 |
| データ保護・暗号化更新 | オブジェクトの暗号化タイプ更新 |
| データ保護・ObjectLock保持 | 一定期間オブジェクト削除や上書き禁止 |
| データ保護・ObjectLockリーガルホールド | リーガルホールド解除までオブジェクト削除や上書き禁止 |
| アクセス許可・ACL置き換え | オブジェクトのACL置き換え |
便利な機能とはなりますが、S3サービスとは異なるS3バッチサービスとして動作するため、別途IAMロールの付与やバケットポリシーの設定が必要となります。
今回はバッチオペレーション機能のうち、「コピー」機能と「レプリケート」機能を試してみようと思います。
コピー機能とレプリケート機能の違い
コピー機能、レプリケート機能、どちらもS3バケット間でファイル転送する機能となりますが、レプリケート機能はレプリケーションルールの設定も必要となるのに対し、コピー機能は不要となります。
そのため、レプリケーションルールが不要な分、コピー機能のほうが手軽かと思いますが、機能により転送の起点が異なるため、要件によって使い分けが必要となります。
以下、コピー機能、レプリケート機能の主な違いとなります。
| 比較項目 | コピー機能 | レプリケート機能 |
|---|---|---|
| レプリケーションルールの設定 | 不要 | 必要 |
| 転送方式 | プル(ダウンロード)型 | プッシュ(アップロード)型 |
| 転送元のファイルに更新等あった場合の動作 | 検知しないため何もしない | レプリケーションルールに従って転送 |
「転送方式」はバッチオペレーションを作成・実行するアカウントを基準とした方式の違いとなり、クロスアカウントで転送する場合、コピー機能は転送元アカウントとバッチオペレーション作成・実行するアカウントが別々になるのに対し、レプリケーション機能は転送元アカウントとバッチオペレーション作成・実行するアカウントが同一となります。
コピー機能とレプリケート機能の設定
以下よりバッチオペレーションのコピー機能とレプリケート機能の設定について説明していきます。
なお、前回と設定方法が被る部分も多いため、設定画面への画面遷移等の詳細は前回を参考にしてください。
事前準備
バッチオペレーションによるクロスアカウントコピー・レプリケートを試すため、それぞれのアカウントに以下のようなS3バケットの作成と必要な設定を行います。
以降、以下のバケット名で説明を進めるため、バケット名については環境ごとに読み替えてください。
| 設定項目 | アカウントA | アカウントB |
|---|---|---|
| バケット名 | batch-test-s3-account-a | batch-test-s3-account-b |
| バージョニング | 有効 | 有効 |
| バケットポリシー | 無し | ※後述のバケットポリシー |
バケットのバージョニングはレプリケーションする際にどちらのアカウントでも必要となるため、両アカウントで有効化しておきます。
尚、バッチオペレーションの作成・実行は、アカウントAで行う前提で進めていきます。
コピー機能によるクロスアカウント転送設定
バッチオペレーションのコピー機能は以下のようなプル(ダウンロード)型の転送方式となります。
プル型の機能となることから、レプリケーション機能のようにファイル更新等をトリガーとした転送はできません。
そのため、もし定期的にコピー機能を実行したい場合はEventBridge等と組み合わせて定期的にバッチオペレーションを実行する必要があります。
以下よりコピー機能実行に必要となる設定を記載します。
- 【アカウントA】コピー機能用IAMポリシーの作成
- 【アカウントA】コピー機能用IAMロールの作成
- 【アカウントB】コピー機能用バケットポリシー設定
- 【アカウントA】テスト用ファイルアップロード
- 【アカウントA】バッチオペレーション・コピーの実行
【アカウントA】コピー機能用IAMポリシーの作成
IAMポリシー作成画面より、バッチオペレーションのコピー機能用のIAMポリシーを以下のように設定します。
IAMポリシー名は任意の名前を指定し、アカウントIDやS3バケット名は環境により読み替えて作成してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetReplicationConfiguration",
"s3:PutInventoryConfiguration"
],
"Resource": "arn:aws:s3:::batch-test-s3-account-b",
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "[アカウントBのアカウントID]"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectAcl",
"s3:GetObjectVersionAcl",
"s3:GetObjectTagging",
"s3:GetObjectVersionTagging",
"s3express:CreateSession"
],
"Resource": [
"arn:aws:s3:::batch-test-s3-account-b",
"arn:aws:s3:::batch-test-s3-account-b/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "[アカウントBのアカウントID]"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging",
"s3:PutObjectLegalHold",
"s3:PutObjectRetention",
"s3express:CreateSession",
"s3:GetBucketObjectLockConfiguration"
],
"Resource": [
"arn:aws:s3:::batch-test-s3-account-a",
"arn:aws:s3:::batch-test-s3-account-a/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "[アカウントAのアカウントID]"
}
}
},
{
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Effect": "Allow",
"Condition": {
"StringLike": {
"kms:ViaService": "s3.ap-northeast-1.amazonaws.com",
"kms:EncryptionContext:aws:s3:arn": [
"arn:aws:s3:::batch-test-s3-account-b",
"arn:aws:s3:::batch-test-s3-account-a",
"arn:aws:s3:::batch-test-s3-account-b/*",
"arn:aws:s3:::batch-test-s3-account-a/*"
]
}
},
"Resource": "*"
}
]
}
【アカウントA】コピー機能用IAMロールの作成
IAMロール作成画面より、バッチオペレーションのコピー機能用のIAMロールを以下のように設定します。
IAMロール名は任意の名前を指定し、アカウントIDやS3バケット名は環境により読み替えて作成してください。
また、IAMロール名は後ほど使用するため、名前を控えておいてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BatchOperationsCopy",
"Effect": "Allow",
"Principal": {
"Service": [
"batchoperations.s3.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
IAMロールにアタッチするIAMポリシーは先程作成したコピー機能用IAMポリシーをアタッチしてください。
【アカウントB】コピー機能用バケットポリシー設定
アカウントAのバッチオペレーション機能からアカウントBのS3バケットにアクセス出来るようにするため、アカウントBのS3バケットのバケットポリシーに以下の設定を行います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BatchOperationsCopy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[アカウントAのアカウントID]:role/[アカウントAのIAMロール]"
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectAcl",
"s3:GetObjectTagging",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:PutInventoryConfiguration"
],
"Resource": [
"arn:aws:s3:::batch-test-s3-account-b",
"arn:aws:s3:::batch-test-s3-account-b/*"
]
}
]
}
IAMロール名は先程アカウントAで作成したコピー機能用IAMロールを指定します。
【アカウントB】テスト用ファイルアップロード
コピー機能用の準備が出来たため、アカウントBのS3バケット(batch-test-s3-account-b)に適当なファイルをアップロードしておきます。
【アカウントA】バッチオペレーション・コピーの実行
テスト用ファイルアップロードが出来たら、バッチオペレーションのコピー機能を使用して、アカウントBのS3バケットからアカウントAのS3バケットにコピーできるかを確認します。
S3ダッシュボード画面の「バッチオペレーション」から、以下のジョブ設定を行い実行します。
| 項目 | 設定 | 備考 |
|---|---|---|
| オブジェクトリスト | フィルターを指定してオブジェクトリストを生成 | コピーする場合に選択 |
| ソースアカウント | 別のAWSアカウント | ー |
| ソース | s3://batch-test-s3-account-b | アカウントBの転送元S3バケット&プレフィックスを指定 |
| 次を含むオブジェクトキー | 空欄 | レプリケーションルールの条件に従う |
| 次で終わるオブジェクトキー | 空欄 | レプリケーションルールの条件に従う |
| オブジェクトメタデータフィルター | 空欄 | レプリケーションルールの条件に従う |
| オペレーション | コピー | ー |
| 送信先バケットタイプ | 汎用 | ー |
| 送信先 | s3://batch-test-s3-account-a | アカウントAの転送先S3バケット&プレフィックスを指定 |
| コピーの設定 | APIのデフォルト設定を使用 | 詳細設定をする場合は「設定を指定」を指定 |
| 説明 | ※適当な説明を記載 | 表示名となるためわかりやすい名前を指定 |
| 優先順位 | 10 | ※デフォルトのままとする |
| ジョブの実行方法を選択 | 準備ができたら実行 | 今回は即時実行とする |
| オブジェクトリストをマニフェストファイルとして保存 | チェックなし | 今回はマニフェストファイルを保存しない |
| 完了レポートの生成 | チェックなし | 今回はテストなので生成しない |
| IAMロールの選択方法 | 既存のIAMロールから選択 | ー |
| IAMロール | ※コピー機能用IAMロール | コピー機能用IAMロールを選択 |
問題なければジョブの履歴より、「%完了」の結果が100%、「失敗した合計 (率)」が0%となり、アカウントAのS3バケット(batch-test-s3-account-a)にファイルが転送されていれば完了です。
レプリケート機能によるクロスアカウント転送設定
バッチオペレーションのレプリケート機能は以下のようなプッシュ(アップロード)型の転送方式となります
コピー機能とは異なり、レプリケーションルールが有効であれば、転送元S3バケットのファイル操作を行った時点で、ルールに従って転送先にレプリケーションされるため、バッチオペレーションによるレプリケートを行うケースは多くありません。
バッチオペレーションでのレプリケートを使用するケースとしては、レプリケーションルールを一時的に無効化していた期間に更新されたファイルをレプリケーションする場合や、レプリケーションルールを作成する前に格納されていたファイルをレプリケーションするような場合に使用します。
設定は、前回も紹介しておりますが、前回はバッチオペレーションで使用する設定以外も含まれていたため、改めて以下よりレプリケート機能実行に必要となる設定を記載します。
- 【アカウントA】レプリケート機能用IAMポリシーの作成
- 【アカウントA】レプリケート機能用IAMロールの作成
- 【アカウントB】レプリケート機能用バケットポリシー設定
- 【アカウントA】S3レプリケーションルールの作成
- 【アカウントA】テスト用ファイルアップロードとレプリケーションルール有効化
- 【アカウントA】バッチオペレーション・レプリケートの実行
【アカウントA】レプリケート機能用IAMポリシーの作成
IAMポリシー作成画面より、レプリケーションルールとバッチオペレーションのレプリケート機能用のIAMポリシーを以下のように設定します。
IAMポリシー名は任意の名前を指定し、アカウントIDやS3バケット名は環境により読み替えて作成してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetReplicationConfiguration",
"s3:PutInventoryConfiguration"
],
"Resource": "arn:aws:s3:::batch-test-s3-account-a",
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "[アカウントAのアカウントID]"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:InitiateReplication",
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:GetObjectRetention",
"s3:GetObjectLegalHold"
],
"Resource": [
"arn:aws:s3:::batch-test-s3-account-a",
"arn:aws:s3:::batch-test-s3-account-a/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "[アカウントAのアカウントID]"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags",
"s3:ObjectOwnerOverrideToBucketOwner"
],
"Resource": [
"arn:aws:s3:::batch-test-s3-account-b",
"arn:aws:s3:::batch-test-s3-account-b/*"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "[アカウントBのアカウントID]"
}
}
},
{
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Effect": "Allow",
"Condition": {
"StringLike": {
"kms:ViaService": "s3.ap-northeast-1.amazonaws.com",
"kms:EncryptionContext:aws:s3:arn": [
"arn:aws:s3:::batch-test-s3-account-b",
"arn:aws:s3:::batch-test-s3-account-a",
"arn:aws:s3:::batch-test-s3-account-b/*",
"arn:aws:s3:::batch-test-s3-account-a/*"
]
}
},
"Resource": "*"
}
]
}
【アカウントA】レプリケート機能用IAMロールの作成
IAMロール作成画面より、レプリケーションルールとバッチオペレーションのレプリケート機能用のIAMロールを以下のように設定します。
今回は通常のレプリケーションルールとバッチオペレーションのレプリケート機能両方で同じIAMロールを使用したいと思うので、PrincipalのServiceは以下のように2つのサービスを指定しています。
IAMロール名は任意の名前を指定し、アカウントIDやS3バケット名は環境により読み替えて作成してください。
また、IAMロール名は後ほど使用するため、名前を控えておいてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BatchOperationsReplication",
"Effect": "Allow",
"Principal": {
"Service": [
"batchoperations.s3.amazonaws.com",
"s3.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
IAMロールにアタッチするIAMポリシーは先程作成したレプリケート機能用IAMポリシーをアタッチしてください。
【アカウントB】レプリケート機能用バケットポリシー設定
アカウントAのレプリケーションルールとバッチオペレーションのレプリケート機能からアカウントBのS3バケットにアクセス出来るようにするため、アカウントBのS3バケットのバケットポリシーに以下のレプリケーション用設定を行います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BatchOperationsReplication",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[アカウントAのアカウントID]:role/[アカウントAのIAMロール]"
},
"Action": [
"s3:GetBucketVersioning",
"s3:PutBucketVersioning",
"s3:ReplicateObject",
"s3:ReplicateDelete"
],
"Resource": [
"arn:aws:s3:::batch-test-s3-account-b",
"arn:aws:s3:::batch-test-s3-account-b/*"
]
}
]
}
【アカウントA】S3レプリケーションルールの作成
アカウントAのS3バケットからアカウントBのS3バケットへレプリケーションするため、レプリケーションルールを作成します。
転送元となるアカウントAのS3(batch-test-s3-account-a)を選択し、「管理」タブから「レプリケーションルールを作成」を選択し、以下のように設定を行います。
ただし、有効状態でルールを作成すると、テスト用のファイルを格納した時点でレプリケーションルールにより、アカウントBのS3バケットにファイルがレプリケートされてしまうため、バッチオペレーションによるレプリケート機能を確認することができません。
そのため、今回は一旦無効状態でルールを作成し、テスト用ファイルを格納後、ルールを有効化して、バッチオペレーションを実行する流れで進めていきます。
| 項目 | 設定 | 備考 |
|---|---|---|
| レプリケーションルール名 | ※任意の名前を指定 | 任意の名前を指定 |
| ステータス | 無効 | 今回はバッチオペレーションの動作を確認するため、無効で作成する |
| 優先順位 | 0 | 入力できないため指定不可 |
| ソースバケット | batch-test-s3-account-a | 入力できないため指定不可 |
| ルールスコープを選択 | バケット内のすべてのオブジェクトに適用 | 今回はバケット内全てを対象とする |
| 送信先 | 別のアカウントのバケットを指定する | ー |
| アカウントID | ※転送先S3バケットのアカウントIDを指定 | ー |
| バケット名 | batch-test-s3-account-b | 転送先S3バケット名を指定 |
| 送信先リージョン | ap-northeast-1 | 入力できないため指定不可 |
| オブジェクト所有者を送信先バケット所有者に変更 | チェックする | 転送先S3の所有者に合わせるために有効化 |
| 既存のIAMロールから選択 | ※先ほど作成したIAMロールを指定 | 先ほど作成したIAMロールを指定 |
| 暗号化 | ※デフォルトのまま | 今回はデフォルト設定のままとする |
| 送信先ストレージクラス | ※デフォルトのまま | 今回はデフォルト設定のままとする |
| 追加のレプリケーションオプション | ※デフォルトのまま | 今回はデフォルト設定のままとする |
なお、レプリケーションルール作成時、以下のように既存オブジェクトをバッチオペレーションでレプリケートするかを聞かれますが、後ほどテスト用ファイルをアップロードしてからバッチオペレーションでレプリケートするため、「いいえ、既存のオブジェクトをレプリケートしません。」を選択します。
【アカウントA】テスト用ファイルアップロードとレプリケーションルール有効化
アカウントAのS3バケット(batch-test-s3-account-a)に適当なファイルをアップロードした後、「管理」タブの「レプリケーションルール」の「アクション」から先程無効状態で作成したレプリケーションルールを有効化します。
レプリケーションルールによるレプリケーションは、有効状態の場合にアップロードされたファイルが対象となるため、無効状態のときにアップロードされたファイルは、有効状態に戻したとしても自動的にレプリケーションされるようなことはありません。
対象外となったファイルをレプリケーションするため、バッチオペレーションのレプリケート機能を使用することで転送します。
【アカウントA】バッチオペレーション・レプリケートの実行
S3ダッシュボード画面の「バッチオペレーション」から、以下のジョブ設定を行い実行します。
| 項目 | 設定 | 備考 |
|---|---|---|
| オブジェクトリスト | レプリケーション設定に基づいてオブジェクトリストを生成 | レプリケーションする場合に選択 |
| ソースアカウント | このAWSアカウント | ー |
| ソース | s3://batch-test-s3-account-a | アカウントAの転送元S3バケット&プレフィックスを指定 |
| 次を含むオブジェクトキー | 空欄 | レプリケーションルールの条件に従う |
| 次で終わるオブジェクトキー | 空欄 | レプリケーションルールの条件に従う |
| オブジェクトメタデータフィルター | 空欄 | レプリケーションルールの条件に従う |
| オペレーション | レプリケート | ー |
| 説明 | ※適当な説明を記載 | 表示名となるためわかりやすい名前を指定 |
| 優先順位 | 10 | ※デフォルトのままとする |
| ジョブの実行方法を選択 | 準備ができたら実行 | 今回は即時実行とする |
| オブジェクトリストをマニフェストファイルとして保存 | チェックなし | 今回はマニフェストファイルを保存しない |
| 完了レポートの生成 | チェックなし | 今回はテストなので生成しない |
| IAMロールの選択方法 | 既存のIAMロールから選択 | ー |
| IAMロール | ※レプリケーション用IAMロール | レプリケーション用IAMロールを選択 |
正常に完了すれば、レプリケーションルールが無効状態時にアップロードされたファイルがアカウントBのS3バケット(batch-test-s3-account-b)にレプリケートされていることが確認出来るかと思います。
おわりに
バッチオペレーションを実行する場合、コピー機能、レプリケート機能、どちらを使用する場合でもIAMロールやバケットポリシーの設定が必要になることから、手軽に行えるものではありませんが、バッチオペレーションのコピー機能は知っていれば使う機会も多い機能だと思うので、今度使ってみようと思います。



