Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

S3バッチオペレーションでクロスアカウントへファイルをコピーする

はじめに

システム構築の際、環境を複数用意することが多いと思いますが、その時に既存環境から
新環境へデータを同期、またはコピーする上でS3バッチオペレーションが有用です。
今回は、クロスアカウントにおけるS3バッチオペレーションの実行方法と権限設定内容についてまとめます。
また今回の内容は、S3バケットのデフォルト暗号化が有効になった現在でもご利用いただけます。

構築

S3バッチオペレーション用ロールの作成(コピー元アカウント)

コピー元アカウントでS3バッチオペレーション用ロールを作成します。

・S3バッチオペレーション用のポリシー作成

以下権限を持つIAMポリシーを作成し、ここではポリシー名を「s3-batch-operation-policy」とします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:InitiateReplication"
            ],
            "Resource": [
                "arn:aws:s3:::replication-source-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetReplicationConfiguration",
                "s3:PutInventoryConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::replication-source-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::replication-destination-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::replication-destination-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::other-bucket",
                "arn:aws:s3:::other-bucket/path-to-report/*"
            ]
        }
    ]
}

バッチオペレーション実行時に完了レポートを出力させるため、「other-bucket」への権限も付与しています。
完了レポート出力先のバケット名、及びパスは、ご自身の環境に合わせて変更してください。

・S3バッチオペレーション用のロール作成

以下信頼ポリシーを設定し、上記で作成した「s3-batch-operation-policy」ポリシーをアタッチします。
ここでは、ロール名は「s3-batch-operation-role」とします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "batchoperations.s3.amazonaws.com",
                    "s3.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

S3レプリケーション用ロールの作成(コピー元アカウント)

コピー元アカウントでS3レプリケーション用ロールの作成を作成します。

・S3レプリケーション用のポリシー作成

以下権限を持つIAMポリシーを作成し、ここではポリシー名を「s3-replication-policy」とします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetReplicationConfiguration",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::replication-source-bucket"
            ]
        },
        {
            "Action": [
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::replication-source-bucket/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::replication-destination-bucket/*"
            ]
        }
    ]
}

・S3レプリケーション用のロール作成

以下信頼ポリシーを設定し、上記で作成した「s3-replication-policy」ポリシーをアタッチします。
ここでは、ロール名は「s3-replication-role」とします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

S3バケットポリシーの設定(コピー先アカウント)

コピー先アカウントで対象バケットに以下のS3バケットポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Set permissions for objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<コピー元AWSアカウントID>:role/s3-batch-operation-role",
                    "arn:aws:iam::<コピー元AWSアカウントID>:role/s3-replication-role"
                ]
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete"
            ],
            "Resource": "arn:aws:s3:::replication-destination-bucket/*"
        },
        {
            "Sid": "Set permissions on bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<コピー元AWSアカウントID>:role/s3-batch-operation-role",
                    "arn:aws:iam::<コピー元AWSアカウントID>:role/s3-replication-role"
                ]
            },
            "Action": [
                "s3:List*",
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::replication-destination-bucket"
        }
    ]
}

なお、コピー先のバケットは以下の設定である必要があります。

  • バケットバージョニングは有効
    • S3レプリケーションを使う場合に有効にする必要があります
  • 暗号化キータイプは「Amazon S3 マネージドキー (SSE-S3)」
    • 本手順はSSE-S3向けのため、AWS KMS (SSE-KMS) を利用する場合は、権限の修正が必要です

レプリケーションの設定

以下の順に操作し、S3レプリケーションを設定します。

  • S3ページからレプリケーション元のバケットを押下する
  • 「管理」タブから「レプリケーションルールを作成」を押下する
  • レプリケーションルール設定ページでは、以下内容を設定する
    • レプリケーションルール名:任意のルール名
    • ソースバケット設定
      • 「バケット内のすべてのオブジェクトに適用」をチェックする
    • 送信設定
      • 「別のアカウントのバケットを指定する」をチェックする
      • アカウントID:コピー先のAWSアカウントID
      • バケット名:コピー先のS3バケット名
      • 「オブジェクト所有者を送信先バケット所有者に変更」をチェックする
    • IAMロール
      • 「既存のIAMロールから選択」をチェックする
      • IAMロール:s3-replication-role
    • 暗号化
      • 「AWS KMSで暗号化されたオブジェクトをレプリケートする」はチェックしない
    • 送信先ストレージクラス
      • 必要に応じて設定する
    • 追加のレプリケーションオプション
      • 必要に応じて設定する
  • 上記を設定後、「保存」を押下する
  • 「保存」押下後、以下のようなダイアログが表示されるので、「はい」をチェックし、「送信」を押下する

  • バッチオペレーション設定画面に移るので、バッチオペレーションの設定はバッチオペレーションの設定と実行に記載する

バッチオペレーションの設定と実行

レプリケーションの設定の最後のダイアログで「はい」をチェックすると、バッチオペレーションジョブの設定ページに移ります。
以下手順でバッチオペレーションジョブの設定と実行を行います。

  • バッチオペレーションジョブ設定ページでは、以下内容を設定する
    • ジョブ設定
      • 「準備ができたらジョブを実行します」をチェックする
        • ※マニフェストやジョブ詳細を確認する場合は、「準備ができたら、ジョブの実行を待ちます」をチェックします
    • 完了レポート
      • 「完了レポートの生成」をチェックします
      • ここでは、「失敗したタスクのみ」をチェックします
      • 完了レポートの送信先へのパス:s3://other-bucket/path-to-report
        • ※ご自身の環境に合わせて完了レポート送信先パスを設定する
    • アクセス許可
      • 「既存のIAMロールから選択」をチェックする
      • IAMロール:s3-batch-operation-role
  • 上記設定後、「保存」を押下する
  • バッチオペレーションジョブの一覧ページに移り、追加したジョブステーションが「完了済み」になるのを待つ
  • ジョブが実行されたら、実行されたオブジェクトの完了、失敗(%)を確認して、全てのオブジェクトがコピーされたことを確認する
  • コピーに失敗しているオブジェクトがある場合は、S3に出力された完了レポートを確認し、コピーできなかったオブジェクトと原因を確認する

補足

・KMSによって暗号化されている場合は、KMSキーへのアクセス許可も必要です
・S3バッチオペレーションは、バッチジョブが失敗してもジョブ1回毎に料金が発生します
・完了レポートを設定しておくと、バッチ失敗時に理由が出力されますのでデバッグに便利です

おわりに

今回はクロスアカウントにおけるS3バッチオペレーションの実行方法と、必要な権限についてまとめました。
手順は複雑ではないですが、必要最低限の権限を設定しようとすると、何を設定すれば良いんだっけ?と
なることも多いと思いますので、参考になれば幸いです。

参考

1.許可のセットアップ https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/setting-repl-config-perm-overview.html

2.バッチレプリケーション用の IAM ポリシーの設定 https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/s3-batch-replication-policies.html